Anda di halaman 1dari 19

Game Development

Implementasi Pencarian jalan untuk AI agent dengan menggunakan NavMesh pada Unity

Tugas mencari Artikel Game Development di gamedev.net

Oleh Kelompok FantasyWork


Anggota :

Winto Junior Khosasih 161401093 Winto Junior Khosasih


Nur Ramadhani 161401141 DhaniKoto
Hensen Tia 161401096 HChenz
Sutan Gumala Farhan 161401114 gumala farhan

Fakultas Ilmu Komputer dan Teknologi Informasi


Ilkom 2016
Implementasi pencarian celah/jalur jalan untuk AI agent dengan NavMesh pada Unity di buat Oleh Ray
Barrera, Aung Sithu Kyaw dan Thet Naing Swe(pengedit) pada 13 Juni 2018 dipos oleh khawk
Dimana artikel ini merupakan kutipan dari buku “Unity 2017 Game AI Programming - Third
Edition” ditulis oleh Ray Barrera, Aung Sith Kyaw dan Thet Naing Swe dan dipublikasikan oleh packt
publishing. Buku ini memperlihatkan bagaimana cara menggunakan Unity 2017 untuk membuat entity
AI yang menyenangkan dan menakjubkan didalam game mu menggunakan A*, Fuzzy logic dan NavMesh

Mengikuti celah jalur dan kemudi


Terkadang , kita menginginkan karakter AI kita untuk dapat menjelajah keseluruh map di dunia game,
berdasarkan panduan jalan yang tidak beraturan atau melalui jalan yang beraturan. Sebagai contoh,
pada game balapan, AI sebagai musuh perlu untuk bisa menavigasi jalan raya yang dilalui. Pada game
RTS(Real Time Strategy), unitmu harus bisa mencapai titik yang kamu minta mereka untuk navigasikan
dimanapun mereka berada pada suatu terrain atau sekitar satu sama lain.

Agar terlihat cerdas, agent kita harus bisa menentukan kemana arah mereka pergi dan jika mereka
mencapai titik yang ditentukan , mereka harus bisa mencari rute yang paling efisien untuk dilalui dan
memodifikasi cara melalui rute jika ada halangan yang muncul ketika mereka melewatinya.

Menghindari halangan adalah perilaku yang paling sederhana yang mengizinkan entiti AI untuk
mencapai titik target. Ini adalah catatan terpenting sebagai perilaku yang di implementasikan post ini
yang berarti menggunakan perilaku untuk mensimulasikan keramaian, dimana tujuan utamanya adalah
setiap entity agent hanya harus menghindari agent lainnya dan mencapai target. Tanpa memikirkan
bagaimana cara paling efisien maupun jalur terpendek.

Technical Requirement
Memerlukan Unity 2017 terinstall pada sistem operasi Windows 7 SP1,8,10 yang masing – masing 64 bit
atau Mac OS X 10,9+. Code yang ada dibuku ini tidak akan dapat berjalan di Windows XP maupun Vista
dan versi Windows Server dan OS X yang belum teruji.

File kode dari pos ini dapat ditemukan di GitHub.Dapat juga mengecek video ini

Navigation Mesh
Mari kita mempelajari bagaimana cara menggunakan Unity built-in navigation Mesh generator yang
dapat membuat kemampuan mencari celah jalan kepada AI agent kita menjadi lebih mudah. Pada versi
awal di siklus Unity 5.x, NavMesh dibuat agar tersedia bagi semua pengguna (termasuk lisensi edisi
personal, yang mana pada versi sebelumnya merupakan fitur yang hanya ada di versi Unity Pro).
Sebelum Unity 2017.1 dirilis, sistem diperbaharui untuk mengizinkan workflow Component-based,
tetapi karena memerlukan untuk mengunduh Package tambahan, saat itu penulisan juga hanya tersedia
sebagai tinjauan saja, alhasil kita hanya terpaku pada Scene-Based workflow bawaan.Namun janga
khawatir, konsep ini sudah tidak ada lagi, dan ketika implementasi akhir pada akhirnya sampai ke versi
2017.x, seharusnya tidak ada peubahan drastic.

