تعین کریں کہ آیا اشیاء ایک دوسرے سے ٹکراتی ہیں (2 D)

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

تصدیق کا ماحول

Windows
  • ونڈوز 11
یونٹی ایڈیٹر
  • 2021.3.3f1
ان پٹ سسٹم پیکیج
  • 1.3.0

اس ٹوٹکے کے لئے ضروری شرائط

مندرجہ ذیل ترتیبات اس ٹپ کی وضاحت کے لئے بنیاد کے طور پر پیشگی بنائی گئی ہیں۔

سب سے پہلے

یہ ٹوٹکا وضاحت کرتا ہے کہ اس بات کا تعین کیسے کریں کہ آیا دو اشیاء رابطے میں ہیں۔ کی بورڈ کے ساتھ ایک آبجیکٹ کو منتقل کریں۔

تیاری

پروجیکٹ بنانے کے بعد ، اسپرائٹ کی دو تصاویر تیار کریں جو آبجیکٹ ہوگی۔ اگر آپ کو تیاری کرنے میں دشواری ہو تو ، آپ دو ایک جیسے اسپرائٹس رکھ سکتے ہیں ، لیکن اس بار ہم وضاحت کے لئے انہیں الگ کریں گے۔ ان کے نام بالترتیب "یونٹی ٹپس" اور "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 ہے۔

ٹکراؤ ہینڈلنگ کی ترتیبات

یہاں سے ، آپ تصادم سے متعلق ترتیبات تشکیل دے سکتے ہیں۔

سب سے پہلے ، وہ آبجیکٹ منتخب کریں جسے آپ منتقل کرنا چاہتے ہیں ، "یونٹی ٹپس"، اور انسپکٹر سے "جزو شامل کریں" پر کلک کریں۔ فہرست میں سے Physics 2D منتخب کریں. Physics ایک تھری ڈی آبجیکٹ ہے ، لہذا کوئی غلطی نہ کریں۔

Physics 2DBox Collider 2D میں سے منتخب کریں. چونکہ یہ اسپرائٹ مستطیل ہے ، لہذا باکس کا انتخاب کیا جاتا ہے ، لیکن اگر یہ دائرے کی شکل کا ہے تو ، مثال کے طور پر ، سرکل جیسی دیگر شکلوں کا انتخاب کریں۔

Box Collider 2D چونکہ جزو شامل کیا جائے گا ، لہذا پیرامیٹرز سے "اسے ٹریگر بنائیں" چیک کریں۔ یہ آپ کو صرف "آپ کو مارنے یا نہ لگانے" کے بارے میں معلومات حاصل کرنے کی اجازت دے گا.

Rigidbody 2D پھر اس کے اجزاء شامل کریں. آپ اسے "فزکس 2 ڈی - > ریڈ باڈی 2 ڈی" سے شامل کرسکتے ہیں۔ Rigidbody آبجیکٹ کو فزکس کی معلوماتCollider فراہم کرتا ہے اور ان اشیاء کے ساتھ ٹکراؤ کا تعین بھی کرسکتا ہے جن کے پاس ہے۔

Rigidbody تاہم ، اگر آپ کے پاس کوئی جزو ہے تو ، اس میں -Y سمت میں کشش ثقل کی معلومات بھی شامل ہوگی ، لہذا اگر آپ اسے انجام دیتے ہیں تو ، یہ نیچے گر جائے گا۔ لہذا پیرامیٹرز سے "کشش ثقل اسکیل" کو 0 پر سیٹ کریں۔

ویسے ، اگر یہ ایک سائیڈ سکرولنگ ایکشن گیم ہے تو ، کشش ثقل اسکیل کو اس معنی میں استعمال کرنا آسان ہوسکتا ہے کہ یہ نیچے گرنے کے لئے آزاد ہے۔

اسی طرح ، دوسرے آبجیکٹ "UnityTips_2" میں Box Collider 2D ایک جزو شامل کریں۔ یہ اس بار متاثرہ پہلو ہے ، لہذا آپ کو کسی بھی ترتیبات کو تبدیل کرنے کی ضرورت نہیں ہے۔

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.tag وغیرہ) نشانہ کی قسم کو دیکھ کر مخالف Collider2D کی شے حاصل کرسکتے Collider2D.gameObject ہیں۔

مندرجہ بالا تین واقعات میں OnTriggerEnter2D سے، اور OnTriggerExit2D ایک بار فی ٹکراؤ کہا جاتا ہے.

OnTriggerStay2D تصادم کے دوران ہر فریم کہا جاتا ہے ، لیکن دونوں اشیاء کے رکنے کے بعد ایک خاص وقت گزرنے کے بعد واقعہ کو اب نہیں کہا جاتا ہے۔ اس کی وجہ یہ ہے کہ اسے نیند کی حالت میں داخل ہونے والا سمجھا جاتا ہے ، اور ہر فریم کو کسی ایسی چیز کے ساتھ ٹکراؤ کا حساب لگانا پروسیسنگ کا فضلہ سمجھا جاتا ہے جو حرکت نہیں کر رہی ہے۔

اگر آپ Rigidbody 2D اسے سونا نہیں چاہتے ہیں تو ، پیرامیٹر کے نیند کے موڈ کو "نیند نہ کریں" میں تبدیل کریں۔

کوڈ کو تبدیل کرنے کے بعد ، معلومات ظاہر کرنے کے لئے متن سیٹ کریں۔

گیم چلائیں اور کسی دوسرے اسپرائٹ کو چھونے کے لئے کی بورڈ کے ساتھ آبجیکٹ کو منتقل کریں۔ آپ دیکھ سکتے ہیں کہ ہر ایک کے لئے تین افعال طلب کیے جاتے ہیں۔

ویسے اگر آپ کسی شے کو چھوتے ہیں اور پھر حرکت کرنا بند کر دیتے ہیں تو یہ طریقہ تھوڑی دیر کے لیے OnTriggerStay2D کہا جائے گا۔ آپ کو یہ دیکھنے کے قابل ہونا چاہئے کہ طریقہ کار کو ایک خاص وقت کے بعد OnTriggerStay2D مزید نہیں کہا جاتا ہے۔

یہ اس بات کی نشاندہی کرتا ہے کہ آپ نیند کی حالت میں داخل ہوگئے ہیں ، لیکن اگر آپ اس نیند میں داخل ہونے تک کا وقت تبدیل کرنا چاہتے ہیں تو ، آپ پروجیکٹ کی ترتیبات سے "2 ڈی فزکس" منتخب کرکے اور سیکنڈوں میں "سلیپ ٹائم" پیرامیٹر کی وضاحت کرکے اسے تبدیل کرسکتے ہیں۔ اسے 0 پر سیٹ نہیں کیا جاسکتا ہے ، لیکن اگر اسے OnTriggerStay2D لامحدود طور پر چھوٹا کیا جائے تو ، طریقہ کار کو خود نہیں کہا جائے گا۔