Menentukan sama ada objek bertembung antara satu sama lain (2D)
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 2D
Box 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.