Untuk informasi lebih lanjut tentang komponen system Unirty NavMesh, silakan merujuk GitHub.
Sekarang , kita akan mendalami dan menjelajahi semua yang sistem ini tawarkan. AI Penemu celah jalan
memerlukan Scene dengan format tertentu; kami telah banyak melihat penggunaan Grid 2D (array)
untuk penemu celah jalan pada A* di map 2D. AI agent perlu mengetahui dimana letak halangan berada,
khususnya halangan yang statis. Berurusan dengan menghindari tabrakan secara dinamis memindahkan
objek terhadap subjek lainnya, yang pada dasarnya disebut perilaku berbelok/kemudi. Unity memiliki
built-in tool untuk menbangkitkan NavMesh yang merepresentasikan Scene yang memiliki konteks
masuk akal bagi AI agent kita unyuk mencari celah jalur paling optimum ke target. Buka demo projek
dan navigasi ke scene NavMesh untuk memulai.

Menginspeksi Map kami


Sekali kamu membuka scene demo projek kami, NavMesh akan terbuka dan akan memiliki tampilan
seperti ini :

A scene with obstacles and slopes

Ini adalah kotak pasir kami untuk menjelaskan dan menguji fungsionalitas sistem NavMesh. Pengaturan
umumnya sama seperi game RTS(Real Time Strategy). Kamu mengontrol tank biru. Cukup klik pada
lokasi tertentu untuk membuat tanknya bergerak ke lokasi baru tersebut. Indicator kuning adalah target
lokasi untuk tank saat ini.

Navigation Static
Hal pertama yang harus di dituju adalah kamu perlu menandai setiap Scene Geometry yang akan dibake
oleh NavMesh sebagai Navigation Static. Kamu dapat menemuinya ditempat lain, seperti di sistem Light-
Mapping Unity, sebagai contoh. Mengatur game object static itu mudah. Kamu dengan mudahnya
memberikan tanda checklist static untuk semua tujuan yang ada(seperti
navigasi,pencahayaan,pemantulan,dsb), atau kamu dapat memilih list dropdown untuk mengatur apa
saja yang mau distatickan(bukan semuanya). Pilihan alat ini dapat ditemukan di ujung kanan atas
inspector untuk objek yang terseleksi. Coba perhatikan ScreenShot ini untuk menjelaskan penjelasan
Navigation Static:

The Navigation Static property

Kamu dapat melakukan hal ini berdasarkan per-objek atau jika kamu memiliki hierarki bersarang pada
game objek di hierarki kamu, kamu dapat mengaplikasikan pengaturannya cukup ke orang tua(root) dari
hierarki dan unity secara otomatis akan memberlakukannya ke seluruh anak dari hierarki tersebut.

memBaked Navigation Mesh


Pengaturan navigasi untuk Navigation Mesh diaplikasikan via Navigation window pada Scene-Wide
basis. Kamu dapa membukanya lewat jendela dengan menavigasikannya ke Window|Navigation pada
menu bar. Seperti Window lainnya, kamu dapat melepasnya menjadi free-floating atau kamu hanya bisa
membiarkannya statis. Screenshot kami akan memperlihatkan kondisi statis/dock sebagai tab setelah
hierarki, tetapi kamu juga dapat meletakannya ditempat lain sesuai keinginanmu.

Dengan windows yang terbuka, kamu akan melihat 4 tab terpisah. Akan terlihat seperti Screenshot :
The Navigation window
Pada kasus kami Screenshot sebelumnya memperlihatkan Bake tab terseleksi, tetapi editormu mungkin
menteleksi salah satu tab lainnya pada bawaannya.

