Penanganan Tabrakan dengan Fisika Standar (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
Tip ini menempatkan dua objek sehingga Anda dapat menerapkan perilaku memanipulasi satu objek dan menggunakan fisika standar Unity untuk mendorong yang lain ketika bersentuhan dengan yang lain.
Omong-omong, sebagian besar pengaturannya sama dengan prosedur yang dijelaskan dalam artikel sebelumnya "Menentukan apakah objek saling bertabrakan (2D)".
Persiapan
Prosedur di sini hampir sama dengan tips sebelumnya , jadi mari kita mengalirkannya dengan lancar.
Setelah membuat proyek, siapkan dua gambar sprite yang akan menjadi objek dan tambahkan. 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 .
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 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.
Terakhir kali, saya ingin mendapatkan informasi hanya tentang apakah saya memukulnya atau tidak, jadi saya memeriksa "Jadikan itu pemicu", tetapi kali ini saya tidak akan melakukannya. Ini memungkinkan penanganan tabrakan dalam fisika.
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 .
Atur Skala Gravitasi ke 0 untuk mencegah jatuh bebas di bawah.
Demikian pula, tambahkan komponen ke objek lain "UnityTips_2" untuk menandai Box Collider 2D
hit.
Selain itu, kali ini perlu bergerak dengan kekuatan lawan,Rigidbody 2D
jadi tambahkan . Skala gravitasi harus 0.
Itu saja yang ada untuk itu. Tidak ada program yang diperlukan saat ini. Jalankan game dan coba sentuh objek lain.
Saya pikir Anda dapat memastikan bahwa jika Anda mendorong lawan seperti ini, lawan akan berperilaku seolah-olah dia didorong. Sangat mudah untuk menggunakan fisika fungsi standar karena tidak ada program yang diperlukan.
Mencegah objek berputar
Anda dapat melihat ketika Anda menyentuhnya, tetapi jika titik tekan bergeser sedikit, setiap objek akan berputar. Sebagai permainan, sering menjadi tidak wajar, jadi Anda harus mengaturnya agar tidak berputar.
Rigidbody 2D
Komponen memiliki item yang disebut "Rotasi tetap" di "Kendala", jadi periksa Z.
Sekarang Anda dapat bekerja agar tidak berputar. Coba atur ke dua objek dan jalankan game untuk memeriksanya.
Saya pikir Anda dapat yakin bahwa itu tidak berputar tidak peduli dari sudut mana Anda mendorongnya.
Lakukan sesuatu ketika benda saling bertabrakan
Misalnya, Anda mungkin ingin menerapkan peluru yang mengenai musuh sambil mendorong lawan sambil mengurangi kesehatan musuh. Ini sama dengan tips sebelumnya , karena peristiwa itu akan terjadi, sehingga Anda bisa menghadapinya.
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 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}";
}
}
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 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}";
}
Mirip dengan tips sebelumnya------, tetapi nama metodenya sekarang adalah "OnCollision------2D" alih-alih "OnTrigger2D".
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.
OnCollisionEnter2D | Ketika benda saling bertabrakan |
OnCollisionStay2D | Sementara benda-benda saling memukul |
OnCollisionExit2D | Ketika objek meninggalkan status tabrakan |
Dalam kedua kasus, objek lawan menerima objek lawan sebagai argumen, sehingga Anda bisa mendapatkan objek lawan Collision2D
dengan mencari Collider2D.gameObject
jenis target yang terkena (musuh, item, Collider2D.collider.tag
dll.).
Dari ketiga peristiwa di OnCollisionEnter2D
atas, dan OnCollisionExit2D
disebut sekali per tabrakan.
OnCollisionStay2D
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 OnCollisionStay2D
waktu yang singkat.
Anda harus dapat melihat bahwa metode ini tidak lagi dipanggil setelah OnCollisionStay2D
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 OnCollisionStay2D
diatur ke sangat kecil, metode itu sendiri tidak akan dipanggil.