Сблъсък със стандартна физика (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" и кликнете върху "Добавяне на компонент" от инспектора. Изберете от Physics 2D списъка. Physics е 3D обект, така че не се заблуждавайте.

Physics 2DBox Collider 2D Изберете от . Тъй като този спрайт е правоъгълен, Box е избран, но ако е с кръгла форма, например, изберете други фигури като Circle.

Последния път исках да получа информация само за това дали съм го ударил или не, затова проверих "Make it trigger", но този път няма да го направя. Това дава възможност за справяне със сблъсъка във физиката.

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 физика" от настройките на проекта и зададете параметъра "Време на сън" в секунди. Той не може да бъде настроен на 0, но ако OnCollisionStay2D е настроен на безкрайно малък, самият метод няма да бъде извикан.