Menu
CoddyTech

רדיפה בטווח

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

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

לטווח אחד יש נקודת תורפה. שחקן שעומד על הגבול שלו נסחף פנימה והחוצה ממנו, והסליים מתחיל ונעצר שוב ושוב. אויבים נמנעים מכך באמצעות שני טווחים: הם מבחינים בשחקן כשהוא בתוך טווח קצר, ומוותרים רק כשהוא מעבר לטווח ארוך יותר. ערך bool זוכר אם האויב רודף, ובין שני הטווחים שום דבר לא משנה אותו, כך שהאויב ממשיך לעשות את מה שעשה.

challenge icon

אתגר

בינוני

גרמו לזאב להבחין בשחקן מקרוב ולוותר כשהוא רחוק.

  1. ב־FixedUpdate(), חשבו את המרחק האופקי לשחקן: כשהוא קטן מ־noticeRange, הגדירו את השדה bool chasing לערך true; כשהוא גדול מ־giveUpRange, הגדירו אותו לערך false.
  2. בזמן chasing, הגדירו את rb.linearVelocity כך שינוע לעבר השחקן במהירות speed, תוך שמירה על ערך y.
  3. אחרת, הגדירו את rb.linearVelocity = new Vector3(0f, rb.linearVelocity.y, 0f);.

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

נסו בעצמכם

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

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

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