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 Awakedimulai pada awal permainan dan menonaktifkanropeJoint(komponen DistanceJoint2D). Ini juga mengaturplayerPositionke posisi saat ini dari pemain.
- Ini adalah bagian terpenting dari loop Update()utama. Pertama, kita mendapatkan posisi kursor mouse di dunia menggunakanScreenToWorldPointkameraScreenToWorldPoint. Lalu kami menghitung arah pandangan kami dengan mengurangi posisi pemain dari posisi mouse di dunia. Kemudian kami menggunakannya untuk membuataimAngle, yang merupakan representasi dari sudut bertujuan kursor. Nilai menyimpan nilai positif dalam konstruk if.
- aimDirectionadalah 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 ropeAttachedtrue, 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 ropeAttachedsalah.
- 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 ropePositionsdanropePositionsuntuk setiap posisi (kecuali yang terakhir), menetapkan posisi vertex dari baris renderer ke nilai posisi Vector2 yang disimpan oleh indeks loop dalam daftarropePositions.
- 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 ropeJointsama dengan jarak antara pemain dan posisi tali saat ini, yang kamiropeJointdalam 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 elseini 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 wrapPointsLookupuntuk 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. KamuswrapPointsLookupjuga diperbarui. Akhirnya, flagdistanceSetdiatur ulang sehingga metodeUpdateRopePositions()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 isSwingingsehingga 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 dalamif(!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; 
climbSpeedakan mengatur kecepatan di mana siput dapat bergerak ke atas dan ke bawah tali, dan isCollidingakan 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..elseifmembaca input di sepanjang sumbu vertikal (atas / bawah atau W / S pada keyboard), dan, dengan mempertimbangkan bendera, ropeAttached iscCollidingmenambah 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 isCollidingnilai pada bendera true. Ini berarti bahwa ketika siput menyentuh batu, bendera isColliding diberi nilai true.Metode ini OnTriggerExit2Ddipicu ketika satu collider meninggalkan area collider lain, mengatur flag ke false.Perlu diingat: metode OnTriggerStay2Dini 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.