التعامل مع الاصطدام مع الفيزياء القياسية (2D)

تحديث الصفحة :
تاريخ إنشاء الصفحة :

بيئة التحقق

نوافذ
  • ويندوز ١١
محرر الوحدة
  • 2021.3.3f1
حزمة نظام الإدخال
  • 1.3.0

المتطلبات الأساسية لهذه النصيحة

تم إجراء الإعدادات التالية مسبقا كمقدمة لوصف هذه النصيحة.

في البداية

تضع هذه النصيحة كائنين بحيث يمكنك تنفيذ سلوك التلاعب بكائن واحد واستخدام فيزياء Unity القياسية لدفع الآخر عندما يتلامس مع الآخر.

بالمناسبة ، معظم الإعدادات هي نفس الإجراء الموضح في المقالة السابقة "تحديد ما إذا كانت الكائنات تتصادم مع بعضها البعض (2D)".

اعداد

الإجراء هنا هو نفسه تقريبا مثل النصائح السابقة ، لذلك دعونا نتدفقه بسلاسة.

بعد إنشاء المشروع، قم بإعداد صورتي كائن سيكونان كائنات وأضفهما. الأسماء هي "UnityTips" و "UnityTips_2" على التوالي.

أضف ملفين للصور عن طريق إفلاتها في طريقة العرض.

أضف برنامجا نصيا لنقل الكائن الأيسر باستخدام لوحة المفاتيح. اسم Player البرنامج النصي هو .

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
  // 一定時間ごとに呼ばれます
  void FixedUpdate()
  {
    // キーボードの情報を取得
    var keyboard = Keyboard.current;

    // スプライトの移動処理
    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 اختر من . بما أن هذا الكائن مستطيل، يتم تحديد مربع، ولكن إذا كان على شكل دائرة، على سبيل المثال، حدد أشكالا أخرى مثل الدائرة.

في المرة الأخيرة ، أردت الحصول على معلومات فقط حول ما إذا كنت قد ضربتها أم لا ، لذلك قمت بفحص "اجعلها محفزة" ، لكن هذه المرة لن أفعل ذلك. وهذا يتيح التعامل مع الاصطدام في الفيزياء.

Rigidbody 2D ثم أضف مكونات . يمكنك إضافته من "الفيزياء 2D -> Rigidbody 2D". Rigidbody يعطي معلوماتCollider فيزيائية للجسم ويمكنه أيضا تحديد التصادمات مع الأجسام التي تحتوي على .

اضبط مقياس الجاذبية على 0 لمنع السقوط الحر أدناه.

وبالمثل ، أضف مكونا إلى الكائن الآخر "UnityTips_2" لتمييز Box Collider 2D النتائج.

بالإضافة إلى ذلك ، هذه المرة من الضروري التحرك بقوة الخصم ،Rigidbody 2D لذلك أضف . يجب أن يكون مقياس الجاذبية 0.

هذا كل ما في الامر. لا يوجد برنامج مطلوب في هذا الوقت. قم بتشغيل اللعبة وحاول لمس كائن آخر.

أعتقد أنه يمكنك تأكيد أنه إذا دفعت الخصم بهذه الطريقة ، فسوف يتصرف الخصم كما لو تم دفعه. من السهل جدا استخدام فيزياء الوظيفة القياسية لأنه لا يلزم وجود برنامج.

منع الكائنات من الدوران

يمكنك أن ترى عندما تلمسها ، ولكن إذا تحولت نقطة الضرب قليلا ، تدوير كل كائن. كلعبة ، غالبا ما تصبح غير طبيعية ، لذلك تحتاج إلى ضبطها بحيث لا تدور.

Rigidbody 2D يحتوي المكون على عنصر يسمى "الدوران الثابت" في "القيود" ، لذا حدد Z. الآن يمكنك العمل حتى لا تدور. حاول ضبطه على كائنين وتشغيل اللعبة للتحقق من ذلك.

أعتقد أنه يمكنك التأكد من أنه لا يدور بغض النظر عن الزاوية التي تدفعها منها.

افعل شيئا عندما تصطدم الأشياء ببعضها البعض

على سبيل المثال ، قد ترغب في تنفيذ رصاصة تصيب عدوا أثناء دفع الخصم مع تقليل صحة العدو. هذا هو نفس النصائح السابقة ، حيث سيحدث الحدث ، حتى تتمكن من التعامل معه.

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 OnCollisionEnter2D(Collision2D partner)
  {
    TextState.text = $"OnCollisionEnter2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
  }

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

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

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

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

على غرار النصائح السابقة ------, ولكن اسم الطريقة الآن هو "OnCollision------2D" بدلا من "OnTrigger2D".

Rigidbody 2D يحدث كل حدث من الأحداث المذكورة أعلاه عندما يصطدم كائن بكائن Collider 2D آخر يحتوي على . سيسمح لك ذلك بتحديد ومعالجة ما إذا كان صحيحا أم لا.

هناك ثلاثة أحداث ، كل منها يسمى في التوقيت التالي.

OnCollisionEnter2D عندما تصطدم الأشياء ببعضها البعض
OnCollisionStay2D بينما تصطدم الأشياء ببعضها البعض
OnCollisionExit2D عندما تغادر الأجسام حالة الاصطدام

في كلتا الحالتين ، يتلقى كائن الخصم كائن الخصم كوسيطة ، بحيث يمكنك الحصول على كائن الخصم Collision2D من خلال البحث عن Collider2D.gameObject نوع الهدف الذي أصابه (العدو ، العنصر ، Collider2D.collider.tag إلخ).

OnCollisionEnter2D من الأحداث الثلاثة المذكورة أعلاه ، وتسمى OnCollisionExit2D مرة واحدة لكل تصادم.

OnCollisionStay2D كل إطار أثناء التصادم ، ولكن لم يعد يتم استدعاء الحدث بعد مرور فترة زمنية معينة منذ توقف كلا الجسمين. هذا لأنه يعتبر أنه دخل في حالة سكون ، ويعتبر مضيعة للمعالجة لحساب الاصطدامات في كل إطار بشيء لا يتحرك.

إذا كنت Rigidbody 2D لا تريد أن تنام ، فقم بتغيير وضع السكون للمعلمة إلى "عدم النوم".

بعد تغيير الرمز ، اضبط النص لعرض المعلومات.

قم بتشغيل اللعبة وتحريك الكائن باستخدام لوحة المفاتيح للمس كائن آخر. يمكنك أن ترى أنه يتم استدعاء ثلاث وظائف لكل منها.

بالمناسبة ، إذا لمست شيئا ثم توقفت عن الحركة ، استدعاء الطريقة لفترة OnCollisionStay2D قصيرة. يجب أن تكون قادرا على رؤية أن الطريقة لم تعد تسمى بعد OnCollisionStay2D فترة زمنية معينة.

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