קביעה אם עצמים מתנגשים זה בזה (דו-ממד)

עודכן דף :
תאריך יצירת דף :

סביבת אימות

חלונות
  • חלונות 11
עורך Unity
  • 2021.3.3F1
חבילת מערכת קלט
  • 1.3.0

תנאים מוקדמים לטיפ זה

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

בהתחלה

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

הכנה

לאחר יצירת הפרויקט, להכין שתי תמונות של ספרייט כי יהיה האובייקט. אם אתם מתקשים להכין, תוכלו להניח שני שדונים זהים, אך הפעם נפריד ביניהם לשם הבהירות. השמות הם "UnityTips" ו-"UnityTips_2" בהתאמה.

הוסף שני קובצי תמונה על-ידי שחרורם בתצוגה.

הוסף קובץ Script כדי להזיז את האובייקט השמאלי באמצעות לוח המקשים. שם Player הסקריפט הוא . תוכן הסקריפט דומה לעצות ב'הזזה', 'סיבוב' ו'שינוי קנה מידה של ספרייט'.

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;
    if (keyboard == null)
    {
      Debug.Log("キーボードがありません。");
      return;
    }

    // スプライトの移動処理
    // Translate メソッドでスプライトの位置が移動します
    // Space.World を指定すると回転の影響をうけません
    if (keyboard.leftArrowKey.isPressed)
    {
      transform.Translate(-0.1f, 0, 0, Space.World);
    }
    if (keyboard.rightArrowKey.isPressed)
    {
      transform.Translate(0.1f, 0, 0, Space.World);
    }
    if (keyboard.upArrowKey.isPressed)
    {
      transform.Translate(0, 0.1f, 0, Space.World);
    }
    if (keyboard.downArrowKey.isPressed)
    {
      transform.Translate(0, -0.1f, 0, Space.World);
    }
  }
}

צרף לאובייקט שבו ברצונך להפעיל את קובץ ה- Script.

הפעל את המשחק ובדוק אם הוא פועל עם מקשי הסמן בלוח המקשים.

לבסוף, מקם אובייקט טקסט כדי להציג את מצב זיהוי ההתנגשות. שם TextState האובייקט הוא .

הגדרות טיפול בהתנגשות

מכאן, תוכל להגדיר את ההגדרות הקשורות להתנגשויות.

ראשית, בחר את האובייקט שברצונך להעביר, "UnityTips", ולחץ על "הוסף רכיב" מהמפקח. בחר מתוך Physics 2D הרשימה. Physics הוא אובייקט תלת ממדי, אז אל תטעו.

Physics 2DBox Collider 2D בחר מתוך . מכיוון שספרייט זה הוא מלבני, התיבה נבחרת, אך אם היא בצורת עיגול, לדוגמה, בחר צורות אחרות כגון עיגול.

Box Collider 2D מאז הרכיב יתווסף, לבדוק "לעשות את זה להפעיל" מתוך הפרמטרים. זה יאפשר לך לקבל מידע רק על "אם אתה מכה או לא".

Rigidbody 2D לאחר מכן הוסף את הרכיבים של . אתה יכול להוסיף אותו מ "פיזיקה 2D -> Rigidbody 2D". Rigidbody נותן מידעCollider פיזיקלי לאובייקט ויכול גם לקבוע התנגשויות עם עצמים שיש להם .

Rigidbody עם זאת, אם יש לך רכיב, הוא יכיל גם מידע כבידה בכיוון -Y, כך שאם תבצע אותו, הוא ייפול. אז להגדיר את "סולם הכבידה" ל 0 מן הפרמטרים.

אגב, אם זה משחק פעולה גלילה צד, זה עשוי להיות נוח להשתמש בסולם הכבידה במובן זה שהוא נפילה חופשית למטה.

באופן דומה, הוסף רכיב לאובייקט האחר Box Collider 2D "UnityTips_2". זהו הצד המושפע הפעם, כך שאינך צריך לשנות הגדרות כלשהן.

