تحديد ما إذا كانت الكائنات تتصادم مع بعضها البعض (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 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 فترة زمنية معينة.

يشير هذا إلى أنك دخلت في حالة سكون ، ولكن إذا كنت تريد تغيير الوقت حتى تدخل هذا السكون ، فيمكنك تغييره عن طريق تحديد "2D Physics" من إعدادات المشروع وتحديد معلمة "وقت السكون" بالثواني. لا يمكن ضبطه OnTriggerStay2D على 0 ، ولكن إذا تم تعيينه على صغير بلا حدود ، فلن يتم استدعاء الطريقة نفسها.