Nustatymas, ar objektai susiduria vienas su kitu (2D)

Puslapis atnaujintas :
Puslapio sukūrimo data :

Tikrinimo aplinka

Windows
  • Langai 11
"Unity" redaktorius
  • 2021.3.3F1
Įvesties sistemos paketas
  • 1.3.0

Būtinos šio patarimo sąlygos

Šie nustatymai buvo atlikti iš anksto kaip šio patarimo aprašymo prielaida.

Iš pradžių

Šiame patarime paaiškinama, kaip nustatyti, ar du objektai liečiasi. Perkelkite vieną objektą klaviatūra.

Paruošimas

Sukūrę projektą, paruošite du sprite vaizdus, kurie bus objektas. Jei jums sunku pasiruošti, galite įdėti du identiškus spritus, tačiau šį kartą aiškumo dėlei juos atskirsime. Pavadinimai yra atitinkamai "UnityTips" ir "UnityTips_2".

Pridėkite du vaizdo failus numesdami juos į rodinį.

Pridėkite scenarijų, kad klaviatūra perkeltumėte kairįjį objektą. Scenarijaus pavadinimas Player yra . Scenarijaus turinys yra panašus į patarimus, pateiktus "Sprite" perkėlimas, pasukimas ir mastelio keitimas.

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);
    }
  }
}

Pridėkite prie objekto, kuriame norite paleisti scenarijų.

Paleiskite žaidimą ir patikrinkite, ar jis veikia su klaviatūros žymeklio klavišais.

Galiausiai įdėkite tekstinį objektą, kad būtų rodoma susidūrimo aptikimo būsena. Objekto pavadinimas TextState yra .

Susidūrimo valdymo nustatymai

Čia galite konfigūruoti su susidūrimais susijusius nustatymus.

Pirmiausia pasirinkite objektą, kurį norite perkelti, "UnityTips" ir iš inspektoriaus spustelėkite "Pridėti komponentą". Pasirinkite iš Physics 2D sąrašo. Physics yra 3D objektas, todėl nesuklyskite.

Physics 2DBox Collider 2D Pasirinkite iš . Kadangi šis sprite yra stačiakampis, pasirenkamas langelis, bet jei jis yra apskritimo formos, pavyzdžiui, pasirinkite kitas figūras, pvz., Apskritimas.

Box Collider 2D Kadangi komponentas bus pridėtas, iš parametrų pažymėkite "Padaryti jį suaktyvinti". Tai leis jums gauti informaciją tik apie "ar pataikėte, ar ne".

Rigidbody 2D Tada pridėkite komponentus . Jį galite pridėti iš "Physics 2D -> Rigidbody 2D". Rigidbody suteikia objektui fizikos informacijąCollider ir taip pat gali nustatyti susidūrimus su objektais, kurie turi .

Rigidbody Tačiau jei turite komponentą, jame taip pat bus gravitacijos informacijos -Y kryptimi, taigi, jei jį vykdysite, jis nukris žemyn. Taigi iš parametrų nustatykite "Gravitacijos skalę" į 0.

Beje, jei tai yra šoninio slinkimo veiksmo žaidimas, gali būti patogu naudoti gravitacijos skalę ta prasme, kad ji yra laisvas kritimas žemyn.

Panašiai pridėkite komponentą prie Box Collider 2D kito objekto "UnityTips_2". Šį kartą tai yra paveikta pusė, todėl jums nereikia keisti jokių nustatymų.

Player Atidarykite scenarijų ir pridėkite kiekvieną lauką bei metodą taip:

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

Kadangi norime rodyti informaciją apie tai, ar jis nukentėjo, ar ne, suteiksime galimybę jį rodyti teksto objekte taip.

/// <summary>状態表示用テキストオブジェクト。</summary>
[SerializeField] private Text TextState;

Susidūrimo aptikimo procesas aprašomas taip:

/// <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 Kiekvienas iš pirmiau minėtų įvykių įvyksta, kai objektas, susidūręs su kitu objektu Collider 2D , turinčiu . Tai leis jums nustatyti ir apdoroti, ar jis teisingas, ar ne.

Yra trys įvykiai, kurių kiekvienas vadinamas tokiu laiku.

OnTriggerEnter2D Kai objektai atsitrenkia vienas į kitą
OnTriggerStay2D Kol objektai atsitrenkia vienas į kitą
OnTriggerExit2D Kai objektai palieka susidūrimo būseną

Abiem atvejais priešininko objektas gauna priešininko objektą kaip argumentą, todėl priešininko Collider2D objektą galite gauti ieškodami Collider2D.gameObject taikinio tipo (priešas, Collider2D.tag daiktas ir kt.).

OnTriggerEnter2D minėtų trijų įvykių ir OnTriggerExit2D yra iškviečiami vieną kartą per susidūrimą.

OnTriggerStay2D susidūrimo metu vadinamas kiekvienas kadras, tačiau įvykis nebevadinamas praėjus tam tikram laikui nuo tada, kai abu objektai sustojo. Taip yra todėl, kad manoma, kad jis pateko į miego būseną, ir tai laikoma apdorojimo švaistymu, norint apskaičiuoti kiekvieno kadro susidūrimą su kažkuo, kas nejuda.

Rigidbody 2D Jei nenorite, kad jis miegotų, pakeiskite parametro miego režimą į "Nemiegoti".

Pakeitę kodą, nustatykite informacijos rodymo tekstą.

Paleiskite žaidimą ir perkelkite objektą klaviatūra, kad paliestumėte kitą sprite. Matote, kad kiekvienai iš jų reikalingos trys funkcijos.

Beje, jei paliesite objektą ir nustosite judėti, metodas bus iškviestas OnTriggerStay2D trumpą laiką. Turėtumėte matyti, kad po tam tikro laiko metodas nebėra vadinamas OnTriggerStay2D .

Tai rodo, kad įvedėte miego būseną, bet jei norite pakeisti laiką, kol įvesite šį miegą, galite jį pakeisti projekto nustatymuose pasirinkę "2D fizika" ir sekundėmis nurodydami parametrą "Miego laikas". Jis negali būti nustatytas į 0, bet jei jis OnTriggerStay2D yra be galo mažas, pats metodas nebus vadinamas.