برخورد با فیزیک استاندارد (2D)

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

محیط تایید

ویندوز
  • ویندوز 11
ویرایشگر یونیتی
  • دانلود: 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" را انتخاب کنید و روی "Add Component" از بازرس کلیک کنید. از 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 در حالی که اشیاء به یکدیگر برخورد می کنند
انکالیسیونExit2D هنگامی که اشیا وضعیت برخورد را ترک میکنند

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

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

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

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

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

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

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

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