סיור ורדיפה
חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 54 מתוך 71.
שומר בסיור צועד במסלול עד שהוא רואה את השחקן, רודף אחריו וחוזר למסלול שלו ברגע שהשחקן נעלם. שתי ההתנהגויות נעות באותו אופן, לעבר נקודה, ולכן שיטה אחת יכולה לבצע את ההליכה עבור שתיהן. השומר הזה צועד הלוך ושוב בין שתי עמדות ורודף אחרי השחקן כשהוא בטווח chaseRange:
[SerializeField] private Transform pointA;
[SerializeField] private Transform pointB;
[SerializeField] private Transform player;
[SerializeField] private float speed = 2f;
[SerializeField] private float chaseRange = 5f;
private Rigidbody rb;
private Transform goal;
void Start()
{
rb = GetComponent<Rigidbody>();
goal = pointA;
}
void FixedUpdate()
{
if (Flat(player.position - rb.position).magnitude < chaseRange)
{
WalkTo(player.position);
return;
}
if (Flat(goal.position - rb.position).magnitude < 0.2f)
{
goal = goal == pointA ? pointB : pointA;
}
WalkTo(goal.position);
}
void WalkTo(Vector3 target)
{
Vector3 dir = Flat(target - rb.position).normalized;
rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}
Vector3 Flat(Vector3 v)
{
return new Vector3(v.x, 0f, v.z);
}בדיקת המרדף מתבצעת ראשונה, והפקודה return מדלגת על קוד הסיור, כך שהמרדף מקבל עדיפות בכל פעם שהשחקן קרוב. goal הוא שדה, ולכן השומר זוכר אותו גם במהלך מרדף: ברגע שהשחקן נעלם, הוא ממשיך לעמדה שאליה היה בדרכו.
בדיקת ההגעה מודדת לאורך הקרקע. העמדות הן סמנים על הרצפה, ומרכז השומר נמצא יחידה אחת מעליהן, לכן מרחק שכולל את הגובה לעולם לא יירד מתחת ל־1, והשומר לעולם לא יסתובב. הבדיקה דורשת מרחק קטן מ־0.2, ולא בדיוק 0: במהירות של 2 יחידות לשנייה, השומר נע 0.04 יחידות בכל צעד וכמעט לעולם לא מגיע בדיוק לעמדה.
אתגר
בינוניגרום לרובוט לסייר בנקודות הציון שלו ולרדוף אחרי השחקן שמתקרב.
- כתוב את
WalkTo(Vector3 target), והגדר אתrb.linearVelocityכך שינוע אליו על פני הקרקע במהירותspeed, תוך שמירה על מהירות ה-y שלו. - ב-
FixedUpdate(), כשהשחקן קרוב יותר מ-chaseRange, קרא ל-WalkTo(player.position)ואז ל-return. - אחרת, כשהמרחק מ-
waypoints[next]קטן מ-0.2, הגדר אתnext = (next + 1) % waypoints.Length;, ואז צעד אלwaypoints[next].
לחץ על שחק וחצה את דרכו. לאחר מכן לחץ על בדיקה.
נסו בעצמכם
using UnityEngine;
public class Robot : MonoBehaviour
{
[SerializeField] private Transform[] waypoints;
[SerializeField] private Transform player;
[SerializeField] private float speed = 4f;
[SerializeField] private float chaseRange = 4f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
// רדוף אחרי השחקן כשהוא קרוב, או נוע במסלול הסיור
}
}
כל השיעורים ביחידה פיזיקה ומשחקיות
1גוף קשיח
כוח הכבידה והמסהדחיפה באמצעות AddForceקפיצה באמצעות מתקףFixedUpdate לפיזיקהמהירותגופים קינמטייםחזרה: משטח שיגור2התנגשויות
OnCollisionEnterבמה פגעתי?להישבר בעת פגיעהלעמוד על הקרקעניתור וחיכוךצורות Colliderסיכום: קיר שביר5פרויקט: מרוץ המטבעות
הכדור המתגלגלמטבעות לאיסוףתרגלו בעצמכם: Unity אונליין