Cara Mendesain Behavior Tree untuk AI Karakter Game yang Kompleks

Membuat NPC yang bisa patroli mungkin sederhana. Masalah mulai muncul ketika karakter harus mengejar pemain, berlindung, mencari bantuan, mundur saat terluka, mengambil senjata, lalu kembali berpatroli ketika situasi aman.

Tanpa struktur AI yang rapi, logika seperti ini cepat berubah menjadi kumpulan kondisi yang sulit dirawat.

Memahami Cara Mendesain Behavior Tree membantu developer memecah perilaku kompleks menjadi cabang keputusan yang lebih terstruktur.

Hasilnya bukan hanya NPC yang terlihat pintar, tetapi juga sistem AI yang lebih mudah diperluas, diuji, dan diperbaiki selama produksi.

Pahami Cara Kerja Behavior Tree Sebelum Membuat Cabang

Behavior Tree merupakan struktur hierarkis yang mengatur bagaimana AI memilih dan menjalankan tindakan.

Secara umum, sebuah node dapat menghasilkan status seperti Success, Failure, atau Running. Status tersebut menentukan apakah tree melanjutkan ke node lain, mencoba strategi alternatif, atau mempertahankan tindakan yang sedang berlangsung.

BehaviorTree.CPP menjelaskan bahwa Sequence akan menjalankan child selama masing-masing mengembalikan Success. Jika salah satu gagal, Sequence berhenti dan menghasilkan Failure. Sebaliknya, Fallback atau Selector mencoba alternatif berikutnya ketika child sebelumnya gagal.

Konsep sederhana ini menjadi fondasi untuk membuat karakter jauh lebih kompleks.

Jangan langsung membuat puluhan node. Mulai dengan alur dasar seperti Patrol → Detect Threat → Engage → Return to Patrol, kemudian pecah setiap bagian secara bertahap.

Susun Prioritas dari Perilaku Paling Mendesak

Behavior Tree biasanya jauh lebih mudah dipahami jika cabangnya mengikuti tingkat prioritas.

Bayangkan NPC tentara mempunyai beberapa kemungkinan tindakan: menyelamatkan diri dari granat, menyerang pemain, mencari amunisi, atau melakukan patroli.

Menghindari granat tentu harus memiliki prioritas lebih tinggi dibanding patroli.

Struktur sederhananya dapat dibayangkan sebagai Selector utama yang mengevaluasi:

Emergency → Combat → Investigation → Routine

Jika kondisi Emergency gagal karena tidak ada ancaman langsung, AI mencoba Combat. Jika tidak ada musuh, tree bergerak ke Investigation, lalu Routine.

Urutan seperti ini membuat keputsan AI lebih mudah diprediksi developer tanpa membuat perilakunya terlihat terlalu kaku.

BehaviorTree.CPP juga menyebut Fallback sebagai pola yang dalam framework lain sering disebut Selector atau Priority karena sistem mencoba beberapa strategi sampai menemukan satu yang berhasil.

Gunakan Sequence untuk Memecah Tindakan Bertahap

Tidak semua perilaku bisa selesai dengan satu Task.

Misalnya NPC ingin menyerang pemain dari posisi berlindung. Karakter mungkin perlu menemukan cover, bergerak menuju posisi tersebut, memastikan target masih terlihat, menghadap pemain, lalu menembak.

Sequence cocok untuk proses seperti ini.

Secara konseptual:

Find Cover → Move to Cover → Face Target → Aim → Fire

Jika pencarian cover gagal, seluruh rangkaian bisa dianggap gagal dan Selector mencoba strategi lain, misalnya mundur atau melakukan flank.

Pendekatan ini lebih bersih daripada menaruh seluruh logic pada satu fungsi besar seperti CombatBehavior().

Buat Task Sesederhana Mungkin

Task idealnya memiliki satu tujuan jelas.

Node MoveToCover sebaiknya hanya menangani pergerakan menuju cover, bukan sekaligus memilih senjata, mengubah animasi, memanggil bala bantuan, dan menghitung damage.

Semakin kecil tanggung jawab setiap node, semakin mudah bagian tersebut digunakan kembali pada karakter lain.

Modularitas memang menjadi salah satu kekuatan utama Behavior Tree. Literatur akademis mengenai BT juga menekankan bahwa struktur hierarkis dan modular membantu mengelola sistem autonomous yang semakin kompleks.

Gunakan Blackboard sebagai Memori Kerja AI

Behavior Tree membutuhkan informasi tentang dunia sebelum bisa membuat keputusan.

Di sinilah Blackboard berperan.

Blackboard dapat menyimpan informasi seperti TargetActor, LastKnownPosition, HasAmmo, CurrentCover, HealthLow, atau SuspicionLevel.

Dalam Unreal Engine, Behavior Tree menggunakan Blackboard sebagai tempat menyimpan key yang kemudian dipakai cabang tree ketika menentukan tindakan. Dokumentasi Epic bahkan menggambarkan Blackboard sebagai semacam “brain” bagi Behavior Tree.

