Bagaimana cara menghubungkan mesin negara hingga ke arsitektur berbasis komponen? [Tutup]

23

Mesin negara tampaknya menyebabkan ketergantungan berbahaya dalam arsitektur berbasis komponen.

Bagaimana, khususnya, komunikasi ditangani antara mesin negara dan komponen yang melakukan perilaku yang terkait dengan negara?

Di mana saya berada:

  • Saya baru mengenal arsitektur berbasis komponen.
  • Saya membuat permainan pertempuran, meskipun saya pikir itu tidak masalah. Saya membayangkan mesin negara saya digunakan untuk beralih negara seperti "berjongkok", "berlari", "memblokir", dll.
  • Saya telah menemukan teknik manajemen negara ini menjadi sistem yang paling alami untuk arsitektur berbasis komponen, tetapi bertentangan dengan teknik yang saya baca tentang: Sistem Komponen Objek Permainan Dinamis untuk Karakter Perilaku yang Dapat Berubah-ubah. Menunjukkan bahwa semua komponen mengaktifkan / menonaktifkan diri mereka sendiri dengan terus-menerus memeriksa suatu kondisi untuk aktivasi.
  • Saya pikir tindakan seperti "berlari" atau "berjalan" masuk akal sebagai keadaan, yang tidak setuju dengan respons yang diterima di sini: /gamedev//a/7934
  • Saya menemukan ini berguna, tetapi ambigu: Bagaimana menerapkan perilaku dalam arsitektur game berbasis komponen? Ini menyarankan memiliki komponen terpisah yang hanya berisi mesin negara. Tapi, ini membutuhkan semacam kopling antara komponen mesin negara dan hampir semua komponen lainnya. Saya tidak mengerti bagaimana kopling ini harus ditangani. Ini adalah beberapa tebakan:

    A. Komponen tergantung pada mesin negara:
    Komponen menerima referensi ke komponen mesin negara getState(), yang mengembalikan konstanta enumerasi. Komponen memperbarui diri secara teratur dan memeriksa ini sesuai kebutuhan.

    B. Mesin negara tergantung pada komponen:
    Komponen mesin negara menerima referensi ke semua komponen yang dipantau. Itu menanyakan getState()metode mereka untuk melihat di mana mereka berada.

    C. Beberapa abstraksi di antara mereka
    Gunakan hub acara? Pola perintah?

    D. Pisahkan objek negara yang komponen referensi
    Pola Negara digunakan. Objek keadaan terpisah dibuat, yang mengaktifkan / menonaktifkan satu set komponen. Mesin negara beralih di antara objek negara.

  • Saya melihat komponen sebagai implementasi dari aspek . Mereka melakukan semua yang diperlukan secara internal untuk mewujudkan aspek itu. Sepertinya komponen harus berfungsi sendiri, tanpa bergantung pada komponen lain. Saya tahu beberapa dependensi diperlukan, tetapi mesin negara sepertinya ingin mengontrol semua komponen saya.

Anak anjing
sumber

Jawaban:

7

Gambaran umum cukup ringan, tetapi lihat slide ini dari presentasi yang saya lakukan untuk New Game Conf tahun lalu:

https://docs.google.com/presentation/d/110MxOqut_y7KOW1pNwIdcccisIA3ooJwVR-xm-ecuc4/view

(lihat gambar terkait di bawah)

Inti dari teknik ini adalah untuk menggabungkan pola daftar tindakan (dijelaskan - agak buruk - dalam slide) dengan mesin keadaan perilaku yang bertindak atas entitas permainan berbasis komponen.

Ini pada dasarnya sama dengan menciptakan sistem komposisi khusus hanya untuk perilaku AI, yang diarahkan pada jenis integrasi antar-perilaku yang Anda butuhkan untuk sistem AI yang lebih sederhana.

Bagian favorit saya dari permainan itu adalah bagaimana kita dapat menciptakan musuh jenis yang sama sekali baru dengan hanya memilih dari daftar perilaku pra-tertulis, memasukkannya ke dalam daftar tindakan untuk objek permainan (berada di BrainComponent) sesuai urutan yang diinginkan prioritas, dan semuanya hanya berfungsi. Dengan daftar tindakan yang memungkinkan untuk tindakan Blocking / NonBlocking, ini dapat melakukan beberapa hal yang sangat keren terlepas dari betapa sederhananya itu semua untuk diterapkan.

Bahkan perilaku seperti "setrum" di mana benar-benar hanya StunBehaviorAction didorong ke atas tumpukan daftar tindakan; jika perilaku setrum menjadi diaktifkan (setelah mengamati bahwa objek game EarsComponent mendengar serangan gelombang kejut yang menakjubkan) maka itu menetapkan status internal ke Tertegun, mengatakan komponen Animation untuk memainkan animasi setrum, dan mengatur status aksinya menjadi Blocking, dan mengatur timernya ke Blocking, serta timer-nya untuk timeout setrum diambil dari objek game EnemyParametersComponent. Karena itu adalah Pemblokiran dan di bagian atas daftar tindakan, tidak ada BehaviorAction lain dalam daftar tindakan yang akan dipanggil metode pembaruan mereka, jadi mereka pada dasarnya akan dimatikan. Ketika batas waktu kedaluwarsa, StunBehaviorAction mengatur statusnya kembali ke Idle dan status aksinya menjadi NonBlocking.

Perilaku lain yang kami terapkan hampir semuanya diimplementasikan dengan mesin keadaan internal tunggal. Hanya dua yang tidak memiliki mesin negara, pada kenyataannya, adalah PatrolPathBehaviorAction (itu akan mendorong serangkaian PathAction ke daftar tindakan jika tidak digunakan, yang pada gilirannya mendorong MoveAction) dan GuardHomeBehaviorAction (selalu di bagian bawah daftar tindakan, dan akan selalu hanya mendorong PathAction kembali ke lokasi rumah musuh). Setiap perilaku lainnya adalah mesin negara.

