Physics.Raycast
חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 35 מתוך 71.
הטלת קרן שולחת קו בלתי נראה מנקודה בכיוון מסוים ומדווחת אם הוא פגע בקוליידר. Physics.Raycast(origin, direction, maxDistance) מחזירה true כשקוליידר נמצא על הקו במרחק של עד maxDistance יחידות, ו-false אחרת. המכונית הזאת בולמת כשיש משהו במרחק של פחות מ-2 יחידות לפני החזית שלה:
public float brakeDistance = 2f;
void Update()
{
if (Physics.Raycast(transform.position, transform.forward, brakeDistance))
{
Debug.Log("Brake!");
}
}transform.forward מסתובב יחד עם המכונית, כך שהקרן תמיד פונה קדימה מהחזית שלה; Vector3.forward תמיד היה מצביע לאורך ציר ה-z של העולם. הקרן מתחילה במרכז המכונית, בתוך הקוליידר שלה עצמה, וקרן אף פעם לא מדווחת על קוליידר שהיא מתחילה בתוכו, ולכן המכונית לא מזהה את עצמה. אם לא מציינים את maxDistance, הקרן ממשיכה לנצח: המכונית הייתה בולמת בגלל קיר שנמצא בצד השני של המפה.
קרניים מזהות קוליידרים, ולא את מה שמצויר: אובייקט עם Renderer וללא קוליידר אינו נראה להן, וקוליידר מסוג trigger נחשב לפגיעה. בזמן הבדיקה, Debug.DrawRay(transform.position, transform.forward * brakeDistance, Color.red) מציירת את הקרן בתצוגת Scene של Unity.
אתגר
בינוניפתח את דלת החנות כשמישהו עומד מתחת לחיישן.
- בתוך
Update(), בדוק אתPhysics.Raycast(transform.position, Vector3.down, reach): קרן ישרה כלפי מטה, באורךreachיחידות, שעוצרת מעל הקרקע. - אם התנאי מתקיים, קרא ל־
door.SetActive(false);, ובענףelse, ל־door.SetActive(true);.
לחץ על "שחק" והולך את המבקר מתחת לחיישן: הדלת נפתחת ונסגרת מאחוריו. אחר כך לחץ על "בדיקה".
נסו בעצמכם
using UnityEngine;
public class DoorSensor : MonoBehaviour
{
public GameObject door;
public float reach = 3f;
void Update()
{
// פתח את הדלת כל עוד הקרן היורדת מה-Sensor פוגעת במשהו.
}
}
כל השיעורים ביחידה פיזיקה ומשחקיות
1גוף קשיח
כוח הכבידה והמסהדחיפה באמצעות AddForceקפיצה באמצעות מתקףFixedUpdate לפיזיקהמהירותגופים קינמטייםחזרה: משטח שיגור2התנגשויות
OnCollisionEnterבמה פגעתי?להישבר בעת פגיעהלעמוד על הקרקעניתור וחיכוךצורות Colliderסיכום: קיר שביר5פרויקט: מרוץ המטבעות
הכדור המתגלגלמטבעות לאיסוףתרגלו בעצמכם: Unity אונליין