Mari kita perhatikan pada setiap tab, mulai dari yang kiri dan yang kanan,mulai dari tab agent , yang
mana akan terlihat seperti Screenshot berikut :

The Agents tab

Jika kamu bekerja pada projek yang berbeda, kamu akan menemukan beberapa pengaturan ini akan
berbeda dari apa yang kami atur di contoh projek dari Screenshot yang kami ambil. Pada tab paling atas
, kamu dapat melihat daftar dimana kamu dapat melihat tipe agent tambahan dengan menekan tomboh
“+”. Kamu juga dapat membuang agent tambahan ini dengan menyeleksinya dan menekan tombol “-“.
Windownya menyediakan visual yang bagus terhadap berbagai pengaturan yang kamu fokuskan. Mari
kita perhatikan apa yang tiap pengaturan lakukan:

 Name : nama dari tipe agent yang ditampilkan pada Dropdown Agent Type
 Radius : pikirkan tentang “wilayah pribadi” dari agent. Agent akan coba menghindari untuk
terlalu berdekatan dengan agen lainnya berdasarkan nilai ini , selagi digunakan sebagai
penghindaran.
 Tinggi : seperti yang kamu dapat perkirakan, ini adalah tinggi dari agent, yang mana dapat
dipakai sebagai penghindaran secara vertical.
 Step Height : nilai ini menentukan seberapa tinggi suatu halangan dari agent dapat memanjat
melewatinya.
 Max Slope : seperti yang akan kita bahas pada bagian selanjutnya, nilai ini menentukan sudut
maksimum yang dapat dipanjat agent. Ini dapat digunakan untuk membuat wilayah loncatan
dari map yang tidak dapat diakses oleh agent.

Selanjutnya , kita memiliki tab Area, yang mana akan terlihat seperti Screenshot :

Seperti yang dapat kamu lihat diScreenshot diatas , Unity menyediakan tipe area bawaan yang tidak
dapat diedit seperti : Walkable, Not Walkable dan Jump. Sebagai tambahan dari penamaan dan
pembuatan area baru, kamu dapat memasukkan harga bawaan pada arean ini.

Area menyajikan dua tujuan : membuat area yang dapat diakses maupun yang yang tidak dapat diakses
per Agent, dan menandai area yang tidak diinginkan dalam hal Navigation Cost. Sebagai contoh, kamu
memiliki game RPG dimana musuh iblis tidak dapat memasuki wilayah yang ditandai sebagai “Tanah
Suci” kamu juga dapat menandai bagian dari peta sebagai “paya” atau “rawa” yang mana agent kamu
dapat hindari didasari harganya.
Tab ketiga , Bake , barang kali merupakan yang paling penting. Ini mengizinkanmu untuk menciptakan
NavMesh yang aktual untuk scenemu. Kamu akan mengenali beberapa pengaturan. Tab Bake akan
terlihat seperti ini :
The Bake tab

Pengaturan ukuran agent pada tab ini mendikte bagaimana agent akan berinteraksi dengan
lingkunganya, dimana pengaturan dari tab agent mendikte bagaimana mereka berinteraksi dengan
agent lainnya dan memindahkan objek, tetapi mereka mengontrol parameter yang sama, jadi kita akan
melewati hal ini dari sini. Drop Height dan Jump Distance mengontrol seberapa jauh sebuah agent dapat
“Melompat” untuk mencapai porsi NavMesh yang tidak secara langsung terkoneksi terhadap agent yang
sekarang ini. Kita akan membahas lebih detail pada bagian selanjutnya. Jadi jangan berkeringat dulu jika
kamu tidak mengerti apa maksudnya.

