להישבר בעת פגיעה
חלק מהיחידה פיזיקה ומשחקיות במסלול ה-Unity של Coddy. שיעור 10 מתוך 71.
כמה חזקה הייתה הפגיעה? collision.relativeVelocity הוא המהירות שבה שני העצמים התקרבו זה לזה ברגע ההתנגשות, והערך של magnitude הוא מהירות הפגיעה במטרים לשנייה. זו הפרש בין מהירויות: מכונית שנוסעת במהירות 10 מטרים לשנייה ופוגעת במכונית שנוסעת באותו כיוון במהירות 8 מטרים לשנייה פוגעת במהירות של 2 מטרים לשנייה בלבד, ושתי המכוניות חוות אותה מהירות פגיעה.
הביצה הזאת נשברת כשהיא נוחתת במהירות גבוהה מ-crackSpeed. כשמפילים אותה מגובה 1 מטר, היא פוגעת במהירות של כ-4.4 מטרים לשנייה (השורש הריבועי של 2 x 9.81 x 1), ומגובה 2 מטרים במהירות של כ-6.3 מטרים לשנייה:
public float crackSpeed = 5f;
void OnCollisionEnter(Collision collision)
{
if (collision.relativeVelocity.magnitude > crackSpeed)
{
Debug.Log("Splat!");
Destroy(gameObject);
}
}למה לא להשתמש ב-rb.linearVelocity של הביצה עצמה? עד ש-OnCollisionEnter מופעלת, מערכת הפיזיקה כבר טיפלה בפגיעה, ולכן מהירות הביצה היא המהירות שנותרה אחריה, והיא קרובה לאפס. relativeVelocity שומרת את מהירות הפגיעה עצמה. זו מהירות, ולכן למסה אין השפעה: ביצה כבדה וביצה קלה שנוחתות במהירות של 6 מטרים לשנייה מדווחות על אותה מהירות — 6.
אתגר
קלכתבו את Window.cs: כל פגיעה מחלישה את החלון, והוא מתנפץ כשהחוזק מגיע ל־0.
- בפונקציה
OnCollisionEnterשל החלון, הפחיתו מ־strengthאתcollision.relativeVelocity.magnitude. - כאשר
strength <= 0f, קראו ל־Destroy(gameObject);.
לחצו על "שחק", גלגלו כדורים חלשים באמצעות החץ למעלה, ואז כדור חזק באמצעות Space: החלון נשבר. לאחר מכן לחצו על "בדיקה".
נסו בעצמכם
using UnityEngine;
public class Window : MonoBehaviour
{
public float strength = 10f;
// כל פגיעה מפחיתה מ-strength את מהירות הפגיעה שלה; כשהערך מגיע ל-0 החלון מתנפץ
}
כל השיעורים ביחידה פיזיקה ומשחקיות
1גוף קשיח
כוח הכבידה והמסהדחיפה באמצעות AddForceקפיצה באמצעות מתקףFixedUpdate לפיזיקהמהירותגופים קינמטייםחזרה: משטח שיגור2התנגשויות
OnCollisionEnterבמה פגעתי?להישבר בעת פגיעהלעמוד על הקרקעניתור וחיכוךצורות Colliderסיכום: קיר שביר5פרויקט: מרוץ המטבעות
הכדור המתגלגלמטבעות לאיסוףתרגלו בעצמכם: Unity אונליין