معیاری طبیعیات کے ساتھ تصادم سے نمٹنا (2 ڈی)

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

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

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

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

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

سب سے پہلے

یہ ٹوٹکا دو اشیاء کو رکھتا ہے تاکہ آپ ایک شے میں ہیرا پھیری کرنے کے طرز عمل کو نافذ کرسکیں اور یونٹی کی معیاری طبیعیات کا استعمال کرتے ہوئے دوسرے کے ساتھ رابطے میں آنے پر دوسرے کو دھکا دے سکیں۔

ویسے ، زیادہ تر ترتیبات وہی ہیں جو پچھلے مضمون میں بیان کردہ طریقہ کار "اس بات کا تعین کرنا کہ آیا اشیاء ایک دوسرے سے ٹکراتی ہیں (2 ڈی)

تیاری

یہاں طریقہ کار تقریبا پچھلے نکات کی طرح ہی ہے ، لہذا آئیے اسے آسانی سے بہاؤ کریں۔

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

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

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

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

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

پچھلی بار، میں صرف اس بارے میں معلومات حاصل کرنا چاہتا تھا کہ میں اسے مارتا ہوں یا نہیں، لہذا میں نے "میک اٹ ٹریگر" چیک کیا، لیکن اس بار میں ایسا نہیں کروں گا. یہ طبیعیات میں تصادم سے نمٹنے کے قابل بناتا ہے۔

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

نیچے آزاد گرنے سے روکنے کے لئے کشش ثقل اسکیل کو 0 پر سیٹ کریں۔

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

اس کے علاوہ، اس بار مخالف کی طاقت کے ساتھ آگے بڑھنا ضروری ہے،Rigidbody 2D لہذا شامل کریں. کشش ثقل کا پیمانہ 0 ہونا چاہئے۔

اس میں بس اتنا ہی ہے۔ اس وقت کسی پروگرام کی ضرورت نہیں ہے. کھیل چلائیں اور کسی دوسری چیز کو چھونے کی کوشش کریں۔

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

اشیاء کو گھومنے سے روکیں

جب آپ اسے چھوتے ہیں تو آپ دیکھ سکتے ہیں ، لیکن اگر ہٹ پوائنٹ تھوڑا سا بھی تبدیل ہوجائے تو ، ہر شے گھوم جائے گی۔ ایک کھیل کے طور پر ، یہ اکثر غیر فطری ہوجاتا ہے ، لہذا آپ کو اسے سیٹ کرنے کی ضرورت ہے تاکہ یہ گھوم نہ سکے۔

Rigidbody 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 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}";
}

پچھلے نکات کی طرح ------, لیکن طریقہ کار کا نام اب "آن ٹریگر 2 ڈی" کے بجائے "آن کولیژن------2 ڈی" ہے۔

Rigidbody 2D مندرجہ بالا واقعات میں سے ہر ایک اس وقت پیش آتا ہے جب کوئی شے جو کسی دوسری شے Collider 2D سے ٹکراتی ہے جس کے پاس ہے۔ اس سے آپ کو اس بات کا تعین کرنے اور عمل کرنے کی اجازت ملے گی کہ آیا یہ صحیح ہے یا نہیں۔

تین واقعات ہیں، جن میں سے ہر ایک کو مندرجہ ذیل وقت پر بلایا جاتا ہے.

OnCollisionEnter2D جب چیزیں ایک دوسرے سے ٹکراتی ہیں
OnCollisionStay2D جبکہ اشیاء ایک دوسرے سے ٹکرا رہی ہیں
OnCollisionExit2D جب اشیاء تصادم کی حالت چھوڑ دیتی ہیں

دونوں صورتوں میں ، مخالف آبجیکٹ مخالف کی شے کو دلیل کے طور پر وصول کرتا ہے ، لہذا آپ (دشمن ، آئٹم ، Collider2D.collider.tag وغیرہ) نشانہ کی قسم کو دیکھ کر مخالف Collision2D کی شے حاصل کرسکتے Collider2D.gameObject ہیں۔

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

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

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

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

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

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

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