Menentukan apakah objek bertabrakan satu sama lain (2D)
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 2D
Box 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.