Tutorial Pencarian Rute ( Pathfinding ) Dengan Algoritma A* Di Unity Memakai Library Arongranberg
Mungkin teman sudah sanggup menduga, kenapa saya pajang gambar game lawas, pacman, sebagai pembukaan artikel ini. Yaa.. Karena memang tujuan kita di artikel ini yaitu menciptakan simple AI yang mempunyai sifat ibarat dengan aksara musuh dalam game pacman, yaitu sanggup mencari jalan untuk mencari objek tertentu kemanapun obyek tersebut bersembunyi.
Artikel ini tolong-menolong yaitu artikel lanjutan dari artikel pembuatan simple AI untuk mengikuti obyek tertentu yang pernah saya tulis sebelumnya disini. Namun kalau teman lihat pada artikel sebelumnya yang ada hanyalah aksara mengikuti player hanya dalam ruangan kosong tanpa ada halangan sama sekali. Coba lihat gambar di bawah
Kemudian pertanyaanya, bagaimana kalau arena berupa labirin atau mempunyai penghalang ibarat pada gambar di bawah? Pasti algoritma sederhana ibarat algoritma sebelumnya tidak sanggup menuntaskan ini dan dijamin akan terjadi banyak sekali tubrukan.
Jika arena berbentuk labirin atau mempunyai penghalang maka tentu diharapkan suatu algoritma tertentu biar AI yang mengejar tidak membentur tembok. Selain itu, aksara AI seharusnya juga sanggup tetapkan rute mana yang harus ditempuh biar pergerakan semakin realistis dan optimal.
Terdapat banyak sekali algoritma pencarian jalur ayng sanggup dipakai, sebut saja djikstra, A*, dsb. Namun pada artikel kali ini kami akan membahas algoritma A*, kenapa A* yang saya pilih alasannya yaitu di Unity telah tersedia extension arongranberg untuk memudahkan kita dalam menemukan jalur terpendek menggunakan algoritma A*. Adapun kalau Sobat ingin tahu apa itu algoritma A* dan bagaimana cara kerjanya silahkan baca artikel saya sebelumnya wacana algoritma A* untuk pencarian jalur terpendek.
Namun pada tutorial kali ini kita tidak terlalu membahas bagaimana cara kerja algoritma A* alasannya yaitu kita akan menggunakan library arongranberg. Dengan library ini kita cukup memilih dimana saja posisi node dan arongranberg akan mencari sendiri rute terdekat menggunakan algoritma A*. Ok.. Langsung saja kita coba, mari siapkan alat dan bahannya sbb :
- Game engine Unity yang sudah terinstall di PC. Adapun Unity sanggup di download disini.
- Extension Arongranberg sebagai extension unity untuk mencari jalur terpendek. Versi terbaru arongranberg sanggup di download di situs resminya disini. Namun untuk menghindari perbedaan cara, kalau Sobat ingin mendownload versi yang sama dengan tutorial ini (versi 3.2.5.1) maka sanggup di download disini.
- Project menciptakan simple AI yang pernah saya buat di tutorial sebelumnya disini. Adapun projectnya sanggup di download disini.
Oke kalau alat dan materi sudah siap mari eksklusif saja ita mulai percobaannya. Berikut yaitu step by step pembuatan aplikasi ini :
1. Buka project dan import arongranberg
Pertma buka project yang telah Sobat download pada alat & materi di step 3. Buka scene Main Scene pada folder _Scenes. Setelah dibuka maka tampilannya ibarat pada gambar di bawah.
Selanjutnya import library arongranberg dengan membukanya dan lakukan double klik
Import semua elemen maka di window project akan ditambahkan
2. Buat graph
Setelah project dan lib sanggup di import makan langkah selanjutnya dalah menciptakan graph. Ada beberapa jenis graph yang sanggup dibentuk di arongranberg, namun kali ini saya akan membahas yang paling gampang yaitu grid graph. Caranya buat empty game object dengan nama A*. Kemudian drag & drop script AStarPath ke dalam object A*.
Kemudian buat GridGraph pada object A*
Selanjutnya lakukan konfigurasi ibarat di bawah
Nilai-nilai dalam tutorial ini sanggup saja berbeda sesuai dengan luas arena. Silahkan mainkan sendiri ya nilai nilai width, depth, node size, dsb. Lihat-lihat sendiri apa efeknya, yang terang berkaitan dengan ukuran arena, banyaknya node dalam graph, dan letak center dari graph. Tempatkan sempurna di atas arena.Jika sudah diatur klik tekan ibarat pada gambar di bawah
Jika sudah di scan maka seharusnya risikonya yaitu ibarat pada gambar di bawah
Kotak-kotak merah pada gambar diatas menawarkan kawasan yang tidak sanggup dilewati atau illegal. Jika teman tidak menemukan kotak-kotak merah atau dengan kata lain penghalang tidak sanggup dideteksi maka coba mainkan variabel Erode Iteration dengan memperbesar nilainya. Semakin besar nilai Erode Iteration maka akan memperbesar kawasan terlarang. Jika semakin kecil maka penghalang tidak sanggup dideteksi.
Jika kita tengok lebih bersahabat maka player dan enemy juga akan dideteksi sebagai penghalang. Lihat gambar di bawah
Yang perlu kita lakukan yaitu membatasi hanya tembok, bangunan dan arena yang dideteksi oleh arongranberg, adapun lainnya tidak. Yang perlu kita lakukan yaitu memisahkan tembok dan arena pada layer yang berbeda, misal kita taruh dalam layer "Arena Collider". Lihat gambar di bawah
Kemudian pada bab Mask pada Collssion testing hanya kita centang bab Arena Collider
Maka risikonya player dan enemy tidak lagi dianggap sebagai penghalang. Lihat gambar di bawah
3. Buat aksara AI
Untuk menciptakan obyek yang menerapkan pathfinding kita daur ulang obyek pada proyek sebelumnya dengan cara remove script AICharacter pada object AI Character. Sekedar informasi bagi yang belum membaca artikel sebelumnya wacana simple AI. Object AI Character yaitu object aksara yang akan mengejar sasaran (player). Di dalam AI Character terdapat script AICharacter untuk mengikuti object. Disini kita tidak membutuhkan script ini sehingga kita perlu me-remove-nya.
Untuk mencari jalur script yang diharapkan yaitu Seeker. Kita drag & drop script seeker ke dalam AI Character
Kita biarkan script seeker (WARNING : Jangan pernah mengedit script Seeker kecuali benar-benar mengerti dan dibutuhkan). Kemudian kita buat script gres dengan nama AIPathFindingCharacterBehaviour. Adapun isi dari AIPathFindingCharacterBehaviour yaitu sbb :
using UnityEngine; using System.Collections; using System.Collections.Generic; using Pathfinding; public class AIPathfindingCharacterBehaviour : MonoBehaviour { public GameObject target; public float movingSpeed = 2f; //kecepatan berpindah public float turnSpeed = 0.05f; //kecapatan berbelok private Seeker seeker; void Start () { seeker = this.GetComponent(); seeker.pathCallback += OnPathComplete; //Jika pencarian complete maka memanggil method OnPathComplete. Fungsi pencarian cari seeker.StartPath StartCoroutine(RepeatSearchTarget(0.5f)); //Mencari sasaran setiap 0.5 detik. Semakin cepat repeat rate beban CPU semakin berat, kalau terlalu lambat saat sasaran berpindah tempat jalur tidak berubah } private Vector3 processedVectorPath; //Node dari path yang sedang di proses >> berelasi dengan vectorPath void Update () { if (Vector3.Distance(this.transform.position, processedVectorPath) < 1) { //Jika mencapai processedVectorPath, maka node yang di proses (processedVectorPath) yaitu node berikutnya (vectorPath[0]) if (vectorPath.Count > 0) { processedVectorPath = vectorPath[0]; vectorPath.RemoveAt(0); //me remove vectorpath[0] } } Vector3 gapPosition = processedVectorPath - this.transform.position; //Gap antara posisi AI dengan sasaran gapPosition = new Vector3(gapPosition.x, 0, gapPosition.z); //Nilai gap y dibentuk 0 biar AI mengabaikan posisi atas dan bawah (Y) dari sasaran dan hanya mengikuti arah ke kanan dan ke kiri (X dan Y) Quaternion lookRotation = Quaternion.LookRotation(gapPosition); //Rotasi untuk look atau melihat sasaran this.transform.rotation = Quaternion.Lerp(this.transform.rotation, lookRotation, turnSpeed); //Membuat rotasi berubah secara smooth menggunakan fungsi lerp dari rotasi awal ke rotasi tujuan lookRotasion this.transform.Translate(Vector3.forward * movingSpeed * Time.deltaTime); //Bergerak maju } private List vectorPath = new List(); //berisi kumpulan node dalam path >> node yang sedang di proses dimasukkan processedVectorPath private IEnumerator RepeatSearchTarget(float repeatRate) { while (true) { seeker.StartPath(this.transform.position, target.transform.position); //Mulai mencari path path >> lihat OnPathComplete yield return new WaitForSeconds(repeatRate); } } private void OnPathComplete(Path path) { //Pencarian selesai vectorPath = path.vectorPath; //hasil pencarian berupa kumpulan node dari path, ditampung dalam vectorPath processedVectorPath = vectorPath[0]; //ode yang sedang di proses dimasukkan processedVectorPath vectorPath.RemoveAt(0); //menghapus node pada vectorPath[0] dikarenakan telah di tampung di processedVectorPath untuk diproses } }
Kemudian kita masukkan script AIPathFindingCharacterBehaviourke dalam object AI Character dengan cara drag & drop.
Selanjutnya kita masukkan Player kedalam variabel sasaran dengan cara drag & drop.
Selanjutnya kita masukkan Player kedalam variabel sasaran dengan cara drag & drop.
3. Uji Coba
Selanjutnya tinggal uji coba deh semuanya. Klik tombol play dan jalankan program. Adapun risikonya kurang lebih yaitu ibarat pada gambar di bawah. Enemy akan mengejar player tanpa menabrak tembok.
Sobat sanggup menekan tombol-tombol arrow pada keyboard untuk menggerakkan player.
Mungkin cukup sekian tutorial yang sanggup saya sampaikan, project sanggup Sobat download pada link di final artikel ini. Jangan lupa untuk membaca artikel saya lainnya yaaa... Dan saya harap pengunjung sanggup tinggalkan komen, itung-itung biar rame. Hehehe... Kurang lebihnya saya mohon maaf, terima kasih telah membaca artikel ini tetap semangat dan terus berkarya... ^^
PROJECT :
http://www.4shared.com/zip/wwYLG27U/Pathfinding_arongranberg.html
Baca juga :
Belajar Algoritma A* Untuk Pencarian Jalur / Rute Terdekat
Extension Unity Sering Digunakan (Menurut Saya)
Sumber http://duniadigit.blogspot.com/
Selanjutnya tinggal uji coba deh semuanya. Klik tombol play dan jalankan program. Adapun risikonya kurang lebih yaitu ibarat pada gambar di bawah. Enemy akan mengejar player tanpa menabrak tembok.
Sobat sanggup menekan tombol-tombol arrow pada keyboard untuk menggerakkan player.
Mungkin cukup sekian tutorial yang sanggup saya sampaikan, project sanggup Sobat download pada link di final artikel ini. Jangan lupa untuk membaca artikel saya lainnya yaaa... Dan saya harap pengunjung sanggup tinggalkan komen, itung-itung biar rame. Hehehe... Kurang lebihnya saya mohon maaf, terima kasih telah membaca artikel ini tetap semangat dan terus berkarya... ^^
PROJECT :
http://www.4shared.com/zip/wwYLG27U/Pathfinding_arongranberg.html
Baca juga :
Belajar Algoritma A* Untuk Pencarian Jalur / Rute Terdekat
Extension Unity Sering Digunakan (Menurut Saya)