Ini juga termasuk pengaturan lanjutan dari apa yang ditampilkan pada bawaanya. Cukup mengklik
segitiga Drop-Down pada Advanced heading untuk menampilkan opsi ini. Kamu juga dapat memikirkan
pengaturan Manual Voxel Size untuk mengatur “kualitas”. Semakin kecil nilainya, maka akan semakin
detail Mesh yang dapat kamu tangkap. Min Region Area digunakan untuk melewati Platform Baking atau
permukaan dibawah dari mesh. Height Mesh memberikan kamu data vertical yang lebih detail ketika
memBake mesh. Sebagai contoh, membantu dalam melestarikan peletakan yang rata bagi agent ketika
memanjat tangga.

Tombol Clear akan menghapus data NavMesh yang ada pada scene, dan nilai dari tombol Bake akan
membuat mesh bagi scenemu. Process ini amat cepat. Selama kamu dalam kondisi window tersebut
terseleksi, kamu bisa melihat NavMesh dibuat oleh Tombol Bake di Scene viewmu. Cobalah dan tekan
Tombol Bake untuk melihat hasil. Dicontoh scene kami, kamu akan berakhir dengan sesuatu yang
menyerupai Screenshot dibawah :

Arena Biru merepresentasikan NavMesh. Kita akan membahas ulang hal ini nanti. Untuk sekarang ini,
mari lanjut ke tab Final, tab Object, yang mana akan terlihat seperti Screenshot ini:
Tiga tombol difoto pada Screenshot diatas, All,Mesh Renderers dan Terrains, berperan sebagai filter
terhadap scenemu. Ini amat berguna ketika bekerja pada scene complex dengan banyak objek dalam
hierarki. Memilih suatu opsi akan memfilter tipe dari hierarki mu untuk membuat mereka mudah
diseleksi. Kamu dapat menggunakan ini ketika mengutak atik scenemu untuk mencari objek yang
ditandai sebagai navigation static.

Menggunakan NavMesh agent


Sekarang kaena kita telah memiliki scene yang diatur oleh NavMesh, kita perlu sebuah cara agar agent
kita dapat menggunakan informasi ini. Untungnya bagi kita , Unity menyediakan komponen NavMesh
Agent yang dapat kita aplikasikan kekarakter. Scene contoh memiliki game object bernama tank dengan
komponen yang telah terlampir, coba lihat di hierarki dan akan terlihat seperti Screenshot ini :
Disini memilik cukup banyak pengaturan , dan kita tidak akan membahas semua, karena mereka
memiliki penjelasan sendiridan kamu dapat menemukan deskripsi penuh dari dokumentasi resmi Unity,
tetapi mari kita bahas bebarapa hal :

 Agent Type : ingat tab Agent pada Navigation Window? Agent type yang kamu definisikan
disalan akan dapat dipilih disini.
 Auto Traverse Off Mesh Link : Kita akan membahas Off Mesh Links nanti, tetapi pengaturan ini
mengizinkan agent untuk secara otomatis menggunakan fitur ini.
 Area Mask : area yang kamu atur di tab Areas dari Navigation Window akan dapat terseleksi
disini.

Dan itulah. Komponen mengendalikan 90% dari hal – hal berat bagimu: peletakan jalur, pencarian
jalur,penghindaran halangan, dan sebagainya. Satu hal yang kamu perlu sediakan bagi agent adalah
tujuan target. Mari kita bahas selanjutnya.

Mengatur Destinasi
Sekarang mari kita atur AI agent kita, kita perlu cara untuk memberitahu kemana arah untuk pergi.
Contoh projek kita menyediakan script bernama Target.cs dan hanya ini.

Class sederhana ini menyediakan tiga hal :

 Menembakan cahaya dari posisi asal kamera ke posisi Dunia Mouse menggunakan ray
 Memperbaharui posisi marker
 Memperbaharui property tujuan dari semua NavMesh agent

Code amat luruskedepan, seluruh kelas akan terlihat seperti ini :


using UnityEngine;
using UnityEngine.AI;

public class Target : MonoBehaviour


