تعیین اینکه ایا اشیاء با یکدیگر برخورد می کنند (2D)

صفحه به روز شده :
تاریخ ایجاد صفحه :

محیط تایید

ویندوز
  • ویندوز 11
ویرایشگر یونیتی
  • دانلود: 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" را انتخاب کنید و روی "Add Component" از بازرس کلیک کنید. از Physics 2D لیست انتخاب کنید. Physics یک شی 3D است، بنابراین اشتباه نکنید.

Physics 2DBox Collider 2D انتخاب از . از انجا که این روح مستطیل شکل است، جعبه انتخاب می شود، اما اگر دایره ای شکل باشد، به عنوان مثال، اشکال دیگر مانند دایره را انتخاب کنید.

Box Collider 2D از انجا که جزء اضافه خواهد شد، بررسی کنید "ان را ماشه" از پارامترها. این به شما اجازه می دهد تا اطلاعات را فقط در مورد "ایا شما ضربه یا نه" دریافت کنید.

Rigidbody 2D سپس اجزای ان را اضافه کنید. شما می توانید ان را از "فیزیک 2D -> Rigidbody 2D" اضافه کنید. Rigidbody اطلاعاتCollider فیزیک را به جسم می دهد و همچنین می تواند برخورد با اشیاء را تعیین کند که .

Rigidbody با این حال، اگر شما یک جزء داشته باشید، همچنین حاوی اطلاعات گرانشی در جهت -Y است، بنابراین اگر ان را اجرا کنید، سقوط خواهد کرد. بنابراین "Gravity Scale" را از پارامترها به 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 در حالی که اشیاء به یکدیگر برخورد می کنند
انترایگرExit2D هنگامی که اشیا وضعیت برخورد را ترک میکنند

در هر دو مورد، شیء حریف شیء حریف را به عنوان یک استدلال دریافت می کند، بنابراین شما می توانید شی حریف Collider2D را با نگاه کردن Collider2D.gameObject به نوع هدف ضربه خورده (دشمن، Collider2D.tag ایتم و غیره) دریافت کنید.

از OnTriggerEnter2D سه رویداد فوق، و OnTriggerExit2D یک بار در هر برخورد نامیده می شود.

OnTriggerStay2D هر فریم در طول برخورد نامیده می شود، اما این رویداد دیگر پس از گذشت زمان مشخصی از زمان متوقف شدن هر دو جسم نامیده نمی شود. این به این دلیل است که در نظر گرفته شده است که وارد حالت خواب شده است و محاسبه برخورد هر فریم با چیزی که حرکت نمی کند، اتلاف پردازش است.

اگر نمی خواهید Rigidbody 2D ان را به خواب ببرید، حالت خواب پارامتر را به "نخوابیدن" تغییر دهید.

پس از تغییر کد، متن را برای نمایش اطلاعات تنظیم کنید.

بازی را اجرا کنید و شی را با صفحه کلید حرکت می دهد تا روح دیگری را لمس کنید. شما می توانید ببینید که سه توابع برای هر یک نامیده می شود.

به هر حال، اگر شما یک شی را لمس کنید و سپس حرکت را متوقف کنید، روش برای OnTriggerStay2D مدت کوتاهی فراخوانده می شود. شما باید بتوانید ببینید که این روش پس از OnTriggerStay2D مدت زمان مشخصی فراخوانی نمی شود.

این نشان می دهد که شما وارد حالت خواب شده اید، اما اگر می خواهید زمان را تا زمانی که وارد این خواب شوید تغییر دهید، می توانید ان را با انتخاب "فیزیک 2D" از تنظیمات پروژه و مشخص کردن پارامتر "زمان خواب" در عرض چند ثانیه تغییر دهید. نمیتوان ان را روی ۰ تنظیم کرد OnTriggerStay2D ، اما اگر بینهایت کوچک باشد، خود روش نامیده نخواهد شد.