Menu
CoddyTech

להישבר בעת פגיעה

חלק מהיחידה פיזיקה ומשחקיות במסלול ה-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.

challenge icon

אתגר

קל

כתבו את Window.cs: כל פגיעה מחלישה את החלון, והוא מתנפץ כשהחוזק מגיע ל־0.

  1. בפונקציה OnCollisionEnter של החלון, הפחיתו מ־strength את collision.relativeVelocity.magnitude.
  2. כאשר strength <= 0f, קראו ל־Destroy(gameObject);.

לחצו על "שחק", גלגלו כדורים חלשים באמצעות החץ למעלה, ואז כדור חזק באמצעות Space: החלון נשבר. לאחר מכן לחצו על "בדיקה".

נסו בעצמכם

using UnityEngine;

public class Window : MonoBehaviour
{
    public float strength = 10f;

    // כל פגיעה מפחיתה מ-strength את מהירות הפגיעה שלה; כשהערך מגיע ל-0 החלון מתנפץ
}

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

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