Menentukan sama ada objek bertembung antara satu sama lain (2D)

Laman dikemaskini :
Tarikh penciptaan halaman :

Persekitaran pengesahan

Windows
  • Windows 11
Penyunting Perpaduan
  • 2021.3.3F1
Pakej Sistem Input
  • 1.3.0

Prasyarat untuk petua ini

Tetapan berikut telah dibuat terlebih dahulu sebagai premis untuk penerangan petua ini.

Pada mulanya

Petua ini menerangkan cara menentukan sama ada dua objek sedang bersentuhan. Gerakkan satu objek dengan papan kekunci.

Penyediaan

Selepas membuat projek, sediakan dua imej sprite yang akan menjadi objek. Jika anda menyusahkan untuk menyediakan, anda boleh meletakkan dua sprite yang sama, tetapi kali ini kami akan memisahkannya untuk kejelasan. Nama-nama itu masing-masing adalah "UnityTips" dan "UnityTips_2".

Tambah dua imej fail dengan menjatuhkannya ke dalam pandangan.

Tambah skrip untuk mengalihkan objek kiri dengan papan kekunci. Nama Player skripnya ialah . Kandungan skrip adalah serupa dengan petua dalam Move, rotate, dan skala 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);
    }
  }
}

Lampirkan objek yang anda ingin jalankan skrip.

Jalankan permainan dan semak sama ada ia berfungsi dengan kekunci kursor pada papan kekunci anda.

Akhirnya, letakkan objek teks untuk memaparkan status pengesanan perlanggaran. Nama TextState objek ialah .

Seting Pengendalian Perlanggaran

Dari sini, anda boleh mengkonfigurasi tetapan yang berkaitan dengan perlanggaran.

Mula-mula, pilih objek yang ingin anda alihkan, "Petua Perpaduan", dan klik "Tambah Komponen" dari pemeriksa. Pilih daripada Physics 2D senarai. Physics adalah objek 3D, jadi jangan salah.

Physics 2DBox Collider 2D Pilih daripada . Oleh kerana sprite ini adalah segi empat tepat, Kotak dipilih, tetapi jika berbentuk bulatan, contohnya, pilih bentuk lain seperti Bulatan.

Box Collider 2D Oleh kerana komponen akan ditambah, semak "Jadikannya pencetus" dari parameter. Ini akan membolehkan anda mendapatkan maklumat hanya mengenai "sama ada anda memukul atau tidak".

Rigidbody 2D Kemudian tambah komponen . Anda boleh menambahnya daripada "Fizik 2D -> Rigidbody 2D". Rigidbody memberikan maklumatCollider fizik kepada objek dan juga boleh menentukan perlanggaran dengan objek yang mempunyai .

Rigidbody Walau bagaimanapun, jika anda mempunyai komponen, ia juga akan mengandungi maklumat graviti dalam arah -Y, jadi jika anda melaksanakannya, ia akan jatuh. Jadi tetapkan "Skala Graviti" kepada 0 daripada parameter.

Dengan cara ini, jika ia adalah permainan tindakan tatal sisi, mungkin mudah untuk menggunakan skala graviti dalam erti kata bahawa ia bebas jatuh ke bawah.

Begitu juga, tambah komponen kepada Box Collider 2D objek lain "UnityTips_2". Ini adalah bahagian yang terjejas kali ini, jadi anda tidak perlu menukar sebarang tetapan.

Player Buka skrip dan tambah setiap medan dan kaedah menggunakan seperti berikut:

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

Oleh kerana kami ingin memaparkan maklumat mengenai sama ada ia dipukul atau tidak, kami akan membolehkannya memaparkannya dalam objek teks seperti berikut.

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

Proses pengesanan perlanggaran diterangkan seperti berikut.

/// <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 Setiap peristiwa di atas berlaku apabila objek yang telah bertembung dengan objek Collider 2D lain yang mempunyai . Ini akan membolehkan anda menentukan dan memproses sama ada ia betul atau tidak.

Terdapat tiga peristiwa, masing-masing dipanggil pada masa berikut.

OnTriggerEnter2D Apabila objek memukul satu sama lain
OnTriggerStay2D Semasa objek memukul satu sama lain
OnTriggerExit2D Apabila objek meninggalkan keadaan perlanggaran

Dalam kedua-dua kes, objek lawan menerima objek lawan sebagai hujah, jadi anda boleh mendapatkan objek lawan Collider2D dengan mencari Collider2D.gameObject jenis sasaran yang dipukul oleh (musuh, item, Collider2D.tag dll.).

Daripada tiga peristiwa di OnTriggerEnter2D atas, dan OnTriggerExit2D dipanggil sekali setiap perlanggaran.

OnTriggerStay2D dipanggil setiap bingkai semasa perlanggaran, tetapi peristiwa itu tidak lagi dipanggil selepas masa tertentu telah berlalu kerana kedua-dua objek berhenti. Ini kerana ia dianggap telah memasuki keadaan tidur, dan ia dianggap sebagai pembaziran pemprosesan untuk mengira perlanggaran setiap bingkai dengan sesuatu yang tidak bergerak.

Jika anda Rigidbody 2D tidak mahu tidur, tukar mod tidur parameter kepada "Jangan tidur".

Selepas mengubah kod, tetapkan teks untuk memaparkan maklumat.

Jalankan permainan dan gerakkan objek dengan papan kekunci untuk menyentuh sprite lain. Anda dapat melihat bahawa tiga fungsi dipanggil untuk setiap satu.

Dengan cara ini, jika anda menyentuh objek dan kemudian berhenti bergerak, kaedah itu akan dipanggil untuk OnTriggerStay2D masa yang singkat. Anda sepatutnya dapat melihat bahawa kaedah itu tidak lagi dipanggil selepas OnTriggerStay2D masa tertentu.

Ini menunjukkan bahawa anda telah memasuki keadaan tidur, tetapi jika anda ingin menukar masa sehingga anda memasuki tidur ini, anda boleh mengubahnya dengan memilih "Fizik 2D" dari tetapan projek dan menentukan parameter "Masa tidur" dalam beberapa saat. Ia tidak boleh ditetapkan kepada 0, tetapi jika ia OnTriggerStay2D ditetapkan kepada kecil tak terhingga, kaedah itu sendiri tidak akan dipanggil.