Kait kucing menambah mekanisme yang menyenangkan dan menarik ke gim ini. Anda dapat menggunakannya untuk bergerak melewati level, bertarung di arena, dan mendapatkan item. Namun terlepas dari kesederhanaan yang tampak, fisika manajemen tali dan penciptaan perilaku realistis bisa jadi menantang!
Di bagian pertama tutorial ini, kami menerapkan sistem hook-cat dua dimensi kami sendiri dan mempelajari yang berikut:
- Buat sistem yang bertujuan.
- Gunakan penyaji garis dan sambungan jarak untuk membuat tali.
- Kami akan mengajarkan tali untuk membungkus benda-benda permainan.
- Hitung sudut ayunan pada tali dan tambahkan kekuatan ke arah itu.
Catatan : tutorial ini ditujukan untuk pengguna mahir dan berpengalaman, dan tidak mencakup topik seperti menambahkan komponen, membuat skrip GameObject baru, dan sintaksis C #. Jika Anda perlu meningkatkan keterampilan Unity Anda, lihat tutorial Memulai Penggunaan dengan Unity dan Pengantar Script Unity kami . Karena DistanceJoint2D digunakan dalam tutorial ini, Anda juga harus melihat melalui Joint Fisika di Unity 2D , dan hanya kemudian kembali ke tutorial ini.
Mulai bekerja
Unduh
konsep untuk tutorial ini dan kemudian buka di editor Unity. Unity 2017.1 atau lebih tinggi diperlukan untuk pengoperasian.
Buka adegan
Game dari folder
Adegan dan lihat di mana kita akan mulai:
Untuk saat ini, kami memiliki karakter pemain sederhana (siput) dan batu tergantung di udara.
Komponen penting dari GameObject
Player sejauh ini adalah capsule collider dan rigidbody, yang memungkinkannya berinteraksi dengan objek fisik di level tersebut. Juga, skrip gerak sederhana (
PlayerMovement ) dilampirkan ke karakter, yang memungkinkannya untuk meluncur di tanah dan melakukan lompatan sederhana.
Tekan tombol
Main untuk memulai permainan, dan cobalah untuk mengontrol karakter.
A dan
D gerakkan ke kiri / kanan, dan ketika Anda menekan
bilah spasi, itu akan melompat. Cobalah untuk tidak tergelincir dan jatuh dari tebing, jika tidak Anda akan mati!
Kami sudah memiliki dasar-dasar manajemen, tetapi masalah terbesar sekarang adalah kurangnya kait kucing.
Membuat Kait dan Tali
Pada awalnya, sistem kait-kait tampaknya cukup sederhana, tetapi untuk penerapannya yang berkualitas tinggi, perlu mempertimbangkan banyak aspek. Berikut adalah beberapa persyaratan untuk mekanisme kait kucing dua dimensi:
- Line Renderer untuk menampilkan tali. Ketika tali membungkus benda-benda, kita bisa menambahkan lebih banyak ruas ke garis renderer dan menempatkan simpul pada titik-titik yang sesuai dengan putusnya tali.
- DistanceJoint2D. Hal ini dapat digunakan untuk memasang titik jangkar kait kucing saat ini sehingga siput kami dapat berayun. Hal ini juga memungkinkan kita untuk mengatur jarak yang dapat digunakan untuk memperpanjang dan mengurangi tali.
- Child GameObject dengan RigidBody2D, yang dapat dipindahkan tergantung pada lokasi saat ini titik jangkar kail. Intinya, itu akan menjadi titik suspensi / jangkar tali.
- Raycast karena melempar kail dan menempel pada benda.
Pilih objek
Player di Hierarchy dan tambahkan GameObject anak baru bernama
RopeHingeAnchor . GameObject ini akan digunakan untuk memposisikan titik suspensi / jangkar kait kucing.
Tambahkan komponen
SpriteRenderer dan
RigidBody2D ke
RopeHingeAnchor .
Untuk SpriteRenderer, setel properti
Sprite untuk menggunakan nilai
UISprite dan ubah
Order in Layer menjadi
2 . Nonaktifkan komponen dengan
menghapus centang pada kotak di sebelah namanya.
Untuk komponen
RigidBody2D, setel properti Tipe Tubuh ke
Kinematik . Titik ini akan dipindahkan bukan oleh mesin fisik, tetapi oleh kode.
Pilih layer
Rope dan atur nilai komponen X dan Y Transform ke
4 .
Pilih
Player lagi dan lampirkan komponen
DistanceJoint2D baru.
Seret
RopeHingeAnchor dari Hierarchy ke properti
Connected Rigid Body dari komponen
DistanceJoint2D dan matikan
Auto Configure Distance .
Buat skrip C # baru yang disebut
RopeSystem di folder proyek
Scripts dan buka di editor kode.
Hapus metode
Update
.
Di bagian atas skrip di dalam
RopeSystem
kelas
RopeSystem
tambahkan variabel baru, metode
Awake()
dan metode
Update
baru:
Mari kita menganalisis setiap bagian dalam urutan:
- Kami menggunakan variabel-variabel ini untuk melacak berbagai komponen yang akan berinteraksi dengan skrip RopeSystem.
- Metode
Awake
dimulai pada awal permainan dan menonaktifkan ropeJoint
(komponen DistanceJoint2D). Ini juga mengatur playerPosition
ke posisi saat ini dari pemain. - Ini adalah bagian terpenting dari loop
Update()
utama. Pertama, kita mendapatkan posisi kursor mouse di dunia menggunakan ScreenToWorldPoint
kamera ScreenToWorldPoint
. Lalu kami menghitung arah pandangan kami dengan mengurangi posisi pemain dari posisi mouse di dunia. Kemudian kami menggunakannya untuk membuat aimAngle
, yang merupakan representasi dari sudut bertujuan kursor. Nilai menyimpan nilai positif dalam konstruk if. aimDirection
adalah twist yang berguna nanti. Kami hanya tertarik pada nilai Z, karena kami menggunakan kamera 2D, dan ini adalah satu-satunya OS yang sesuai. Kami melewatkan aimAngle * Mathf.Rad2Deg
, yang mengubah sudut radian menjadi sudut dalam derajat.- Posisi pemain dimonitor menggunakan variabel nyaman yang memungkinkan Anda untuk tidak terus-menerus merujuk pada
transform.Position
. Posisi. - Akhirnya, kami memiliki konstruksi
if..else
, yang akan segera kami gunakan untuk menentukan apakah tali tersebut terpasang ke titik jangkar.
Simpan skrip dan kembali ke editor.
Lampirkan komponen
RopeSystem ke objek Player dan gantung berbagai komponen pada bidang publik yang kami buat dalam skrip
RopeSystem . Seret
Player ,
Crosshair , dan
RopeHingeAnchor ke dalam bidang yang sesuai:
- Rope Hinge Anchor : RopeHingeAnchor
- Rope Joint : Player
- Crosshair : Crosshair
- Crosshair Sprite : Crosshair
- Gerakan Pemain: Pemain
Sekarang kami hanya melakukan semua perhitungan rumit ini, tetapi sejauh ini tidak ada visualisasi yang dapat menunjukkannya dalam tindakan. Tapi jangan khawatir, kami akan segera melakukannya.
Buka skrip
RopeSystem dan tambahkan metode baru ke dalamnya:
private void SetCrosshairPosition(float aimAngle) { if (!crosshairSprite.enabled) { crosshairSprite.enabled = true; } var x = transform.position.x + 1f * Mathf.Cos(aimAngle); var y = transform.position.y + 1f * Mathf.Sin(aimAngle); var crossHairPosition = new Vector3(x, y, 0); crosshair.transform.position = crossHairPosition; }
Metode ini memposisikan penglihatan berdasarkan tujuan yang ditransmisikan (nilai float yang kami hitung dalam
Update()
) sehingga berputar di sekitar pemain dengan radius 1 unit. Kami juga menyertakan ruang lingkup sprite jika belum dilakukan.
Di Update()
kami mengubah konstruksi !ropeAttached
untuk memeriksa !ropeAttached
sehingga terlihat seperti ini:
if (!ropeAttached) { SetCrosshairPosition(aimAngle); } else { crosshairSprite.enabled = false; }
Simpan skrip dan jalankan game. Sekarang siput kita harus bisa membidik dengan pandangan.
Bagian logika berikutnya yang perlu diimplementasikan adalah bidikan kucing-pengait. Kami telah menentukan arah tujuan, jadi kami membutuhkan metode yang akan menerimanya sebagai parameter.
Tambahkan variabel berikut di bawah variabel dalam skrip
RopeSystem :
public LineRenderer ropeRenderer; public LayerMask ropeLayerMask; private float ropeMaxCastDistance = 20f; private List<Vector2> ropePositions = new List<Vector2>();
LineRenderer akan berisi tautan ke renderer garis yang menarik tali.
LayerMask memungkinkan Anda untuk menyesuaikan lapisan fisika yang dapat berinteraksi dengan kail. Nilai
ropeMaxCastDistance
menetapkan jarak maksimum yang bisa "ditembakkan" oleh raycast.
Akhirnya, daftar posisi Vector2 akan digunakan untuk melacak titik pembungkus tali, yang akan kita bahas nanti.
Tambahkan metode baru berikut:
Inilah yang dilakukan oleh kode di atas:
- HandleInput dipanggil dari loop
Update()
dan hanya meng-polling input dari tombol kiri dan kanan mouse. - Ketika klik kiri didaftarkan, garis tali dinyalakan dan siaran-2D ditembakkan dari posisi pemain ke arah tujuan. Jarak maksimum diatur sedemikian rupa sehingga kucing kait tidak dapat ditembak pada jarak tak terbatas, dan topeng diterapkan sehingga memungkinkan untuk memilih lapisan fisika yang dapat ditabrak oleh raycast.
- Jika hit raycast terdeteksi, maka
ropeAttached
true
, dan daftar posisi simpul tali diperiksa untuk memastikan bahwa tidak ada titik di sana. - Jika pengujian kembali benar, maka dorongan gaya kecil ditambahkan ke siput sehingga memantul di atas tanah,
ropeJoint
(DistanceJoint2D) dihidupkan, yang diatur ke jarak yang sama dengan jarak antara siput dan titik hit raycast. Sprite titik jangkar juga disertakan. - Jika raycast tidak mengenai apa pun, maka renderer baris dan ropeJoint dinonaktifkan, dan flag
ropeAttached
salah. - Jika tombol kanan mouse ditekan, metode
ResetRope()
, yang menonaktifkan dan mengatur ulang semua parameter terkait dengan tali / kait ke nilai yang seharusnya jika kait tidak digunakan.
Di bagian paling bawah dari metode
Update
kami, tambahkan panggilan ke metode
HandleInput()
dan berikan nilai
aimDirection
ke
aimDirection
:
HandleInput(aimDirection);
Simpan perubahan ke
RopeSystem.cs dan kembali ke editor.
Menambahkan tali
Siput kami tidak akan bisa terbang di udara tanpa tali, jadi inilah saatnya untuk memberikan sesuatu yang akan menjadi representasi visual dari tali dan memiliki kemampuan untuk "berbalik" di tikungan.
Pembuat baris sangat ideal untuk ini, karena memungkinkan kita untuk mentransfer jumlah poin dan posisinya di ruang dunia.
Idenya di sini adalah bahwa kita selalu menyimpan simpul pertama dari tali (0) di posisi pemain, dan semua simpul lainnya diposisikan secara dinamis ketika tali harus membungkus sesuatu, termasuk posisi engsel saat ini, yang merupakan titik berikutnya di sepanjang tali. dari pemain.
Pilih
Player dan tambahkan komponen
LineRenderer ke dalamnya. Tetapkan
Lebar ke
0,075 . Perluas daftar
Bahan dan, sebagai
Elemen 0, pilih bahan
RopeMaterial yang terletak di folder
Bahan proyek. Terakhir, untuk Pengurai Jalur, untuk
Mode Tekstur, pilih
Distribusikan Per Segmen .
Seret komponen Line Renderer ke bidang
Rope Renderer pada komponen
System Rope .
Klik pada daftar drop-down dari
Rope Layer Mask dan pilih sebagai lapisan mana Raycast
Default, Rope dan Pivot dapat berinteraksi. Karena itu, ketika "menembakkan" sebuah raycast, itu akan bertabrakan hanya dengan lapisan-lapisan ini, tetapi tidak dengan benda-benda lain, seperti seorang pemain.
Jika Anda memulai permainan sekarang, Anda akan melihat perilaku aneh. Ketika kami membidik sebuah batu di atas kepala siput dan menembak dengan kail, kami mendapat lompatan kecil ke atas, setelah itu teman kami mulai bersikap agak acak.
Kami belum menetapkan jarak untuk sambungan jarak, di samping itu, simpul dari render garis belum dikonfigurasi. Oleh karena itu, kita tidak melihat tali, dan karena jarak sambungan langsung di atas posisi siput, nilai jarak jarak sendi saat ini mendorongnya ke batu di bawahnya.
Tapi jangan khawatir, sekarang kami akan menyelesaikan masalah ini.
Dalam skrip
RopeSystem.cs, tambahkan operator baru di awal kelas:
using System.Linq;
Ini memungkinkan kami untuk menggunakan kueri LINQ, yang dalam kasus kami cukup memungkinkan kami untuk dengan mudah menemukan elemen pertama atau terakhir dari daftar
ropePositions
.
Catatan : Language-Integrated Query (LINQ) adalah nama dari serangkaian teknologi yang didasarkan pada kemampuan permintaan penyertaan langsung di C #. Anda dapat membaca lebih lanjut di sini .
Tambahkan variabel pribadi bool baru yang disebut
distanceSet
bawah variabel lain:
private bool distanceSet;
Kami akan menggunakan variabel ini sebagai bendera sehingga skrip dapat mengenali bahwa jarak tali (untuk titik antara pemain dan titik referensi saat ini di mana kait kucing terpasang) diatur dengan benar.
Sekarang tambahkan metode baru yang akan kita gunakan untuk mengatur posisi simpul tali untuk merender garis dan mengatur jarak sambungan jarak jauh dalam daftar posisi tersimpan dengan tali (
ropePositions
):
private void UpdateRopePositions() {
Jelaskan kode yang ditunjukkan di atas:
- Keluar dari metode jika tali tidak terpasang.
- Kami menetapkan nilai poin render dari garis tali ke jumlah posisi yang disimpan di
ropePositions
, ditambah 1 lebih (untuk posisi pemain). - Kami melingkari daftar
ropePositions
dan ropePositions
untuk setiap posisi (kecuali yang terakhir), menetapkan posisi vertex dari baris renderer ke nilai posisi Vector2 yang disimpan oleh indeks loop dalam daftar ropePositions
. - Tetapkan ke titik jangkar tali yang kedua dari posisi ujung tali, di mana titik engsel / jangkar saat ini harus, atau jika kita hanya memiliki satu posisi tali, maka jadikan sebagai titik jangkar. Jadi kami mengatur jarak
ropeJoint
sama dengan jarak antara pemain dan posisi tali saat ini, yang kami ropeJoint
dalam lingkaran. - Konstruksi if menangani kasus di mana posisi tali saat ini di loop adalah yang kedua dari ujung; yaitu titik di mana tali terhubung ke objek, yaitu titik engsel / jangkar saat ini.
- Pegangan blok
else
ini menetapkan posisi simpul terakhir dari tali dengan nilai posisi pemain saat ini.
Ingatlah untuk menambahkan panggilan
UpdateRopePositions()
di akhir
Update()
UpdateRopePositions()
:
UpdateRopePositions();
Simpan perubahan pada skrip dan jalankan game lagi. Buat "ruang kecil" lompatan kecil dengan membidik dan menembak dengan kait pada batu di atas karakter. Sekarang Anda dapat menikmati hasil kerja Anda - siput itu bergoyang dengan tenang di atas batu.
Sekarang Anda dapat pergi ke jendela adegan, pilih Player, gunakan alat pindahkan (secara default, tombol
W ) untuk memindahkannya dan menonton bagaimana dua simpul dari garis tali membuat mengikuti posisi kait dan posisi pemain untuk menarik tali. Setelah kami melepaskan pemain, DistanceJoint2D dengan benar menghitung jarak dan siput akan terus mengayun pada engsel yang terhubung.
Menangani Poin Bungkus
Bermain dengan siput yang berayun sejauh ini tidak lebih berguna daripada handuk anti air, jadi kita pasti perlu menambahkannya.
Kabar baiknya adalah bahwa metode yang baru ditambahkan untuk memproses posisi tali dapat digunakan di masa depan. Sejauh ini kami hanya menggunakan dua posisi tali. Satu terhubung ke posisi pemain, dan yang kedua ke posisi saat ini titik jangkar kail saat menembaknya.
Satu-satunya masalah adalah bahwa sementara kita tidak melacak semua posisi potensial dari tali, dan ini membutuhkan sedikit usaha.
Untuk mengenali posisi pada batu di mana tali harus dibungkus, menambahkan posisi simpul baru ke renderer garis, kita membutuhkan sistem yang menentukan apakah titik simpul collider berada di antara garis lurus antara posisi siput saat ini dan titik engsel / jangkar tali saat ini.
Sepertinya ini berfungsi lagi untuk siaran lama yang bagus!
Pertama, kita perlu membuat metode yang dapat menemukan titik terdekat dalam collider berdasarkan pada hit point dari raycast dan tepi collider.
Tambahkan metode baru ke skrip
RopeSystem.cs :
Jika Anda tidak terbiasa dengan query LINQ, maka kode ini mungkin tampak seperti semacam sihir C # yang rumit.
Jika demikian, maka jangan takut. LINQ melakukan banyak pekerjaan untuk kami:
- Metode ini mengambil dua parameter - objek RaycastHit2D dan objek PolygonCollider2D . Semua batu di tingkat memiliki collider PolygonCollider2D, jadi jika kita selalu menggunakan bentuk PolygonCollider2D, itu akan berfungsi dengan baik.
- Di sinilah keajaiban permintaan LINQ dimulai! Di sini kita mengubah kumpulan titik dari collider poligonal ke dalam kamus posisi Vector2 (nilai setiap elemen kamus adalah posisi itu sendiri), dan kunci dari masing-masing elemen diberi nilai jarak dari titik ini ke posisi pemain pemain (nilai float). Kadang-kadang sesuatu yang lain terjadi di sini: posisi yang dihasilkan dikonversi ke ruang dunia (secara default, posisi simpul collider disimpan di ruang lokal, mis., Relatif lokal ke objek yang dimiliki collider, dan kami membutuhkan posisi di ruang dunia).
- Kamus diurutkan berdasarkan kunci. Dengan kata lain, dengan jarak terdekat dengan posisi pemain saat ini. Jarak terdekat dikembalikan, yaitu, setiap titik yang dikembalikan oleh metode ini adalah titik collider antara pemain dan titik saat ini dari engsel tali!
Mari kita kembali ke skrip
RopeSystem.cs dan menambahkan variabel bidang pribadi baru di atas:
private Dictionary<Vector2, int> wrapPointsLookup = new Dictionary<Vector2, int>();
Kami akan menggunakannya untuk melacak posisi di mana tali dapat membungkus.
Di akhir metode
Update()
, temukan konstruk
else
yang berisi
crosshairSprite.enabled = false;
dan tambahkan yang berikut ini:
Jelaskan potongan kode ini:
- Jika beberapa posisi disimpan dalam daftar
ropePositions
, maka ... - Kami menembak dari posisi pemain ke arah pemain melihat posisi terakhir tali dari daftar - titik referensi di mana kail kucing terhubung ke batu - dengan jarak sinar yang sama dengan jarak antara pemain dan posisi titik referensi tali.
- Jika raycast bertabrakan dengan sesuatu, maka collider objek ini dengan aman dilemparkan ke tipe PolygonCollider2D . Meskipun itu adalah PolygonCollider2D yang benar, posisi vertex terdekat dari collider ini dikembalikan menggunakan metode yang kami tulis sebelumnya sebagai Vector2 .
- Itu diperiksa oleh
wrapPointsLookup
untuk memastikan bahwa posisi yang sama tidak dicentang lagi. Jika dicentang, maka kami membuang tali dan memotongnya, menjatuhkan pemain. - Kemudian daftar
ropePositions
: posisi ditambahkan di mana tali harus dibungkus. Kamus wrapPointsLookup
juga diperbarui. Akhirnya, flag distanceSet
diatur ulang sehingga metode UpdateRopePositions()
dapat mendefinisikan kembali jarak tali dengan panjang tali dan segmen yang baru.
Di
ResetRope()
tambahkan baris berikut sehingga kamus
wrapPointsLookup
dihapus setiap kali pemain memutus tali:
wrapPointsLookup.Clear();
Simpan dan luncurkan game. Tembak kait kucing ke batu di atas siput dan gunakan alat Pindahkan di jendela Adegan untuk memindahkan siput di atas beberapa tepian batu.
Begitulah cara kami mengajar tali untuk membungkus benda!
Tambahkan kemampuan goyang
Siput yang tergantung di tali cukup statis. Untuk mengatasinya, kita bisa menambahkan kemampuan berayun.
Untuk melakukan ini, kita perlu mendapatkan posisi tegak lurus dengan posisi berayun ke depan (ke samping), terlepas dari sudut di mana dia melihat.
Buka
PlayerMovement.cs dan tambahkan dua variabel publik berikut ke bagian atas skrip:
public Vector2 ropeHook; public float swingForce = 4f;
Variabel
ropeHook
akan diberi posisi apa pun di mana kait tali saat ini berada, dan
swingForce
adalah nilai yang kami gunakan untuk menambahkan gerakan ayunan.
Ganti metode
FixedUpdate()
baru:
void FixedUpdate() { if (horizontalInput < 0f || horizontalInput > 0f) { animator.SetFloat("Speed", Mathf.Abs(horizontalInput)); playerSprite.flipX = horizontalInput < 0f; if (isSwinging) { animator.SetBool("IsSwinging", true);
Perubahan utama di sini adalah bahwa bendera diperiksa terlebih dahulu isSwinging
sehingga tindakan dilakukan hanya ketika siput tergantung pada tali, dan kami juga menambahkan tegak lurus ke sudut siput, menunjukkan titik jangkar saat ini di bagian atas tali, tetapi tegak lurus terhadap arah ayunannya.- Kami mendapatkan vektor arah dinormalisasi dari pemain ke titik lampiran kait.
- Tergantung pada apakah siput berayun ke kiri atau kanan, arah tegak lurus dihitung menggunakan
playerToHookDirection
. Panggilan undian debug juga telah ditambahkan sehingga Anda dapat melihatnya di editor jika diinginkan.
Buka RopeSystem.cs dan tambahkan berikut ini di bagian atas blok lain di dalam if(!ropeAttached)
metode Update()
: playerMovement.isSwinging = true; playerMovement.ropeHook = ropePositions.Last();
Di blok if dengan desain yang sama, if(!ropeAttached)
tambahkan berikut ini: playerMovement.isSwinging = false;
Jadi kami menginformasikan skrip PlayerMovement bahwa pemain berayun, dan juga menentukan posisi tali terakhir (kecuali untuk posisi pemain) - dengan kata lain, titik jangkar tali. Ini diperlukan untuk menghitung sudut tegak lurus yang baru saja kita tambahkan ke skrip PlayerMovement.Ini seperti apa jika Anda menghidupkan gizmos dalam game yang sedang berjalan dan tekan A atau D untuk mengayun ke kiri / kanan:Menambahkan keturunan tali
Sementara kita tidak memiliki kemampuan untuk bergerak ke atas dan ke bawah tali. Meskipun dalam kehidupan nyata siput tidak bisa dengan mudah naik dan turun di sepanjang tali, tetapi ini adalah permainan di mana segala sesuatu dapat terjadi, bukan?Di bagian atas skrip RopeSystem, tambahkan dua variabel bidang baru: public float climbSpeed = 3f; private bool isColliding;
climbSpeed
akan mengatur kecepatan di mana siput dapat bergerak ke atas dan ke bawah tali, dan isColliding
akan digunakan sebagai bendera untuk menentukan apakah properti sambungan jarak tali sendi jarak dapat ditingkatkan atau dikurangi.Tambahkan metode baru ini: private void HandleRopeLength() {
Blok ini if..elseif
membaca input di sepanjang sumbu vertikal (atas / bawah atau W / S pada keyboard), dan, dengan mempertimbangkan bendera, ropeAttached iscColliding
menambah atau mengurangi jarak ropeJoint
, menciptakan efek memperpanjang atau memperpendek tali.Kami mengaitkan metode ini, menambahkan panggilannya ke akhir Update()
: HandleRopeLength();
Kami juga membutuhkan cara untuk mengatur bendera isColliding
.Tambahkan dua metode berikut ke bagian bawah skrip: void OnTriggerStay2D(Collider2D colliderStay) { isColliding = true; } private void OnTriggerExit2D(Collider2D colliderOnExit) { isColliding = false; }
Kedua metode ini adalah metode asli dari kelas dasar skrip MonoBehaviour.Jika Collider saat ini menyentuh objek fisik lain dalam gim, metode akan terus menyala OnTriggerStay2D
, memberikan isColliding
nilai pada bendera true
. Ini berarti bahwa ketika siput menyentuh batu, bendera isColliding diberi nilai true
.Metode ini OnTriggerExit2D
dipicu ketika satu collider meninggalkan area collider lain, mengatur flag ke false.Perlu diingat: metode OnTriggerStay2D
ini bisa sangat mahal secara komputasi, jadi gunakan dengan hati-hati.Ke mana harus pergi selanjutnya?
Mulai permainan lagi dan kali ini tekan tombol panah atau W / S untuk bergerak naik dan turun tali.Proyek yang sudah selesai dari bagian tutorial ini dapat diunduh di sini .Kami telah menempuh perjalanan panjang - dari siput-siput non-ayun ke moluska gastropoda cangkang bebas-akrobatik!Anda telah belajar cara membuat sistem membidik yang dapat menembakkan kait kucing pada benda apa pun yang memiliki tabrakan, melekat padanya dan secara bersamaan mengayunkannya, memutar tali dinamis di sekitar tepi benda! Kerja bagus.Namun, ada fungsi penting yang hilang di sini - tali tidak bisa "lepas" saat diperlukan.Di bagian kedua tutorial, kita akan menyelesaikan masalah ini.Tetapi jika Anda bersedia mengambil risiko, mengapa tidak mencoba melakukannya sendiri? Anda dapat menggunakan kamus untuk ini wrapPointsLookup
.