Slide 10 Slide 25 Slide 26

Sean Middleditch
sumber
Apa perbedaan mendasar antara "Perilaku" dan "Tindakan"?
Pup
1
@ Pup: Dari perspektif kode, ketika saya membangunnya, Perilaku adalah Tindakan. Dari titik konseptual, Tindakan biasanya bersifat sementara - tindakan itu hanya ada sampai "selesai" - sementara Perilaku selamanya dan tidak pernah dihapus dari daftar. Saya telah melihat tim lain membangun sistem yang sama tetapi dengan dua daftar, satu untuk Aksi dan satu untuk Perilaku, yang bekerja cukup baik. Saya suka memiliki kemampuan untuk Aksi untuk memblokir perilaku tertentu, meskipun, menggunakan bitmas dan pengelompokan (jalur, saya yakin saya memanggil mereka di slide). Maaf, grafik slide tengah sangat buruk. :)
Sean Middleditch
3

Di perusahaan sebelumnya saya bekerja untuk kami memiliki sistem berbasis komponen dengan AI berbasis negara. Kami memiliki komponen AI yang mengendalikan semua perilaku untuk objek / unit itu. Ketika AI aktif, seperti mengembara, menyerang, dll, ia akan menerima pembaruan setiap frame untuk melakukan logika apa pun yang diperlukan. Ketika AI diam atau tidak bergerak komponen dinonaktifkan dan tidak memperbarui setiap frame. Komponen, sementara dinonaktifkan, masih bisa menerima pesan berbasis peristiwa, sehingga akan menerima pesan untuk sesuatu seperti pemain yang memasuki radius agro, dan bisa meresponsnya dengan mengaktifkan kembali komponen AI sehingga dapat melakukan pembaruan berbasis bingkai.

Komponen AI memiliki sub-komponen, yang dapat dibuat dan dihancurkan dengan cepat, berdasarkan jenis tindakan apa yang dilakukan. Sebagai contoh jika itu berkeliaran itu bisa membuat sub-komponen yang berkeliaran dan memperbarui bahwa setiap frame saat berkeliaran, dan kemudian jika diagrokan ketika berkeliaran itu akan menutup sub-komponen itu dan membuka sub-komponen serangan. Komponen AI harus independen dari semua komponen lain pada suatu objek. Misalnya, kami memiliki komponen input, yang hanya akan menanyakan nilai pergerakan pada unit. Kueri yang dibuatnya adalah sesuatu yang akan ditanggapi oleh objek manusia dan AI. Hal ini memungkinkan komponen AI untuk hanya menetapkan nilai pergerakan pada dirinya sendiri selama hal-hal seperti berkeliaran, bahwa komponen input dapat mengambil, seperti halnya komponen yang dapat dikontrol manusia akan menetapkan nilai yang dapat diambil oleh komponen input.

Nic Foster
sumber
Jadi, sub-komponen AI benar-benar melakukan pekerjaannya? Apakah mereka ada sebagai komponen entitas, pada tingkat yang sama dengan komponen AI?
Pup
Sub-komponen di mesin kami adalah bagian dari kelas komponen dasar. Jadi apapun Component, yang berasal dari BaseComponent, dapat memiliki sejumlah SubComponents di atasnya. The Update()metode dalam BaseComponentakan memeriksa daftar sub-komponen, dan panggilan Update()pada mereka. Subcomponentssepenuhnya opsional sehingga BaseComponentmungkin tidak memilikinya. Juga, setiap pesan yang masuk ke komponen dialihkan ke subkomponen juga.
Nic Foster
1

Agak tidak jelas apa yang Anda maksud dengan komponen karena istilah Anda sangat kabur tanpa contoh nyata. Seringkali entitas game dibangun menggunakan komposisi daripada pewarisan. Dengan demikian, Anda dapat menjadikannya sesuatu yang dapat merusak dengan menambahkan komponen kesehatan ke entitas atau Anda dapat membuatnya hidup dengan menambahkan komponen bernyawa. Orang juga bisa menempatkan AI dalam komponen seperti itu. Akan ada logika pengambilan keputusan dalam komponen AI Anda dan jika Anda khawatir tentang memasangkannya ke banyak kode lain dalam sistem Anda dapat mengumpulkan informasi ke dalam papan tulis yang hanya dapat diakses oleh logika AI. Ada juga masalah ketergantungan pada output sistem AI. Pada dasarnya AI Anda mengendalikan suatu entitas dan kontrol itu membutuhkan antarmuka. Salah satu konsep yang berguna adalah controller atau gamepad. AI Anda dapat mengisi struktur serupa yang akan diisi gamepad pemain (meskipun mungkin memiliki beberapa "tombol" tambahan untuk kemampuan tertentu). Sekarang struktur ini kemudian dapat diteruskan ke komponen animasi Anda yang akan menafsirkannya dan memilih animasi yang sesuai untuk dimainkan. Sub-komponen AI yang berbeda bahkan dapat menulis ke berbagai bidang struktur atau ke bidang yang sama dengan prioritas yang berbeda. Bertujuan dan berjalan misalnya. Sub-komponen AI yang berbeda bahkan dapat menulis ke berbagai bidang struktur atau ke bidang yang sama dengan prioritas yang berbeda. Bertujuan dan berjalan misalnya. Sub-komponen AI yang berbeda bahkan dapat menulis ke berbagai bidang struktur atau ke bidang yang sama dengan prioritas yang berbeda. Bertujuan dan berjalan misalnya.

Jesse Cluff
sumber