Menentukan apakah objek bertabrakan satu sama lain (2D)

Halaman Diperbarui :
Tanggal pembuatan halaman :

Lingkungan verifikasi

Windows
  • jendela 11
Editor Kesatuan
  • 2021.3.3f1
Paket Sistem Input
  • 1.3.0

Prasyarat untuk tip ini

Pengaturan berikut telah dibuat sebelumnya sebagai premis untuk deskripsi tip ini.

Pada awalnya

Tips ini menjelaskan cara menentukan apakah dua objek bersentuhan. Pindahkan satu objek dengan keyboard.

Persiapan

Setelah membuat proyek, siapkan dua gambar sprite yang akan menjadi objek. Jika Anda kesulitan mempersiapkannya, Anda dapat menempatkan dua sprite yang identik, tetapi kali ini kami akan memisahkannya untuk kejelasan. Namanya masing-masing adalah "UnityTips" dan "UnityTips_2".

Tambahkan dua file gambar dengan menjatuhkannya ke tampilan.

Tambahkan skrip untuk memindahkan objek kiri dengan keyboard. Nama Player skripnya adalah . Konten skrip mirip dengan tip di Memindahkan, memutar, dan menskalakan 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 ke objek tempat Anda ingin menjalankan skrip.

Jalankan game dan periksa apakah itu berfungsi dengan tombol kursor pada keyboard Anda.

Terakhir, tempatkan objek teks untuk menampilkan status deteksi tabrakan. Nama TextState objeknya adalah .

Pengaturan Penanganan Tabrakan

Dari sini, Anda dapat mengonfigurasi pengaturan yang terkait dengan tabrakan.

Pertama, pilih objek yang ingin Anda pindahkan, "UnityTips", dan klik "Add Component" dari inspektur. Pilih dari Physics 2D daftar. Physics adalah objek 3D, jadi jangan salah.

Physics 2DBox Collider 2D Pilih dari . Karena sprite ini berbentuk persegi panjang, Box dipilih, tetapi jika berbentuk lingkaran, misalnya, pilih bentuk lain seperti Circle.

Box Collider 2D Karena komponen akan ditambahkan, centang "Buat pemicu" dari parameter. Ini akan memungkinkan Anda untuk mendapatkan informasi hanya tentang "apakah Anda memukul atau tidak".

Rigidbody 2D Kemudian tambahkan komponen . Anda dapat menambahkannya dari "Physics 2D -> Rigidbody 2D". Rigidbody Memberikan informasiCollider fisika kepada objek dan juga dapat menentukan tabrakan dengan objek yang memiliki .

Rigidbody Namun, jika Anda memiliki komponen, itu juga akan berisi informasi gravitasi dalam arah -Y, jadi jika Anda menjalankannya, itu akan jatuh. Jadi atur "Skala Gravitasi" ke 0 dari parameter.

Ngomong-ngomong, jika ini adalah game aksi gulir samping, mungkin lebih mudah menggunakan skala gravitasi dalam arti jatuh bebas.

Demikian pula, tambahkan komponen ke Box Collider 2D objek lain "UnityTips_2". Ini adalah sisi yang terpengaruh kali ini, jadi Anda tidak perlu mengubah pengaturan apa pun.

Player Buka skrip dan tambahkan setiap bidang dan metode menggunakan sebagai 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}";
  }
}

Karena kami ingin menampilkan informasi tentang apakah itu dipukul atau tidak, kami akan memungkinkan untuk menampilkannya dalam objek teks sebagai berikut.

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

Proses deteksi tabrakan dijelaskan sebagai 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 Masing-masing peristiwa di atas terjadi ketika suatu objek yang telah bertabrakan dengan objek Collider 2D lain yang memiliki . Ini akan memungkinkan Anda untuk menentukan dan memproses apakah itu benar atau tidak.

Ada tiga peristiwa, yang masing-masing dipanggil pada waktu berikut.

OnTriggerEnter2D Ketika benda saling bertabrakan
OnTriggerStay2D Sementara benda-benda saling memukul
OnTriggerExit2D Ketika objek meninggalkan status tabrakan

Dalam kedua kasus, objek lawan menerima objek lawan sebagai argumen, sehingga Anda bisa mendapatkan objek lawan Collider2D dengan mencari Collider2D.gameObject jenis target yang terkena (musuh, item, Collider2D.tag dll.).

Dari ketiga peristiwa di OnTriggerEnter2D atas, dan OnTriggerExit2D disebut sekali per tabrakan.

OnTriggerStay2D disebut setiap frame selama tabrakan, tetapi peristiwa ini tidak lagi disebut setelah jangka waktu tertentu berlalu sejak kedua objek berhenti. Hal ini karena dianggap sudah memasuki kondisi sleep, dan dianggap membuang-buang pengolahan untuk menghitung tumbukan setiap frame dengan sesuatu yang tidak bergerak.

Jika Anda Rigidbody 2D tidak ingin tidur, ubah mode tidur parameter menjadi "Jangan tidur".

Setelah mengubah kode, atur teks untuk menampilkan informasi.

Jalankan game dan pindahkan objek dengan keyboard untuk menyentuh sprite lain. Anda dapat melihat bahwa tiga fungsi dipanggil untuk masing-masing.

Ngomong-ngomong, jika Anda menyentuh suatu benda dan kemudian berhenti bergerak, metode ini akan dipanggil untuk OnTriggerStay2D waktu yang singkat. Anda harus dapat melihat bahwa metode ini tidak lagi dipanggil setelah OnTriggerStay2D jangka waktu tertentu.

Ini menunjukkan bahwa Anda telah memasuki kondisi tidur, tetapi jika Anda ingin mengubah waktu hingga Anda memasuki tidur ini, Anda dapat mengubahnya dengan memilih "Fisika 2D" dari pengaturan proyek dan menentukan parameter "Waktu tidur" dalam hitungan detik. Itu tidak dapat diatur ke 0, tetapi jika OnTriggerStay2D diatur ke sangat kecil, metode itu sendiri tidak akan dipanggil.