Menu
CoddyTech

Update ו-LateUpdate

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

בכל פריים Unity קוראת ל־Update() בכל סקריפט, ורק אחרי שכולם מסיימים היא קוראת ל־LateUpdate() בכל סקריפט. הסדר שבו נקראת Update() של כל אובייקט אינו נתון לבחירתך.

הדבר חשוב לכל מה שתלוי במשהו אחר. מצלמה שמעתיקה את המיקום של השחקן ב־Update() עשויה לפעול לפני שה־Update() של השחקן עצמו הזיז אותו, ואז היא מעתיקה את המקום שבו השחקן היה לפני פריים אחד: המצלמה משתרכת צעד מאחור, והשאלה אם זה יקרה עשויה להשתנות כשמוסיפים אובייקטים או טוענים מחדש את הסצנה. ב־LateUpdate() ההעתקה מתבצעת תמיד אחרי שהשחקן זז:

public Transform player;
public Vector3 offset = new Vector3(0, 3, -6);

void LateUpdate()
{
    transform.position = player.position + offset;
}

הכלל: מזיזים דברים ב־Update(), וממקמים קוד שמגיב למיקום שאליו דברים הגיעו, כגון מצלמות, תוויות וכיוון, ב־LateUpdate(). שניהם רצים פעם אחת בכל פריים, ו־Time.deltaTime פירושו אותו הדבר בשניהם.

challenge icon

אתגר

בינוני

מקם את תג השם בדיוק מעל השחקן בכל פריים.

  1. הוסף void LateUpdate(), שפועלת אחרי Update() של כל סקריפט.
  2. העבר את החלק if (target != null) לתוכה, והשאר ב־Update() רק את תנועת החצים, תחת if (target == null).

לחץ על "שחק" והחזק מקש חץ: התג נשאר בדיוק מעל השחקן. לאחר מכן לחץ על "בדיקה".

נסו בעצמכם

using UnityEngine;

public class Mover : MonoBehaviour
{
    public Transform target;
    public Vector3 offset;
    public float speed = 4f;

    void Update()
    {
        if (target != null)
        {
            transform.position = target.position + offset;
        }
        else
        {
            if (Input.GetKey(KeyCode.RightArrow))
            {
                transform.position += new Vector3(speed * Time.deltaTime, 0, 0);
            }
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                transform.position -= new Vector3(speed * Time.deltaTime, 0, 0);
            }
        }
    }
}

כל השיעורים ביחידה יסודות הסקריפטים ב-Unity

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