Pisahkan data dari decision logic.

Daripada membuat setiap node mencari pemain sendiri-sendiri, perception system dapat memperbarui TargetActor. Berbagai Task dan Decorator tinggal membaca nilai tersebut.

Pendekatan ini membuat sistem lebih konsisten sekaligus mengurangi pengembagan logic yang berulang.

Gunakan Decorator untuk Menentukan Kapan Cabang Berlaku

Decorator memberikan kondisi tambahan pada Task atau cabang tertentu.

Misalnya branch Attack Player hanya boleh berjalan jika TargetActor tersedia dan jarak target berada dalam attack range.

Branch Find Health mungkin hanya aktif ketika health di bawah 30%.

Epic menjelaskan bahwa Decorator pada Behavior Tree bertindak sebagai conditional yang menentukan apakah sebuah branch atau node boleh dieksekusi.

Pada implementasi Unreal, Decorator juga dapat mengamati perubahan Blackboard dan melakukan abort terhadap branch tertentu ketika kondisinya berubah.

Kemampuan interrupt seperti ini penting untuk karakter kompleks.

Bayangkan NPC sedang menjalankan animasi patrol menuju waypoint, lalu tiba-tiba melihat pemain. AI seharusnya tidak harus menyelesaikan seluruh rute patroli sebelum bereaksi.

Gunakan kondisi yang dapat dievaluasi ulang untuk perilaku yang membutuhkan respons cepat.

Pisahkan Perception dari Decision Making

Behavior Tree sebaiknya tidak melakukan seluruh pekerjaan AI.

Perception system bertugas mengetahui apa yang terjadi. Behavior Tree bertugas menentukan apa yang harus dilakukan terhadap informasi tersebut.

Sebagai contoh, AI Perception mendeteksi suara tembakan. Blackboard kemudian menyimpan posisi suara sebagai InvestigateLocation.

Behavior Tree membaca informasi tersebut dan memutuskan apakah NPC akan mendekati lokasi, mencari cover, atau mengabaikannya.

Pemisahan ini membuat tree tetap bersih.

Jangan membuat setiap cabang berisi raycast, pengecekan suara, kalkulasi navigasi, dan keputusan sekaligus. Jika semua responsibility dicampur dalam satu tree, sistem akan semakin sulit dipahami ketika jumlah karakter bertambah.

Gunakan Subtree untuk AI yang Semakin Besar

Karakter kompleks bisa memiliki ratusan kemungkinan tindakan.

Jika semuanya ditempatkan dalam satu graph, Behavior Tree berubah menjadi spaghetti visual.

Solusinya adalah membagi tree menjadi subtree berdasarkan domain perilaku.

Misalnya, buat subtree terpisah untuk Combat, Patrol, Search, Social Interaction, dan Flee. Main tree hanya menentukan kategori perilaku mana yang sedang memiliki prioritas.

BehaviorTree.CPP secara eksplisit mendukung konsep subtree untuk menyusun perilaku besar dari komponen yang lebih kecil dan reusable.

Unity Behavior juga mendukung desain hierarkis dengan reusable subgraph serta debugging visual secara real-time.

Pendekatan ini sangat berguna ketika beberapa tipe NPC berbagi perilaku yang sama.

Guard dan elite guard, misalnya, bisa menggunakan subtree patroli yang sama tetapi memiliki combat subtree berbeda.

Debug Berdasarkan Jalur Keputusan

NPC yang melakukan tindakan aneh belum tentu memiliki bug pada Task yang sedang dijalankan.

Masalahnya bisa berasal dari kondisi sebelumnya.

Karena itu, saat debugging, cari tahu jalur lengkap mengapa tree memilih sebuah branch.

Pantau nilai Blackboard, node yang sedang Running, branch yang gagal, serta kondisi yang menyebabkan branch berpindah.

Unreal Behavior Tree Editor menampilkan Blackboard key saat game berjalan sehingga developer dapat melihat perubahan state ketika melakukan debugging. Unity Behavior juga menyediakan visualisasi debugging pada Play mode.

Tambahkan logging untuk keputusan penting.

Jika NPC memilih kabur, log penyebabnya: health rendah, tidak memiliki ammunition, atau jumlah musuh terlalu banyak.

Informasi tersebut akan sangat membantu ketika sistem sudah memiliki puluhan kondisi.

Cara Mendesain Behavior Tree yang efektif dimulai dari hierarki perilaku yang jelas, Task kecil, Blackboard terstruktur, Decorator, dan subtree modular. Jangan membuat satu graph raksasa untuk menangani seluruh AI.

Bangun perilaku sederhana terlebih dahulu, lalu tambah kompleksitas secara bertahap. Setelah itu, lakukan pengujan pada situasi ekstrem agar keputusan NPC tetap logis ketika banyak kondisi berubah sekaligus.