Menu
CoddyTech

קפיצה

חלק מהיחידה בונים משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 39 מתוך 56.

קפיצה היא מהירות אנכית שנקבעת פעם אחת, ברגע שלוחצים על Space; כוח הכבידה שהתסריט כבר מוסיף מאט את העלייה, עוצר אותה בנקודה הגבוהה ביותר ומחזיר את הבקר למטה. מה שנותר הוא מהירות ההתחלה עבור גובה נתון. כוח הכבידה מפחית את המהירות בקצב קבוע, ולכן קפיצה שמתחילה במהירות v עולה v * v / (2 * g) יחידות לפני שהיא נעצרת. אם נהפוך את הנוסחה, מהירות ההתחלה עבור גובה h היא v = √(2 * g * h).

כאשר gravity נשמר כמספר שלילי, -20, והקפיצה היא לגובה 2.5 יחידות, נקבל Mathf.Sqrt(2.5f * -2f * -20f), השורש הריבועי של 100: 10 יחידות לשנייה. -2f הופך את כוח הכבידה השלילי לחיובי, מכיוון שהשורש הריבועי של מספר שלילי הוא NaN:

if (controller.isGrounded && verticalSpeed < 0f)
{
    verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
    verticalSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
verticalSpeed += gravity * Time.deltaTime;

תנאי האיפוס בודק verticalSpeed < 0f, ולכן הוא מסיים רק נפילות: איפוס פשוט של if (controller.isGrounded) אחרי שורת הקפיצה ידרוס את מהירות הקפיצה בפריים שבו מתבצעת הקפיצה. הבדיקה controller.isGrounded בקפיצה מונעת קפיצות באוויר. שנה את jumpHeight או את gravity בחלון Inspector, והקפיצה עדיין תגיע בדיוק לגובה jumpHeight, בעוד שמהירות קבועה כמו verticalSpeed = 8f תגיע לגובה שונה עבור כל ערך של כוח הכבידה.

challenge icon

אתגר

בינוני

שני קופצים מריצים את אותו Jumper.cs: הילד, שב-Inspector שלו מוגדרים gravity לערך -18 ו-jumpHeight לערך 1, והקנגורו, עם gravity בערך -8 ו-jumpHeight בערך 4. לחיצה על מקש הרווח מגדירה את verticalSpeed לערך 9, מספר שנמצא בניסוי וטעייה: הוא לא מתאים לאף אחד מהקופצים, והוא עובד גם באוויר. תקן את הקפיצה:

  • לחיצה על מקש הרווח מתחילה קפיצה שמגיעה בדיוק לגובה jumpHeight, כשהגובה מחושב לפי jumpHeight ו-gravity של כל קופץ.
  • רק קופץ שנמצא על הקרקע יכול לקפוץ.

לחץ על Play וקפוץ, ואז לחץ על Check.

נסו בעצמכם

using UnityEngine;

public class Jumper : MonoBehaviour
{
    public float speed = 5f;
    public float gravity = -18f;
    public float jumpHeight = 1f;

    CharacterController controller;
    float verticalSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (controller.isGrounded && verticalSpeed < 0f)
        {
            verticalSpeed = -2f;
        }
        if (Input.GetButtonDown("Jump"))
        {
            verticalSpeed = 9f;
        }
        verticalSpeed += gravity * Time.deltaTime;

        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה בונים משחקים אמיתיים