Menerapkan deteksi hit dengan tilemaps
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.
Apa prasyarat untuk tip ini?
- Membuat peta 2D top-down menggunakan peta petak peta Unity standar
- Penanganan Tabrakan dengan Fisika Standar (2D)
Tentang meminjam bahan peta
Kami memproses pinjaman dari situs-situs berikut.
Implementasi karakter berjalan
Pertama, terapkan peta dan karakter yang melakukan deteksi hit. Karakter ini dapat dipindahkan dengan tombol kursor pada keyboard. Namun, jika Anda menerapkan jalan kaki yang benar, itu akan panjang dan jauh dari esensi tips buku, jadi kali ini saya hanya akan memindahkan satu gambar sederhana.
Jika Anda ingin menerapkan animasi berjalan, lihat tips berikut:
Setelah Anda membuat proyek, tambahkan gambar sprite dari objek yang ingin Anda pindahkan ke proyek.
Pilih gambar dan atur Piksel Per Unit ke 32 dari Inspektur. Ini karena ukuran satu persegi mapchip adalah 32 piksel, jadi cocok untuk itu. Setelah dikonfigurasi, klik tombol "Terapkan" di bawah ini.
Tempatkan sprite dalam tampilan.
Buat skrip untuk memindahkan sprite. Ini mirip dengan tips berikut:
Biarkan nama Player
skrip sebagai .
Kode sebagai berikut:
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 sprite yang ingin Anda pindahkan.
Jalankan game dan periksa apakah Anda ingin memindahkannya dengan keyboard.
Mempersiapkan Tips Peta
Pertama-tama, kita akan menyiapkan mapchip dan membuat peta. Prosedur ini mirip dengan tips berikut: MapTips dengan 2D Tilemap Extras juga mampu mendeteksi tabrakan, tetapi mereka tidak akan digunakan dalam artikel ini karena prosedurnya akan panjang.
Siapkan gambar asli MapTip dan tambahkan ke proyek Anda. Untuk membuat operasi lebih mudah dipahami, harap siapkan "tempat yang dapat dilalui dengan berjalan kaki" dan "tempat yang tidak dapat dilalui dengan berjalan kaki" untuk bahan chip peta.
Atur untuk MapChips di Inspektur dan klik tombol Terapkan. Setelah dikonfigurasi, buka Editor Sprite.
Ini adalah tip peta 32 piksel, jadi saya akan membaginya menjadi 32.
Pilih tab Palet ubin. Jika tidak, tampilkan dengan "Window > 2D -> Tile Palette" dari menu. Buat palet baru. Namanya sewenang-wenang, tetapi untuk saat ini kita akan menyebutnya "MapChipPalette".
Buat folder MapChipPalette di Scenes dan tentukan.
Tambahkan tip peta dengan menyeretnya ke palet. Simpan di folder MapChipPalette yang Anda buat sebelumnya.
Membuat peta
Kali ini, penilaian hit peta akan dilakukan dalam satuan "Tilemap". Oleh karena itu, kita akan membuat dua Tilemaps, "Tilemap tanpa deteksi hit" dan "Tilemap dengan deteksi hit".
Pertama, buat dua Tilemap dalam hierarki. Anda dapat membuat dua di Grid. Nama-nama tersebut adalah "TilemapObeject" dan "TilemapGround" untuk kejelasan.
Pertama, buat "TilemapGround". Karena ini adalah rentang bergerak, Anda cukup meletakkan tanah. Jika ada di tanah, Anda bisa mengubah polanya.
Omong-omong, jika karakter disembunyikan, pilih objek karakter dan atur urutan Sprite Renderer
lapisan inspektur ke 2.
Urutan layer adalah 0 secara default dan Tilemap adalah 0, jadi jika Anda meningkatkannya di atas nilai ini, itu akan ditampilkan di latar depan.
Kemudian pilih TilemapObject dan tempatkan tip peta yang ingin Anda buat tidak bergerak. Atur layer order ke 1 terlebih dahulu. Ini untuk membuatnya muncul di depan tanah.
Seperti inilah tampilannya jika Anda menyembunyikan tanah.
Tentu saja, pada titik ini, tidak ada pengaturan yang terkait dengan deteksi tabrakan, sehingga Anda dapat berkendara di tempat tinggi secara normal. Setelah ini, kami akan mengatur deteksi tabrakan.
Pengaturan Deteksi Tabrakan
Pertama, mari kita atur karakternya. Pengaturan ini hampir sama dengan tips di bawah ini, jadi saya akan melewatkan detailnya dan menjelaskan prosedurnya secara singkat.
Pilih objek karakter dari hierarki dan pilih Physics 2D -> Circle Collider 2D dari Add Component. Jika bentuk objek persegi panjang, "Box Collider 2D" baik-baik saja.
Demikian pula, tambahkan "Physics 2D -> Rigidbody 2D".
Atur skala gravitasi ke 0 untuk mencegah Rigidbody 2D
jatuh otomatis.
Periksa Z di bawah Batasan untuk mencegah sprite berputar saat bertabrakan.
Selanjutnya, pilih "TilemapObject" yang ingin Anda tekan dan pilih "Tilemap -> Tilemap Collider 2D" dari "Add Component".
Itu saja yang ada untuk itu. Anda bahkan tidak memerlukan pemrograman apa pun. Jalankan game dan coba pukul objek yang menjadi dinding. Saya pikir Anda dapat memastikannya berhenti dengan benar.
Namun, ketika Anda benar-benar memukulnya, saya pikir akan ada poin yang menjadi perhatian dalam perilaku tersebut. Berikut adalah beberapa solusi:
Perilaku deteksi hit yang tidak nyaman dengan peta dan solusi
Ketika Anda menabrak dinding, Anda mungkin menemukan beberapa hal yang mengganggu Anda.
Jika Anda bergerak melawan dinding, Anda akan terjebak di tengah
Box Collider 2D
Saya pikir itu akan terjadi jika Anda menggunakan suatu objek.
Misalnya, dari pemandangan di bawah, ketika Anda menekan tombol di kiri bawah, Anda ingin tombol itu bergerak ke kiri di sepanjang dinding. Namun, setelah beberapa kemajuan, saya pikir itu akan terjebak dalam sesuatu dan berhenti.
Kenali penyok di dinding berdasarkan posisi
Circle Collider 2D
Saya pikir mudah dimengerti jika Anda melampirkan .
Dinding harus rata, tetapi jika Anda memindahkannya ke dinding, Anda akan melihat bahwa dinding bergerak seolah-olah tidak rata.
Penyebab dan solusi untuk sobekan dan benjolan
Alasan mengapa ini terjadi tampaknya karena "penentuan hit dilakukan berdasarkan mapchip". Bahkan, ketika Anda memilih TilemapObject, garis hijau muncul di tempat deteksi hit berada, dan Anda dapat melihat bahwa ini adalah garis yang digambar dalam unit MapTip.
Jadi, jika objek bergerak berada pada garis yang setara dengan tepat satu chip peta, itu akan dinilai sebagai hit dengan satu chip peta. Jika Anda bertabrakan di batas chip peta, dua chip peta akan dipukul dan dinilai, sehingga kekuatan pantulan akan meningkat.
Saya pikir cara terbaik untuk mengatasi masalah ini adalah dengan menggabungkan deteksi hit dengan mapchip yang terlampir. Berikut cara melakukannya:
PilihTilemap Collider 2D
"TilemapObject" dengan deteksi hit dari inspektur dan centang "Gunakan dalam komposit" dari .
Seperti yang dinyatakan dalam peringatan, ini saja tidak berpengaruh, jadi pilih "Physics 2D -> Composite Collider 2D" dari "Add Component".
Rigidbody 2D ditambahkan bersama dengan Composite Collider 2D.
Ini sedikit membingungkan, tetapi saya pikir Anda dapat mengonfirmasi bahwa garis hijau di batas antara mapchips dengan deteksi hit telah menghilang.
Saya tidak ingin tilemap bergerak, jadi saya akan Rigidbody 2D
membiarkan tipe bodi komponen sebagai "statis".
Sekarang jalankan game dan coba untuk membuatnya bergerak. Saya pikir bahkan jika Anda bergerak secara diagonal di sepanjang dinding, itu tidak akan tertangkap dan Anda dapat bergerak dengan lancar tanpa gerakan bergelombang.
Hilangkan karakter mendorong kembali dari dinding
Anda dapat melihat bahwa jika Anda menggerakkan karakter untuk mendorong dinding dan kemudian berhenti bergerak, itu akan berperilaku sedikit seperti memantul kembali dari dinding.
Untuk mengatasi ini,Rigidbody 2D
pilih objek karakter dan ubah "Deteksi tabrakan" menjadi "Berkelanjutan" dari komponen.
Perbedaan antara "diskontinu" dan "kontinu" adalah sebagai berikut.
Terputus-putus
Deteksi tabrakan adalah mekanisme yang berpikir setelah bergerak. Ini adalah bentuk yang melakukan deteksi tabrakan dari keadaan di mana ia dipindahkan dan tertanam di dinding. Mudah dipahami jika Anda mengaitkannya dengan trampolin dan karet, tetapi semakin tertanam, semakin menjijikkan gaya akan meningkat, dan pantulan akan lebih kuat. Sebaliknya, perhitungan dilakukan setelah pindah, sehingga biaya pemrosesan rendah.
Terus-menerus
Ini diproses sambil menentukan apa yang ada di jalan. Tentukan apakah ada dinding antara posisi sebelum dan sesudah bergerak, Jika ada dinding, itu akan menilai tabrakan di sana dan berhenti, sehingga praktis tidak ada tolakan. Sebaliknya, biaya pemrosesan sedikit meningkat karena perhitungannya termasuk di tengah pergerakan.
Terperangkap di sudut objek peta
Tergantung pada program dan lokasi, ada yang tertangkap dan ada yang tidak, dan penyebabnya tidak banyak berubah. Omong-omong, itu terjadi dengan sudut sudut seperti Box Collider 2D, dan bukan dengan lingkaran bulat.
Bahkan jika fenomena misterius seperti itu terjadi, ada baiknya memiliki sudut bulat collider untuk menghindari hambatan. Ini terbatas pada Box Collider 2D, tetapi untuk membuatnya bulat, komponen Box Collider 2D objek karakter memiliki "radius tepi" dan Anda menempatkan nilai di sana. Jika Anda memasukkan 1 sebagai unit numerik, pembulatan akan terjadi untuk ukuran objek. Itu tergantung pada ukurannya, tetapi baik untuk menempatkan sekitar 0,1.
Ngomong-ngomong, penilaian hit hanya meningkat dengan ukuran kebulatan, jadi tolong sesuaikan jika besar. Box Collider 2D memiliki tombol Edit Collider yang memungkinkan Anda mengubah ukurannya secara langsung dalam tampilan dengan mengklik tombol. Karena garis hijau luar adalah deteksi hit yang sebenarnya, atur ukurannya agar tidak alami.
Setelah itu, jalankan game untuk memastikan tidak tergores dan lakukan penyesuaian.