Menu
CoddyTech

בדיקת קרקע באמצעות קרן

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

קפיצה צריכה להתחיל רק מהקרקע. השיעור Standing on the Ground זיהה זאת לפי נורמלי המגע, שהתעדכנו באמצעות הודעות התנגשות. קרן עונה על השאלה "האם אני עומד על משהו?" במקום, בכל רגע: מטילים אותה ישר למטה מהמרכז, לאורך מעט גדול יותר מהמרחק מהמרכז לתחתית. השחקן הזה הוא כמוסה בגובה 2 יחידות, לכן התחתית שלו נמצאת יחידה אחת מתחת למרכז, ואורך הקרן הוא 1.1:

public float jumpForce = 5f;
private Rigidbody rb;

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

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
    {
        rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
    }
}

bool IsGrounded()
{
    return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}

התוספת של 0.1 היא מרווח ביטחון. גוף שנח על הרצפה עשוי להיות מעט מעליה או לשקוע מעט לתוכה, ולכן קרן באורך 1 בדיוק מפספסת בפריימים מסוימים. אורך גדול בהרבה שגוי בכיוון ההפוך: עם אורך 3, השחקן יכול לקפוץ שוב כשהוא נמצא 2 יחידות באוויר, ובלי אורך בכלל הקרן תמיד מוצאת את הרצפה, כך שכל לחיצה גורמת לקפיצה.

הקרן מתחילה בתוך הקוליידר של השחקן עצמו, שקרניים מדלגות עליו, ולכן היא לעולם לא מדווחת על השחקן. קוראים את המקש ב־Update(), כי GetKeyDown מחזיר true לפריים אחד בלבד, ואפשר להוסיף שם דחף חד־פעמי, כמו בשיעור Jump with an Impulse.

challenge icon

אתגר

בינוני

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

  • הוסף מתודה bool IsGrounded() שיורה קרן ישר כלפי מטה ממרכז הצפרדע. הצפרדע היא כדור שקנה המידה שלו 1.5, ולכן הרדיוס שלה הוא 0.75: הארך את הקרן עד 0.1 מעבר לתחתית שלה.
  • קפוץ רק כאשר לוחצים על מקש הרווח ו-IsGrounded() מחזירה true.

לחץ על הפעל ונסה לקפוץ פעמיים, ואז לחץ על בדיקה.

נסו בעצמכם

using UnityEngine;

public class Hopper : MonoBehaviour
{
    public float jumpForce = 6f;
    private Rigidbody rb;

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

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
        }
    }
}
quiz iconבחנו את עצמכם

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

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