Behavior Trees :: Tindakan Yang Butuh Waktu Lebih Lama Dari Satu Kutu

19

Dari apa yang saya pahami tentang Behavior Trees, setiap Perilaku harus menjadi Aksi berorientasi tujuan singkat yang dapat dilakukan dalam beberapa iterasi.

Jadi misalnya, di bawah ini adalah gambar dari Behavior Tree:

masukkan deskripsi gambar di sini

Sekarang mari kita asumsikan bahwa perilaku Drive To Enemy membutuhkan lebih dari beberapa iterasi di pohon. Jadi pada setiap pass Drive To Enemy dipanggil karena sekarang dalam keadaan berjalan .

Masalahnya adalah saya ingin memanggil Menghindar Musuh jika Musuh ada di dekatnya. Dan mengingat bahwa Drive To Enemy selalu dipanggil, aku tidak pernah mendapat kesempatan untuk memanggil Evade Enemy ( Mungkin harus disebut Avoid Enemy ).

  • Haruskah saya melintasi Tree EACH pass tidak peduli apa tindakan yang sedang berjalan?
  • Apakah saya melakukan ini dengan cara yang benar?
  • Apa cara yang tepat untuk menangani perilaku semacam itu?

Awalnya ditanyakan pada Stackoverflow. Pemikiran di sini akan menjadi tempat yang lebih tepat untuk mengajukan pertanyaan ini.

Lancer gratis
sumber
1
Apakah jawaban yang diberikan di sini membantu? gamedev.stackexchange.com/questions/51693/...
Tetrad
Itu juga pertanyaan saya. Saya akan memposting pertanyaan ini sebagai komentar tetapi berpikir itu harus menjadi pertanyaan yang terpisah.
Lancer Gratis

Jawaban:

16

Lihat gambar yang saya berikan di jawaban saya sebelumnya :

masukkan deskripsi gambar di sini

Jika Anda membayangkan bahwa simpul 1 adalah 'Menghindar Musuh' dan simpul 2 adalah 'Mengejar Musuh', Anda akan melihat bahwa meskipun dalam iterasi kedua (ketika semuanya berwarna hijau kecuali untuk '2' dan 'B' adalah ketika iterasi kedua dimulai), 'Evade Enemy' masih diperiksa terlebih dahulu. Hanya ketika 'Evade Enemy' gagal, karena tidak ada musuh di dekatnya, 'Chase Enemy' diaktifkan kembali. Ketika 'Chase Enemy' dikunjungi lagi, ia mengetahui bahwa itu dalam keadaan 'berjalan' dan melompat langsung ke 'B'.

Ini berarti bahwa setiap kali pohon diperiksa, ia akan selalu melintasi kiri ke kanan. Bahkan ketika sebuah node ditandai berjalan, node dengan prioritas lebih tinggi masih diperiksa terlebih dahulu.

Saya tidak yakin apakah Anda bermaksud untuk memproses node Anda dari kanan ke kiri, tetapi itulah yang tampaknya Anda atur (mis. Di bawah menghindari musuh, cari musuh ada di kanan drive di arah yang berlawanan). Jika Anda membutuhkan penjelasan lebih lanjut, Anda harus bertanya dalam obrolan atau dalam salah satu pertanyaan yang ada tentang topik tersebut.

MichaelHouse
sumber
2
Terima kasih atas penjelasan hebat lainnya. Saya mengalami kesulitan memahami sifat rekursif Pohon Perilaku. Saya akan bertanya kepada Anda di komentar pertanyaan terakhir tetapi tidak ingin mengubah komentar menjadi QA yang panjang. Namun satu pertanyaan terakhir, ini semua masuk akal sekarang. Apakah ada perbedaan antara Penyeleksi dan Urutan dalam menangani status Berlari? Tampaknya Selector (Node 0) memeriksa Node 1 terlebih dahulu, sedangkan urutan "Node 2" tidak memeriksa Node A, pada iterasi kedua.
Lancer Gratis
4
Pertanyaan bagus, saya pikir Anda mengerti. Node 2 tidak memeriksa simpul A karena simpul A selesai. Ketika simpul 2 ditandai sebagai 'Berjalan', ia mencatat bahwa simpul B adalah simpul yang sedang berjalan. Anda dapat mengasumsikan bahwa jika sebuah node sedang berjalan, itu berarti node sebelumnya tidak perlu diperiksa lagi.
MichaelHouse
Apakah Anda mengatur ulang Root Selector (0), menjadi "READY" setelah diatur ke "RUNNING" setelah iterasi pertama?
Lancer Gratis
Saya percaya bahwa hanya orang tua dari simpul yang berjalan diatur untuk berjalan. Rooting root harus diatur ke siap alih-alih berjalan karena kita perlu mengurai simpul (1) lagi.
MichaelHouse
3
Itu salah satu opsi. Anda benar-benar dapat memperbaruinya sesering atau sesering mungkin. Setiap 300 ms jika Anda mau, atau setiap frame. Atau Anda dapat memiliki pembaruan tetap serta pembaruan yang dipicu untuk menangani peristiwa apa pun. Pohon perilaku, seperti kebanyakan struktur seperti ini, tidak didefinisikan secara ketat. Mereka harus digunakan dengan cara terbaik untuk gim Anda. Jika mengevaluasi setiap frame terlalu boros, maka jangan lakukan itu. Anda juga dapat membatasi jumlah waktu yang dihabiskan untuk mengevaluasi pohon, dan mengambil bingkai berikutnya jika Anda mau. Ada banyak pilihan.
MichaelHouse