Menu
CoddyTech

רדוף אחרי השחקן

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

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

[SerializeField] private Transform player;
[SerializeField] private float speed = 2.5f;
private Rigidbody rb;

void Start()
{
    rb = GetComponent<Rigidbody>();
}

void FixedUpdate()
{
    Vector3 toPlayer = player.position - rb.position;
    toPlayer.y = 0f;
    Vector3 dir = toPlayer.normalized;
    rb.linearVelocity = new Vector3(dir.x * speed, rb.linearVelocity.y, dir.z * speed);
}

player.position - rb.position מצביע מהזומבי אל השחקן. ערך ה-y שלו מוגדר ל-0, כך שהזומבי הולך במישור כשהשחקן עומד גבוה או נמוך יותר, ו-normalized נותן לו אורך 1, כך שהזומבי הולך במהירות speed בין שהשחקן במרחק 2 יחידות ובין שהוא במרחק 20. המהירות החדשה שומרת על מהירות ה-y הישנה, כך שכוח הכבידה עדיין מושך את הזומבי מטה כשהוא יורד ממדרגה. ב-Rigidbody שלו מופעל Freeze Rotation, כך שהוא לא מתהפך תוך כדי הליכה.

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

Vector3 toPlayer = player.position - rb.position;
toPlayer.y = 0f;
rb.AddForce(toPlayer.normalized * push);

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

challenge icon

אתגר

בינוני

גרום לסלע להתגלגל בעקבות השחקן.

  1. ב־FixedUpdate(), הגדר Vector3 toPlayer = player.position - rb.position; ואת toPlayer.y = 0f;, כדי שהדחיפה תישאר לאורך הקרקע.
  2. קרא ל־rb.AddForce(toPlayer.normalized * force);, אותה דחיפה מקרוב או מרחוק. השאר את הסיבוב שלו חופשי, כדי שהחיכוך יגרום לו להתגלגל.

לחץ על "שחק" ורוץ במעגלים סביב הסלע. לאחר מכן לחץ על "בדיקה".

נסו בעצמכם

using UnityEngine;

public class Boulder : MonoBehaviour
{
    [SerializeField] private Transform player;
    [SerializeField] private float force = 6f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // דחוף את הסלע לכיוון השחקן, לאורך הקרקע
    }
}

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

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