Menu
CoddyTech

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

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

לכל מגע יש נורמל: כיוון באורך 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

אתגר

קל

השחקן יכול ללכת ולקפוץ, אבל מקש הרווח פועל גם באוויר, כך שהוא יכול לטפס לשמיים בקפיצה אחת בכל פעם ולקפוץ מהצד של הקיר. (לקוליידר שלו יש חומר נטול חיכוך, ולכן הוא מחליק במורד הקירות במקום להיצמד אליהם.) יש לגרום לו לקפוץ רק כשהוא עומד על משהו.

  • יש לשמור משתנה bool grounded: הערך שלו true כשהשחקן נוגע במשהו שנורמל המגע שלו פונה כלפי מעלה (y מעל 0.5), ו-false ברגע שהוא מפסיק לגעת בו.
  • יש לקפוץ רק כאשר מקש הרווח נלחץ והערך של grounded הוא true. לחיצה באוויר מתעלמים ממנה ולא שומרים אותה עד הנחיתה.

לחצו על Play, נסו לקפוץ פעמיים ולטפס על הקיר, ואז לחצו על Check.

נסו בעצמכם

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;
        }
    }
}
quiz iconבחנו את עצמכם

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

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