{
private NavMeshAgent[] navAgents;
public Transform targetMarker;

private void Start ()


{
navAgents = FindObjectsOfType(typeof(NavMeshAgent)) as NavMeshAgent[];
}

private void UpdateTargets ( Vector3 targetPosition )


{
foreach(NavMeshAgent agent in navAgents)
{
agent.destination = targetPosition;
}
}

private void Update ()


{
if(GetInput())
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;

if (Physics.Raycast(ray.origin, ray.direction, out hitInfo))


{
Vector3 targetPosition = hitInfo.point;
UpdateTargets(targetPosition);
targetMarker.position = targetPosition;
}
}
}

private bool GetInput()


{
if (Input.GetMouseButtonDown(0))
{
return true;
}
return false;
}

private void OnDrawGizmos()


{
Debug.DrawLine(targetMarker.position, targetMarker.position +
Vector3.up * 5, Color.red);
}
}
Ada beberapa hal yang terjadi disini. Diawal method , kami menginisialisasi arrayNavAgent kita dengan
menggunakan method FindObjectOfType().

Method UpdateTargets() yang dijalankan melalui array NavAgent dan akan mengatur destinasi target
mereka terhadap Vector3 yang diberikan. Ini adalah kunci utama untuk membuatnya bekerja. Kamu
menggunakan mekanisme apapun yang kamu harap sebenarnya dapat mengambil nilai destinasi target,
dan semua yang kamu perlu lakukan agar agent dapat bergerak kesana adalah dengan mengatur field
NavMeshAgent.destination ; agent akan melakukan sisanya.

Contoh kami menggunakan klik untuk bergerak ke tujuan, jadi kapanpun pemain mengklik , kami
menembakkan sinar dari kamera ke world berdasarkan cursor mouse, dan jika mengenai sesuatu, kami
memasukkan posisi yang dikenai sebagai targetPosition baru bagi agent. Kami juga mengatur penanda
target berdasarkan visualisasi yang mudah dalah game terhadap destinasi target.

Untuk mengujinya, pastikan kamu telah memBake NavMesh seperti yang dideskripsikan bagian
sebelumnya, kemudian masuk ke mode Play, dan pilih area apapun di map. Jika kamu asal klik , kamu
akan menemukan bahwa ada beberapa area Agent tidak dapat capai yakni, atas kubus merah, puncak
dari platform dan platform dibagian bawah.

Pada kasus kubus merah, mereka terlalu tinggi. Jalan menuju puncak teratas platform terlalu berjarak,
seperti yang kita atur pada Max Slope, dan agent tidak dapat memanjat melewatinya. Screenshot
berikut mengilustrasikan bagaimana pengaturan Max Slope dapat mempengaruhi NavMesh:

NavMesh dengan nilai Max Slope di set ke 45

Jika kau mengubah-ubah Max Slope menjadi nilai seperti 51, kemudian tekan tombol Bake lagi untuk re-
Bake NavMesh, maka akan menghasilkan hasil seperti ini :
NavMesh with the max slope value set to 51

Seperti yang kamu lihat, kamu dapat mengubah – ubah level desain untuk membuat seluruh area tidak
dapat diakses oleh rentang dengan nilai perubahan yang sederhana. Sebagai contoh ini akan amat
berguna jika kamu memiliki platform atau birai yang kamu peru tali, tangga atau elevator untuk
menggapainya. Mungkin bahkan perlu Skill Special, seperti kemampuan untuk memanjat? Saya akan
membiarkanmu berimajinasi terhadap pekerjaan dan memikirkannya dengan cara yang menyenangkan
untuk menggunakannya.

Memahami Off Mesh Links


Kamu mungkin telah menemukan bahwa didalam scene kami terdapat dua lubang. Yang pertama dapat
diakses oleh agent kita, tetapi yang satu lagi dekat dengan bawah layar terlalu jauh. Ini tidak terlalu
semena – mena. Unity Off Mesh Links secara efektif dapat menjembatani kedua lubang antara segment
dari NavMesh yang tidak terhubung. Kamu dapat melihat koneksi ini melalui editor, seperti yang
diperlihatkan Screenshot selanjutnya :
Lingkaran biru dengan haris yang terhubung adalah Link

