Nosakiet, vai objekti saduras viens ar otru (2D)

Lapa atjaunota :
Lapas izveides datums :

Verifikācijas vide

Windows
  • Operētājsistēmā Windows 11
Vienotības redaktors
  • 2021.3.3f1
Ievades sistēmas pakete
  • 1.3.0

Priekšnoteikumi šim padomam

Tālāk norādītie iestatījumi ir veikti iepriekš kā priekšnoteikums šī padoma aprakstam.

Sākumā

Šis padoms izskaidro, kā noteikt, vai divi objekti saskaras. Pārvietojiet vienu objektu ar tastatūru.

Gatavošana

Pēc projekta izveidošanas sagatavojiet divus sprite attēlus, kas būs objekts. Ja jums ir apgrūtinoši sagatavoties, varat ievietot divus identiskus sprites, bet šoreiz skaidrības labad mēs tos atdalīsim. Nosaukumi ir attiecīgi "UnityTips" un "UnityTips_2".

Pievienojiet divus attēlu failus, nometot tos skatā.

Pievienojiet skriptu, lai pārvietotu kreiso objektu ar tastatūru. Skripta nosaukums Player ir . Skripta saturs ir līdzīgs padomiem sadaļā Pārvietot, pagriezt un mērogot sprite.

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

Pievienojiet objektam, kuram vēlaties palaist skriptu.

Palaidiet spēli un pārbaudiet, vai tā darbojas ar tastatūras kursora taustiņiem.

Visbeidzot, novietojiet teksta objektu, lai parādītu sadursmes noteikšanas statusu. Objekta nosaukums TextState ir .

Sadursmes apstrādes iestatījumi

No šejienes jūs varat konfigurēt iestatījumus, kas saistīti ar sadursmēm.

Vispirms atlasiet objektu, kuru vēlaties pārvietot, "UnityTips" un no inspektora noklikšķiniet uz "Pievienot komponentu". Atlasiet no Physics 2D saraksta. Physics ir 3D objekts, tāpēc nekļūdieties.

Physics 2DBox Collider 2D Atlasīt no . Tā kā šis sprite ir taisnstūrveida, tiek atlasīts lodziņš, bet, ja tas ir, piemēram, apļa formas, atlasiet citas formas, piemēram, Aplis.

Box Collider 2D Tā kā komponents tiks pievienots, no parametriem atzīmējiet "Make it trigger". Tas ļaus jums iegūt informāciju tikai par to, "vai jūs trāpījāt vai nē".

Rigidbody 2D Pēc tam pievienojiet komponentus no . To var pievienot no "Physics 2D -> Rigidbody 2D". Rigidbody sniedz fizikas informācijuCollider objektam un var arī noteikt sadursmes ar objektiem, kuriem ir .

Rigidbody Tomēr, ja jums ir komponents, tas saturēs arī gravitācijas informāciju -Y virzienā, tādēļ, ja to izpildīsit, tas nokritīs. Tātad iestatiet "Gravitācijas skalu" uz 0 no parametriem.

Starp citu, ja tā ir sānu ritināšanas darbības spēle, var būt ērti izmantot gravitācijas skalu tādā nozīmē, ka tā ir brīva krišana uz leju.

Līdzīgi pievienojiet komponentu Box Collider 2D otram objektam "UnityTips_2". Šoreiz šī ir skartā puse, tāpēc jums nav jāmaina iestatījumi.

Player Atveriet skriptu un pievienojiet katru lauku un metodi, izmantojot šādi:

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

Tā kā mēs vēlamies parādīt informāciju par to, vai tas tika sasniegts, mēs ļausim to parādīt teksta objektā šādi.

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

Sadursmes noteikšanas process ir aprakstīts šādi.

/// <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 Katrs no iepriekš minētajiem notikumiem notiek, kad objekts, kas ir saduras ar citu objektu Collider 2D , kuram ir . Tas ļaus jums noteikt un apstrādāt, vai tas ir pareizi vai nē.

Ir trīs notikumi, no kuriem katrs tiek saukts nākamajā laikā.

OnTriggerEnter2D Kad priekšmeti trāpa viens otram
OnTriggerStay2D Kamēr priekšmeti sitas viens pret otru
OnTriggerExit2D Kad objekti atstāj sadursmes stāvokli

Abos gadījumos pretinieka objekts saņem pretinieka objektu kā argumentu, lai jūs varētu iegūt pretinieka Collider2D objektu, meklējot Collider2D.gameObject mērķa veidu, kuru skāra (ienaidnieks, Collider2D.tag priekšmets utt.).

No iepriekš minētajiem trim notikumiem un OnTriggerExit2D tiek izsaukti OnTriggerEnter2D vienu reizi vienā sadursmē.

OnTriggerStay2D sadursmes laikā tiek saukts par katru kadru, bet notikums vairs netiek izsaukts pēc tam, kad ir pagājis zināms laiks, kopš abi objekti apstājās. Tas ir tāpēc, ka tiek uzskatīts, ka tas ir nonācis miega stāvoklī, un tiek uzskatīts par apstrādes izšķiešanu, lai aprēķinātu sadursmes ar katru rāmi ar kaut ko, kas nepārvietojas.

Ja nevēlaties Rigidbody 2D , lai tas gulētu, mainiet parametra miega režīmu uz "Negulēt".

Pēc koda maiņas iestatiet tekstu informācijas parādīšanai.

Palaidiet spēli un pārvietojiet objektu ar tastatūru, lai pieskartos citam sprite. Jūs varat redzēt, ka katrai no tām ir nepieciešamas trīs funkcijas.

Starp citu, ja jūs pieskaraties objektam un pēc tam pārtraucat kustību, metode tiks izsaukta uz OnTriggerStay2D īsu laiku. Jums vajadzētu būt iespējai redzēt, ka metode pēc noteikta laika vairs netiek izsaukta OnTriggerStay2D .

Tas norāda, ka esat ievadījis miega stāvokli, bet, ja vēlaties mainīt laiku, līdz ieejat šajā miega režīmā, varat to mainīt, projekta iestatījumos atlasot "2D fizika" un norādot parametru "Miega laiks" sekundēs. To nevar iestatīt uz 0, bet, ja tas OnTriggerStay2D ir iestatīts uz bezgalīgi mazu, pati metode netiks saukta.