רדיפה בטווח
חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 51 מתוך 63.
רוב האויבים מניחים לך לנפשך עד שמתקרבים אליהם. מדדי את המרחק לשחקן בכל צעד פיזיקה, ורדפי אחריו רק בתוך טווח מסוים. הסליים הזה רודף אחריך בתוך sightRange ועומד במקום מחוץ לטווח הזה:
void FixedUpdate()
{
Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
if (toPlayer.magnitude < sightRange)
{
Vector3 dir = toPlayer.normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}
else
{
rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);
}
}ה־else חשוב: גוף קשיח שומר על המהירות שלו עד שמשהו משנה אותה. בלעדיו, סליים שמאבד אותך ימשיך להחליק עד שהחיכוך יעצור אותו, ועל קרח הוא לא יעצור לעולם. מכיוון שהערך של y נקבע תחילה ל־0, toPlayer.magnitude הוא המרחק לאורך הקרקע, ולכן שחקן שעומד על ארגז ליד הסליים עדיין נחשב כמי שנמצא לידו.
לטווח אחד יש נקודת תורפה. שחקן שעומד על הגבול שלו נסחף פנימה והחוצה ממנו, והסליים מתחיל ונעצר שוב ושוב. אויבים נמנעים מכך באמצעות שני טווחים: הם מבחינים בשחקן בתוך הטווח הקצר, ומוותרים על המרדף רק כשהוא מעבר לטווח הארוך יותר. משתנה bool זוכר אם האויב רודף, ובין שני הטווחים שום דבר לא משנה אותו, ולכן האויב ממשיך לעשות את מה שעשה.
אתגר
בינוניזאב צד ביער. כתוב את הסקריפט Wolf עבור הזאב. ב-Inspector נותנים לו player, speed (3), noticeRange (4) ו-giveUpRange (8). הסקריפט Player מוכן.
- שדה
boolבשםchasingמציין אם הזאב רודף. ערכו ההתחלתי הואfalse. - בכל צעד פיזיקה, מדוד את המרחק לשחקן לאורך הקרקע (ללא גובה). כשהמרחק קטן מ-
noticeRange: הערך שלchasingהופך ל-true. כשהמרחק גדול מ-giveUpRange: הוא הופך ל-false. בין לבין, הוא נשאר כפי שהוא. - בזמן שהזאב רודף, הוא רץ אל השחקן במהירות
speedבאמצעות ה-Rigidbody שלו, תוך שמירה על מהירות ה-y שלו. אחרת הוא עומד במקום: מהירות ה-x וה-z היא 0.
לחץ על Play, התקרב אל הזאב וברח ממנו, ואז לחץ על Check.
נסו בעצמכם
using UnityEngine;
public class Wolf : MonoBehaviour
{
[SerializeField] private Transform player;
[SerializeField] private float speed = 3f;
[SerializeField] private float noticeRange = 4f;
[SerializeField] private float giveUpRange = 8f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// לזהות את השחקן, להפסיק לרדוף אחריו, ואז לרדוף או לעמוד במקום
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה פיזיקה ומשחקיות
1גוף קשיח
כוח הכבידה והמסהדחיפה באמצעות AddForceקפיצה באמצעות מתקףFixedUpdate לפיזיקהמהירותגופים קינמטייםחזרה: משטח שיגור2התנגשויות
OnCollisionEnterבמה פגעתי?להישבר בעת פגיעהלעמוד על הקרקעניתור וחיכוךצורות Colliderסיכום: קיר שביר5פרויקט: מרוץ המטבעות
הכדור המתגלגלמטבעות לאיסוף