Menu
CoddyTech

סיור ורדיפה

חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 52 מתוך 63.

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

אתגר

בינוני

רובוט אבטחה מסייר במחסן. כתוב את הסקריפט Robot. ה-Inspector נותן לו waypoints (ארבעת הסמנים הצהובים W0 עד W3, לפי הסדר), player, speed (4) ו-chaseRange (4). הסקריפט Player מוכן.

  • שדה int בשם next, שמתחיל ב-0, הוא האינדקס של נקודת הציון שאליה הרובוט צועד.
  • סיור: צעד אל waypoints[next]. ברגע שהרובוט קרוב אליה יותר מ-0.2 לאורך הקרקע, העבר את next לנקודת הציון הבאה, ואחרי האחרונה חזור ל-0.
  • מרדף: כל עוד השחקן קרוב יותר מ-chaseRange לאורך הקרקע, צעד אל השחקן במקום זאת.
  • כשהשחקן מתרחק, המשך אל waypoints[next], נקודת הציון שאליה הרובוט היה בדרכו.
  • הזז את הרובוט באמצעות הגדרת המהירות של Rigidbody ל-speed לאורך הקרקע, תוך שמירה על מהירות ה-y שלו.

לחץ על Play, צפה בסיבוב אחד של הסיור וחצה את מסלולו, ואז לחץ על Check.

נסו בעצמכם

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()
    {
        // רדוף אחרי השחקן כשהוא קרוב, או נוע במסלול הסיור
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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