تحديد ما إذا كانت الكائنات تتصادم مع بعضها البعض (2D)
بيئة التحقق
- نوافذ
-
- ويندوز ١١
- محرر الوحدة
-
- 2021.3.3f1
- حزمة نظام الإدخال
-
- 1.3.0
المتطلبات الأساسية لهذه النصيحة
تم إجراء الإعدادات التالية مسبقا كمقدمة لوصف هذه النصيحة.
في البداية
تشرح هذه النصيحة كيفية تحديد ما إذا كان هناك كائنان على اتصال. نقل كائن واحد باستخدام لوحة المفاتيح.
اعداد
بعد إنشاء المشروع ، قم بإعداد صورتين للكائن الذي سيكون الكائن. إذا كنت مزعجا في التحضير ، يمكنك وضع كائنين متطابقين ، لكن هذه المرة سنفصلهما من أجل الوضوح. الأسماء هي "UnityTips" و "UnityTips_2" على التوالي.
أضف ملفين للصور عن طريق إفلاتها في طريقة العرض.
أضف برنامجا نصيا لنقل الكائن الأيسر باستخدام لوحة المفاتيح. اسم 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);
}
}
}
إرفاق الكائن الذي تريد تشغيل البرنامج النصي.
قم بتشغيل اللعبة وتحقق مما إذا كانت تعمل مع مفاتيح المؤشر على لوحة المفاتيح.
أخيرا ، ضع كائنا نصيا لعرض حالة اكتشاف الاصطدام.
اسم TextState
الكائن هو .
إعدادات التعامل مع الاصطدام
من هنا ، يمكنك تكوين الإعدادات المتعلقة بالاصطدامات.
أولا ، حدد الكائن الذي تريد نقله ، "UnityTips" ، وانقر فوق "إضافة مكون" من المفتش.
اختر من Physics 2D
القائمة. Physics
هو كائن 3D ، لذلك لا نخطئ.
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
فترة زمنية معينة.
يشير هذا إلى أنك دخلت في حالة سكون ، ولكن إذا كنت تريد تغيير الوقت حتى تدخل هذا السكون ، فيمكنك تغييره عن طريق تحديد "2D Physics" من إعدادات المشروع وتحديد معلمة "وقت السكون" بالثواني.
لا يمكن ضبطه OnTriggerStay2D
على 0 ، ولكن إذا تم تعيينه على صغير بلا حدود ، فلن يتم استدعاء الطريقة نفسها.