Menu
CoddyTech

RaycastHit

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

Physics.Raycast יכולה גם לומר לך במה היא פגעה. הוסף out RaycastHit hit אחרי הכיוון: כשהמתודה מחזירה true, היא מילאה את hit בפרטים. כך מתודת C# מחזירה ערך נוסף באמצעות משתנה שאתה נותן לה: out. מד הטווח הזה מתעד במה הוא מצביע וכמה רחוק זה נמצא, כשלוחצים על Space:

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 50f))
        {
            Debug.Log(hit.collider.name + " is " + hit.distance + " units away");
        }
    }
}

כשמצביעים על קיר שחלקו הקדמי נמצא במרחק של 12 יחידות, הוא מתעד Wall is 12 units away. שדות נוספים: hit.point הוא המקום בעולם שבו הקרן נגעה במשטח, hit.normal הוא הכיוון שאליו המשטח פונה באותו מקום ((0, 1, 0) על קרקע שטוחה), ו-hit.transform הוא ה-Transform של האובייקט שבו פגעת. דרך hit.collider.gameObject אפשר לגשת לכל מידע נוסף עליו, כמו התג שלו.

קרא את hit רק בתוך if. כשהקרן מחטיאה, Raycast מחזירה false ול-hit אין ערך שימושי: ה-collider שלו הוא null.

challenge icon

אתגר

בינוני

הוסף לאקדח כוונת לייזר: נקודה אדומה במקום שבו הלייזר פוגע.

  1. בתוך Update(), בצע Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, range).
  2. כשהוא פוגע, קרא ל־dot.gameObject.SetActive(true); והגדר dot.position = hit.point;.
  3. כשהוא מפספס, קרא ל־dot.gameObject.SetActive(false);.

לחץ על „שחק” וסובב את האקדח: הנקודה מחליקה על הקיר ועל הארגזים. לאחר מכן לחץ על „בדיקה”.

נסו בעצמכם

using UnityEngine;

public class LaserSight : MonoBehaviour
{
    public Transform dot;
    public float range = 15f;

    void Update()
    {
        // מקם את הנקודה במקום שבו הלייזר פוגע במשטח; הסתר אותה כשהלייזר לא פוגע בדבר.
    }
}

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

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