Player פתח את הסקריפט והוסף כל שדה ושיטה באמצעות הפעולות הבאות:

using System;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class Player : MonoBehaviour
{
  /// <summary>状態表示用テキストオブジェクト。</summary>
  [SerializeField] private Text TextState;

  // 中略

  /// <summary>衝突した瞬間に呼ばれます。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnTriggerEnter2D(Collider2D partner)
  {
    TextState.text = $"OnTriggerEnter2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnTriggerStay2D(Collider2D partner)
  {
    TextState.text = $"OnTriggerStay2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

  /// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
  /// <param name="partner">衝突した相手のコリジョン情報。</param>
  private void OnTriggerExit2D(Collider2D partner)
  {
    TextState.text = $"OnTriggerExit2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }
}

מכיוון שברצוננו להציג מידע אם הוא נפגע או לא, נאפשר להציג אותו באובייקט טקסט באופן הבא.

/// <summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;

תהליך זיהוי ההתנגשות מתואר כדלקמן.

/// <summary>衝突した瞬間に呼ばれます。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerEnter2D(Collider2D partner)
{
  TextState.text = $"OnTriggerEnter2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerStay2D(Collider2D partner)
{
  TextState.text = $"OnTriggerStay2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

/// <summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
/// <param name="partner">衝突した相手のコリジョン情報。</param>
private void OnTriggerExit2D(Collider2D partner)
{
  TextState.text = $"OnTriggerExit2D : {partner.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}

Rigidbody 2D כל אחד מהאירועים הנ"ל מתרחש כאשר אובייקט שיש לו מתנגש עם אובייקט Collider 2D אחר שיש לו . זה יאפשר לך לקבוע ולעבד אם זה נכון או לא.

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

OnTriggerEnter2D כאשר חפצים פוגעים זה בזה
OnTriggerStay2D בזמן שחפצים פוגעים זה בזה
OnTriggerExit2D כאשר עצמים עוזבים את מצב ההתנגשות

בשני המקרים, האובייקט היריב מקבל את האובייקט של היריב כטיעון, כך שאתה יכול להשיג את האובייקט של Collider2D היריב על ידי חיפוש Collider2D.gameObject סוג המטרה שנפגעה על ידי (אויב, פריט, Collider2D.tag וכו ').

מבין שלושת האירועים הנ"ל OnTriggerEnter2D , ונקראים OnTriggerExit2D פעם אחת לכל התנגשות.

OnTriggerStay2D נקרא כל פריים במהלך ההתנגשות, אך האירוע אינו נקרא עוד לאחר שחלף פרק זמן מסוים מאז ששני האובייקטים נעצרו. הסיבה לכך היא שזה נחשב נכנס למצב שינה, וזה נחשב בזבוז של עיבוד כדי לחשב התנגשויות כל מסגרת עם משהו שאינו זז.

אם אינך Rigidbody 2D רוצה שהוא יעבור לשינה, שנה את מצב השינה של הפרמטר ל"אל תישן".

לאחר שינוי הקוד, הגדר את הטקסט להצגת מידע.

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

אגב, אם אתה נוגע בחפץ ולאחר מכן להפסיק לזוז, השיטה תיקרא לזמן OnTriggerStay2D קצר. אתה אמור להיות מסוגל לראות שהשיטה כבר לא נקראת לאחר OnTriggerStay2D פרק זמן מסוים.

הדבר מציין שהזנת מצב שינה, אך אם ברצונך לשנות את השעה עד שתיכנס לשינה זו, תוכל לשנות אותה על-ידי בחירה באפשרות "פיזיקה דו-ממדית" מהגדרות הפרויקט וציון הפרמטר "זמן שינה" תוך שניות. לא ניתן להגדיר אותו ל-0, אך אם הוא OnTriggerStay2D מוגדר כקטן עד אינסוף, השיטה עצמה לא תיקרא.