Menu
CoddyTech

לעמוד על הקרקע

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

לכל מגע יש נורמל: כיוון שאורכו 1, מאונך למשטח שנגעת בו ומצביע ממנו אל עבר האובייקט שלך. collision.GetContact(0) היא נקודת המגע הראשונה, וה-normal שלה מציין באיזה צד נגעת. בעמידה על קרקע שטוחה הוא (0, 1, 0); מול קיר שמימינך הוא (-1, 0, 0); ובחבטת הראש בתקרה הוא (0, -1, 0).

הארגז הזה מבחין בין נחיתות לבין חבטות מהצד:

void OnCollisionEnter(Collision collision)
{
    Vector3 normal = collision.GetContact(0).normal;
    if (normal.y > 0.5f)
    {
        Debug.Log("Landed on " + collision.gameObject.name);
    }
    else
    {
        Debug.Log("Bumped the side of " + collision.gameObject.name);
    }
}

הבדיקה היא normal.y > 0.5f ולא בדיוק 1, כדי שגם מדרונות ייחשבו לקרקע: ערך y הוא 0.5 במדרון של 60 מעלות, תלול יותר מכל מדרון שאנשים עולים בו בהליכה. שתי הודעות נוספות עוזרות בכל דבר שנמשך: OnCollisionStay מופעלת בכל צעד פיזיקה כל עוד המגע נמשך, ו-OnCollisionExit מופעלת פעם אחת כשהוא מסתיים. ביציאה אין נקודות מגע, כי שום דבר כבר לא נוגע, לכן אל תקרא ל-GetContact שם.

challenge icon

אתגר

קל

אפשר לשחקן לקפוץ רק כשהוא עומד על משהו.

  1. הוסף private bool grounded;. בתוך OnCollisionStay, הגדר אותו ל-true כאשר collision.GetContact(0).normal.y > 0.5f; בתוך OnCollisionExit, הגדר אותו ל-false.
  2. בתוך FixedUpdate(), קפוץ רק אם if (jumpPressed && grounded), והגדר jumpPressed = false; אחרי ה-if הזה, כדי שלחיצה באוויר תתבטל.

לחץ על "שחק" ונסה לקפוץ פעמיים: הלחיצה השנייה לא תעשה דבר. ואז לחץ על "בדיקה".

נסו בעצמכם

using UnityEngine;

public class Hopper : MonoBehaviour
{
    public float speed = 4f;
    public float jump = 6f;
    private Rigidbody rb;
    private bool jumpPressed;

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

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            jumpPressed = true;
        }
    }

    void FixedUpdate()
    {
        float h = Input.GetAxisRaw("Horizontal");
        rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
        if (jumpPressed)
        {
            rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
            jumpPressed = false;
        }
    }
}

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

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