Menu
CoddyTech

קפיצה

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

קפיצה היא מהירות אנכית שנקבעת פעם אחת, ברגע שלוחצים על 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

אתגר

בינוני

התאם סקריפט קפיצה אחד גם לילד וגם לקנגורו.

  1. ב־Update(), החלף את 9f ב־Mathf.Sqrt(jumpHeight * -2f * gravity), מהירות ההתחלה שגורמת לעלייה בדיוק של jumpHeight.
  2. הוסף && controller.isGrounded לתנאי ה־if של הקפיצה, כדי שלא תהיה קפיצה באוויר.

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

נסו בעצמכם

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);
    }
}

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

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