Menu
CoddyTech

FixedUpdate לפיזיקה

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

Unity מזיזה גופים בצעדי פיזיקה קבועים של 0.02 שניות (Time.fixedDeltaTime), 50 פעמים בשנייה, בלי קשר לקצב הפריימים. FixedUpdate() פועלת ממש לפני כל צעד. Update() פועלת פעם אחת בכל פריים שמצויר, וזה יכול לקרות 30, 60 או 144 פעמים בשנייה: בקצב של 144, ברוב הפריימים אין כלל צעד פיזיקה, ובמחשב איטי פריים אחד יכול להכיל שני צעדי פיזיקה.

מכאן נובעים שני כללים. כוח שמתווסף ב-Update() מתווסף פעם אחת בכל פריים, ולכן מחשב מהיר יותר דוחף חזק יותר: כוחות שפועלים לאורך זמן יש להוסיף ב-FixedUpdate(). בנוסף, GetKeyDown הוא true למשך פריים אחד בלבד; אם אין באותו פריים צעד פיזיקה, FixedUpdate() לא תזהה אותו והלחיצה תלך לאיבוד. לכן יש לקרוא את הלחיצות ב-Update(), לשמור אותן ב-bool ולפעול לפיהן ב-FixedUpdate(). הסירה הזאת נדחפת על ידי רוח קבועה ומזנקת הצידה בלחיצה:

private bool dashQueued;

void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        dashQueued = true;   // לזכור את הלחיצה
    }
}

void FixedUpdate()
{
    rb.AddForce(Vector3.forward * wind);   // דחיפה קבועה, בכל צעד
    if (dashQueued)
    {
        rb.AddForce(Vector3.right * 4f, ForceMode.Impulse);
        dashQueued = false;   // לחיצה אחת, זינוק אחד
    }
}

חשוב לאפס את הערך הבוליאני אחרי שמשתמשים בו: אם משאירים אותו על true, הסירה תזנק בכל צעד. אפשר גם להוסיף דחף יחיד ישירות מתוך Update(), כפי שעשינו בקפיצה של הצפרדע; הערך הבוליאני מרכז את כל הדחיפות במקום אחד, לצד הכוחות שהוא פועל איתם. מקשים שמוחזקים לחוצים (GetKey, GetAxis) מתארים מצב ולא רגע, ולכן FixedUpdate() יכולה לקרוא אותם ישירות. בתוך FixedUpdate(), הערך של Time.deltaTime הוא 0.02 של הצעד.

challenge icon

אתגר

קל

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

  1. העבירו את שני בלוקי ה־if של החצים מ־Update() אל FixedUpdate().
  2. הוסיפו private bool hopPressed;. בתוך Update(), הגדירו אותו ל־true בעת לחיצה על Input.GetKeyDown(KeyCode.Space).
  3. בתוך FixedUpdate(), כאשר hopPressed מוגדר, הוסיפו את הדחף, ואז הגדירו אותו ל־false.

לחצו על "שחק": החצים דוחפים באופן אחיד, וכל לחיצה על Space מקפיצה. לאחר מכן לחצו על "בדיקה".

נסו בעצמכם

using UnityEngine;

public class Sled : MonoBehaviour
{
    public float push = 6f;
    public float hop = 5f;
    private Rigidbody rb;

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

    void Update()
    {
        if (Input.GetKey(KeyCode.RightArrow))
        {
            rb.AddForce(Vector3.right * push);
        }
        if (Input.GetKey(KeyCode.LeftArrow))
        {
            rb.AddForce(Vector3.left * push);
        }
    }

    void FixedUpdate()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * hop, ForceMode.Impulse);
        }
    }
}

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

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