Ada dua cara dalam Unity untuk membuat Link ini. Yang pertama telah saya jelaskan sebelumnya. Ingat
tentang nilai Jump Distance didalam tab Bake pada Navigation Window? Unity secara otomatis
menggunakan nilai tersebut untuk membangkitkan link untuk kita ketika Baking NavMesh. Cobalah
mengeser nilai dari test Scene kami menjadi 5 dan re-Baking. Terlihatkah bagaimana sekarang platform
terhubungkan? Ini karena adanya mesh – mesh didalam Threshold yang baru kita spesifikasikan.

Atur nilai kembali menjadi 2 lalu re-Bake. Sekarang, mari kita perhatikan method kedua. Untuk
membuat sphere yang akan digunakan untuk menghubungkan kedua platform. Letakkan mereka sesuai
dengan posisi yang ditunjukkan Screenshot berikut :
Kamu mungkin sudah mulai paham ini untuk apa, tetapi mari kita pahami dulu proses bagaimana ini
dapat terkoneksi. Pada kasus ini, saya telah menamai sphere yang disebelah kanan sebagai start dan
sphere yang disebelah kiri sebagai end. Kamu dapat memahaminya sesaat lagi, selanjutnya , masukkan
komponen Off Mesh Link pada platform sebelah kanan (relative terhadap screenshot diatas
sebelumnya). Kamu akan menemukan pada component memiliki field start dan end. Seperti yang dapat
kamu duga, kita akan memasukkan nilai sphere yang kita buat tadi sesuai dengan slot yang tersedia –
sphere start dimasukkan kedalam field start dan sphere end dimasukkan kedalam field end.
Inspektornya akan terlihat sebagai berikut :

Nilai dari Cost Override akan berpengaruh ketika kamu mengatur nilainya menjadi positif. Ini akan
mengaplikasikan nilai pengali menggunakan link ini, sebagai kebalikkannya, berpotensi, memberi harga
rute lebih efektif ke target.

Nilai dari Bi Directional mengizinkan agent untuk berpindah dua arah ketika di atur True. Kamu dapat
mengubah ini menjadi off untuk menciptakan one-way link pada level designmu. Nilasi Activated sesuai
dengan yang disebutkan. Ketika diset salah , agent akan mengabaikan link ini. Kamu dapat
mengubahnya menjadi on atau off untuk menghasilkan scenario gameplay dimana pemain harus
mengenai switch untuk mengaktifkannya.

Kamu tidak harus mere-Bake untuk mengaktifkan link. Coba lihat NavMesh mu dan kamu akan
menemukan bahwa ini akan terlihat seperti screenshot berikut :

Seperti yang kamu lihat, lubang terkecil masih bisa secara otomatis terhubung, dan sekarang kami
memiliki link baru untuk membangkitkan komponen Off Mesh Link kita antara dua sphere. Masuk ke
mode play dan click pada platform yang paling jauh dan sesuai yang dikira agent sekarang dapat
menavigasikan ke platform yang terpisah, seperti yang dapat dilihat pada Screenshot berikut :
Pada levelmu sendiri, kamu perlu mengubah – ubah pengaturan ini untuk mendapatkan hasil sesuai
yang kamu inginkan, tetapi menggabungkan fitur ini memberikanmu pengetahuan diluar dari kotak yang
ada(diluar konteks). Kamu dapat memiliki game sederhana yang dapat berjalan dengan cukup cepat
menggunakan fitur NavMesh Unity.

Tutorial ini merupakan bagian dari kutipan buku “Unity 2017 Game AI Programming - Third Edition”
ditulis oleh Ray Barrera, Aung Sithu Kyaw dan Thet Naing Swe dan dipublikasikan oleh Pack Publishing.

Anda mungkin juga menyukai