Pengendalian Perlanggaran dengan Fizik Standard (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 meletakkan dua objek supaya anda boleh melaksanakan tingkah laku memanipulasi satu objek dan menggunakan fizik standard Unity untuk menolak yang lain apabila ia bersentuhan dengan yang lain.
Dengan cara ini, kebanyakan tetapan adalah sama seperti prosedur yang diterangkan dalam artikel sebelumnya "Menentukan sama ada objek bertembung antara satu sama lain (2D)".
Penyediaan
Prosedur di sini hampir sama dengan petua sebelumnya , jadi mari kita mengalirkannya dengan lancar.
Selepas membuat projek, sediakan dua imej sprite yang akan menjadi objek dan tambahkannya. 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 .
using UnityEngine;
using UnityEngine.InputSystem;
public class Player : MonoBehaviour
{
// 一定時間ごとに呼ばれます
void FixedUpdate()
{
// キーボードの情報を取得
var keyboard = Keyboard.current;
// スプライトの移動処理
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.
Kali terakhir, saya ingin mendapatkan maklumat hanya mengenai sama ada saya memukulnya atau tidak, jadi saya menyemak "Jadikannya pencetus", tetapi kali ini saya tidak akan. Ini membolehkan pengendalian perlanggaran dalam fizik.
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 .
Tetapkan Skala Graviti kepada 0 untuk mengelakkan kejatuhan bebas di bawah.
Begitu juga, tambah komponen pada objek lain "UnityTips_2" untuk menandakan Box Collider 2D
hits.
Di samping itu, kali ini adalah perlu untuk bergerak dengan kekuatan lawan,Rigidbody 2D
jadi tambah . Skala graviti hendaklah 0.
Itu sahaja yang ada padanya. Tiada program diperlukan pada masa ini. Jalankan permainan dan cuba sentuh objek lain.
Saya fikir anda boleh mengesahkan bahawa jika anda menolak lawan seperti ini, lawan akan berkelakuan seolah-olah dia ditolak. Ia sangat mudah untuk menggunakan fizik fungsi standard kerana tiada program diperlukan.
Mengelakkan objek berputar
Anda boleh melihat apabila anda menyentuhnya, tetapi jika titik hit beralih sedikit, setiap objek akan berputar. Sebagai permainan, ia sering menjadi tidak wajar, jadi anda perlu menetapkannya supaya ia tidak berputar.
Rigidbody 2D
Komponen ini mempunyai item yang dipanggil "Putaran tetap" dalam "Kekangan", jadi semak Z.
Sekarang anda boleh bekerja supaya ia tidak berputar. Cuba tetapkannya kepada dua objek dan jalankan permainan untuk menyemaknya.
Saya fikir anda boleh yakin bahawa ia tidak berputar tidak kira apa sudut yang anda tolak.
Lakukan sesuatu apabila objek memukul satu sama lain
Sebagai contoh, anda mungkin mahu melaksanakan peluru yang memukul musuh sambil menolak lawan sambil mengurangkan kesihatan musuh. Ini sama seperti petua sebelumnya , kerana peristiwa itu akan berlaku, jadi anda boleh menanganinya.
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 OnCollisionEnter2D(Collision2D partner)
{
TextState.text = $"OnCollisionEnter2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionStay2D(Collision2D partner)
{
TextState.text = $"OnCollisionStay2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionExit2D(Collision2D partner)
{
TextState.text = $"OnCollisionExit2D : {partner.collider.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 OnCollisionEnter2D(Collision2D partner)
{
TextState.text = $"OnCollisionEnter2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突している間呼ばれます。ただしスリープモードになった場合は呼ばれません。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionStay2D(Collision2D partner)
{
TextState.text = $"OnCollisionStay2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
<summary>衝突状態でなくなったタイミングで呼ばれます。</summary>
<param name="partner">衝突した相手のコリジョン情報。</param>
private void OnCollisionExit2D(Collision2D partner)
{
TextState.text = $"OnCollisionExit2D : {partner.collider.tag} {DateTime.Now:HH:mm:ss.fff}{Environment.NewLine}{TextState.text}";
}
Sama seperti petua sebelumnya------, tetapi nama kaedah kini "OnCollision------2D" dan bukannya "OnTrigger2D".
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.
OnCollisionEnter2D | Apabila objek memukul satu sama lain |
OnCollisionStay2D | Semasa objek memukul satu sama lain |
OnCollisionExit2D | Apabila objek meninggalkan keadaan perlanggaran |
Dalam kedua-dua kes, objek lawan menerima objek lawan sebagai hujah, jadi anda boleh mendapatkan objek lawan Collision2D
dengan mencari Collider2D.gameObject
jenis sasaran yang dipukul oleh (musuh, item, Collider2D.collider.tag
dll.).
Daripada tiga peristiwa di OnCollisionEnter2D
atas, dan OnCollisionExit2D
dipanggil sekali setiap perlanggaran.
OnCollisionStay2D
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 OnCollisionStay2D
masa yang singkat.
Anda sepatutnya dapat melihat bahawa kaedah itu tidak lagi dipanggil selepas OnCollisionStay2D
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 OnCollisionStay2D
ditetapkan kepada kecil tak terhingga, kaedah itu sendiri tidak akan dipanggil.