Menu
CoddyTech

סיור ורדיפה

חלק מהיחידה פיזיקה ומשחקיות במסלול ה-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 יחידות בכל צעד וכמעט לעולם לא מגיע בדיוק לעמדה.

challenge icon

אתגר

בינוני

גרום לרובוט לסייר בנקודות הציון שלו ולרדוף אחרי השחקן שמתקרב.

  1. כתוב את WalkTo(Vector3 target), והגדר את rb.linearVelocity כך שינוע אליו על פני הקרקע במהירות speed, תוך שמירה על מהירות ה-y שלו.
  2. ב-FixedUpdate(), כשהשחקן קרוב יותר מ-chaseRange, קרא ל-WalkTo(player.position) ואז ל-return.
  3. אחרת, כשהמרחק מ-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()
    {
        // רדוף אחרי השחקן כשהוא קרוב, או נוע במסלול הסיור
    }
}

כל השיעורים ביחידה פיזיקה ומשחקיות

תרגלו בעצמכם: Unity אונליין