Laksanakan pengesanan hit dengan peta jubin

Laman dikemaskini :
Tarikh penciptaan halaman :

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.

Apakah prasyarat untuk petua ini?

Mengenai meminjam bahan peta

Kami memproses pinjaman dari laman web berikut.

Pelaksanaan watak berjalan

Pertama, laksanakan peta dan watak yang melakukan pengesanan hit. Watak ini boleh dipindahkan dengan kekunci kursor pada papan kekunci. Walau bagaimanapun, jika anda melaksanakan berjalan kaki yang betul, ia akan panjang dan jauh dari intipati petua buku, jadi kali ini saya hanya akan memindahkan satu gambar yang mudah.

Jika anda ingin melaksanakan animasi berjalan, lihat petua berikut:

Selepas anda mencipta projek, tambah imej sprite objek yang anda ingin alihkan ke projek.

Pilih imej dan tetapkan Pixel Per Unit kepada 32 daripada Pemeriksa. Ini kerana saiz satu persegi mapchip adalah 32 piksel, jadi ia sesuai dengan itu. Setelah dikonfigurasikan, klik butang "Terapkan" di bawah.

Letakkan sprite dalam pandangan.

Buat skrip untuk mengalihkan sprite. Ini serupa dengan petua berikut:

Tinggalkan nama Player skrip sebagai .

Kod seperti 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 kepada sprite yang anda mahu bergerak.

Jalankan permainan dan semak sama ada anda mahu mengalihkannya dengan papan kekunci.

Menyediakan Petua Peta

Pertama sekali, kami akan menyediakan mapchip dan membuat peta. Prosedur ini serupa dengan petua berikut: MapTips dengan 2D Tilemap Extras juga mampu mengesan perlanggaran, tetapi ia tidak akan digunakan dalam artikel ini kerana prosedurnya akan panjang.

Sediakan imej asal Petua Peta dan tambahkannya pada projek anda. Untuk menjadikan operasi lebih mudah difahami, sila sediakan "tempat berjalan kaki" dan "tempat yang tidak boleh berjalan" untuk bahan cip peta.

Sediakannya untuk MapChips dalam Pemeriksa dan klik butang Guna. Setelah dikonfigurasikan, buka Editor Sprite.

Ia adalah petua peta 32 piksel, jadi saya akan membahagikannya pada 32.

Pilih tab palet Jubin. Jika tidak, paparkan dengan "Tetingkap > 2D -> Palet Jubin" dari menu. Buat palet baharu. Nama itu sewenang-wenangnya, tetapi buat masa ini kami akan memanggilnya "MapChipPalette".

Buat folder MapChipPalette dalam Scenes dan nyatakannya.

Tambah petua peta dengan menyeretnya ke palet. Simpan dalam folder MapChipPalette yang anda buat sebelum ini.

Buat peta

Kali ini, penghakiman hit peta akan dilakukan dalam unit "Tilemap". Oleh itu, kami akan membuat dua Tilemaps, "Tilemap tanpa pengesanan hit" dan "Tilemap dengan pengesanan hit".

Pertama, buat dua Peta Jubin dalam hierarki. Anda boleh mencipta dua dalam Grid. Nama-namanya ialah "TilemapObeject" dan "TilemapGround" untuk kejelasan.

Pertama, buat "TilemapGround". Oleh kerana ia adalah julat bergerak, anda hanya boleh meletakkan tanah. Jika ia berada di atas tanah, anda boleh menukar corak.

Dengan cara ini, jika watak tersembunyi, pilih objek watak dan tetapkan susunan lapisan pemeriksa kepada Sprite Renderer 2. Tertib lapisan adalah 0 secara lalai dan Tilemap adalah 0, jadi jika anda meningkatkannya di atas nilai ini, ia akan dipaparkan di latar depan.

Kemudian pilih TilemapObject dan letakkan petua peta yang anda ingin buat tanpa bergerak. Tetapkan pesanan lapisan kepada 1 terlebih dahulu. Ini adalah untuk menjadikannya muncul di hadapan tanah.

Inilah rupanya jika anda menyembunyikan tanah.

Sudah tentu, pada ketika ini, tidak ada tetapan yang berkaitan dengan pengesanan perlanggaran, jadi anda boleh menunggang di tanah tinggi secara normal. Selepas ini, kami akan menetapkan pengesanan perlanggaran.

Tetapan Pengesanan Perlanggaran

Pertama, mari kita sediakan watak itu. Tetapan ini hampir sama dengan petua di bawah, jadi saya akan melangkau butiran dan menerangkan secara ringkas prosedur.

Pilih objek aksara daripada hierarki dan pilih Fizik 2D -> Circle Collider 2D daripada Tambah Komponen. Jika bentuk objek adalah segi empat tepat, "Box Collider 2D" adalah baik.

Begitu juga, tambah "Fizik 2D -> Rigidbody 2D".

Tetapkan skala graviti kepada 0 untuk mengelakkan Rigidbody 2D kejatuhan automatik.

Semak Z di bawah Kekangan untuk mengelakkan sprite berputar apabila bertembung.

Seterusnya, pilih "TilemapObject" yang anda mahu tekan dan pilih "Tilemap -> Tilemap Collider 2D" daripada "Tambah Komponen".

Itu sahaja yang ada padanya. Anda tidak memerlukan sebarang pengaturcaraan. Jalankan permainan dan cuba memukul objek yang menjadi dinding. Saya fikir anda boleh memastikan ia berhenti dengan betul.

Walau bagaimanapun, apabila anda benar-benar memukulnya, saya fikir akan ada perkara yang membimbangkan dalam tingkah laku itu. Berikut adalah beberapa penyelesaian:

Tingkah laku pengesanan hit yang menyusahkan dengan peta dan penyelesaian

Apabila anda memukul dinding, anda mungkin menemui beberapa perkara yang mengganggu anda.

Jika anda bergerak ke dinding, anda akan terperangkap di tengah-tengah

Box Collider 2D Saya fikir ia akan berlaku jika anda menggunakan objek.

Sebagai contoh, dari tempat kejadian di bawah, apabila anda menekan kekunci di kiri bawah, anda mahu ia bergerak ke kiri di sepanjang dinding. Walau bagaimanapun, selepas beberapa kemajuan, saya fikir ia akan terjebak dalam sesuatu dan berhenti.

Kenali penyok di dinding mengikut kedudukan

Circle Collider 2D Saya fikir ia mudah difahami jika anda melampirkan . Dinding harus rata, tetapi jika anda memindahkannya ke dinding, anda akan melihat bahawa dinding bergerak seolah-olah ia tidak rata.

Punca dan penyelesaian kepada snags dan benjolan

Sebab mengapa ini berlaku seolah-olah bahawa "penentuan hit dilakukan secara mapchip". Malah, apabila anda memilih TilemapObject, garis hijau muncul di tempat pengesanan hit terletak, dan anda dapat melihat bahawa ini adalah garis yang dilukis dalam unit MapTip.

Oleh itu, jika objek bergerak berada pada garis yang sama dengan satu cip peta, ia akan dinilai sebagai hit dengan satu cip peta. Jika anda bertembung di sempadan cip peta, dua cip peta akan dipukul dan dinilai, jadi kekuatan lantunan akan meningkat.

Saya fikir cara terbaik untuk menyelesaikan masalah ini adalah dengan menggabungkan pengesanan hit dengan mapchips yang dilampirkan. Berikut ialah cara untuk melakukannya:

PilihTilemap Collider 2D "TilemapObject" dengan pengesanan hit dari pemeriksa dan semak "Gunakan dalam komposit" daripada .

Seperti yang dinyatakan dalam amaran, ini sahaja tidak mempunyai kesan, jadi pilih "Fizik 2D -> Kollider Komposit 2D" daripada "Tambah Komponen".

Rigidbody 2D ditambah bersama-sama dengan Collider Komposit 2D.

Ia agak mengelirukan, tetapi saya fikir anda boleh mengesahkan bahawa garis hijau di sempadan antara mapchips dengan pengesanan hit telah hilang.

Saya tidak mahu peta jubin bergerak, jadi saya akan Rigidbody 2D meninggalkan jenis badan komponen sebagai "statik".

Sekarang jalankan permainan dan cuba gerakkannya. Saya fikir walaupun anda bergerak secara menyerong di sepanjang dinding, ia tidak akan ditangkap dan anda boleh bergerak dengan lancar tanpa pergerakan bergelombang.

Hilangkan watak menolak dari dinding

Anda dapat melihat bahawa jika anda menggerakkan watak untuk menolak dinding dan kemudian berhenti bergerak, ia akan berkelakuan seperti melantun kembali dari dinding.

Untuk menyelesaikan masalah ini,Rigidbody 2D pilih objek watak dan tukar "Pengesanan perlanggaran" kepada "Berterusan" dari komponen.

Perbezaan antara "tidak berterusan" dan "berterusan" adalah seperti berikut.

Tidak berterusan

Pengesanan perlanggaran adalah mekanisme yang berfikir selepas bergerak. Ia adalah satu bentuk yang melakukan pengesanan perlanggaran dari negeri di mana ia dipindahkan dan tertanam di dinding. Adalah mudah difahami jika anda mengaitkannya dengan trampolin dan getah, tetapi semakin banyak ia tertanam, semakin menjijikkan daya akan meningkat, dan melantun akan menjadi lebih kuat. Sebaliknya, pengiraan dilakukan selepas bergerak, jadi kos pemprosesan adalah rendah.

Berterusan

Ia diproses sambil menentukan apa yang sedang dalam perjalanan. Tentukan sama ada terdapat dinding antara kedudukan sebelum dan selepas bergerak, Sekiranya terdapat dinding, ia akan menilai perlanggaran di sana dan berhenti, jadi hampir tidak ada penolakan. Sebaliknya, kos pemprosesan meningkat sedikit kerana pengiraan dimasukkan ke dalam pertengahan pergerakan.

Tertangkap di sudut objek peta

Bergantung kepada program dan lokasi, ada yang ditangkap dan ada yang tidak, dan puncanya tidak banyak berubah. Dengan cara ini, ia berlaku dengan sudut sudut seperti Box Collider 2D, dan bukan dengan bulatan bulat.

Walaupun fenomena misteri seperti itu berlaku, adalah baik untuk mempunyai sudut bulat collider untuk mengelakkan snags. Ia terhad kepada Box Collider 2D, tetapi untuk menjadikannya bulat, komponen Box Collider 2D objek watak mempunyai "jejari tepi" dan anda meletakkan nilai di sana. Jika anda memasukkan 1 sebagai unit berangka, pembundaran akan berlaku untuk saiz objek. Ia bergantung pada saiz, tetapi ia adalah baik untuk meletakkan kira-kira 0.1.

Dengan cara ini, penghakiman hit meningkat hanya dengan saiz bulat, jadi sila sesuaikannya jika ia besar. Collider Kotak 2D mempunyai butang Collider Edit yang membolehkan anda mengubah saiznya secara langsung dalam pandangan dengan mengklik butang. Oleh kerana garis hijau luar adalah pengesanan hit sebenar, tetapkan saiz supaya ia tidak wajar.

Selepas itu, jalankan permainan untuk memastikan ia tidak tercalar dan membuat penyesuaian.