קביעה אם עצמים מתנגשים זה בזה (דו-ממד)
סביבת אימות
- חלונות
-
- חלונות 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 2D
Box 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
מוגדר כקטן עד אינסוף, השיטה עצמה לא תיקרא.