Bagaimana menerapkan perilaku dalam arsitektur game berbasis komponen?


21

Saya mulai mengimplementasikan AI pemain dan musuh dalam sebuah game, tetapi saya bingung tentang cara terbaik mengimplementasikan ini dalam arsitektur game berbasis komponen.

Katakanlah saya memiliki karakter pemain berikut yang bisa diam, berlari dan mengayunkan pedang. Seorang pemain dapat transit ke keadaan pedang ayun baik dari stasioner dan berlari, tetapi kemudian ayunan harus diselesaikan sebelum pemain dapat melanjutkan berdiri atau berlari di sekitar. Selama ayunan, pemain tidak bisa berjalan.

Seperti yang saya lihat, saya memiliki dua pendekatan implementasi:

  • Buat komponen AI tunggal yang berisi semua logika pemain (baik dipisahkan dari komponen aktual atau disematkan sebagai komponen PlayerAIC). Saya dapat dengan mudah bagaimana menegakkan pembatasan negara tanpa membuat sambungan antara masing-masing komponen yang membentuk entitas pemain. Namun, komponen AI tidak dapat dipecah. Jika saya memiliki, misalnya, musuh yang hanya bisa berdiri dan berjalan atau hanya berjalan dan sesekali mengayunkan pedang, saya harus membuat komponen AI baru.
  • Hancurkan perilaku dalam komponen, masing-masing mengidentifikasi keadaan tertentu. Saya kemudian mendapatkan StandComponent, WalkComponent dan SwingComponent. Untuk menegakkan aturan transisi, saya harus memasangkan setiap komponen. SwingComponent harus menonaktifkan StandComponent dan WalkComponent selama durasi ayunan. Ketika saya memiliki musuh yang hanya berdiri di sekitar, mengayunkan pedang sesekali, saya harus memastikan bahwa SwingComponent hanya menonaktifkan WalkComponent jika ada. Meskipun ini memungkinkan untuk komponen campuran dan pencocokan yang lebih baik, ini dapat mengarah pada mimpi buruk pemeliharaan karena setiap kali ketergantungan ditambahkan, komponen yang ada harus diperbarui untuk bermain dengan baik dengan persyaratan baru tempat ketergantungan tergantung pada karakter.

Situasi yang ideal adalah perancang dapat membangun musuh / pemain baru dengan menyeret komponen ke dalam wadah, tanpa harus menyentuh satu baris pun dari kode mesin atau skrip. Meskipun saya tidak yakin kode skrip dapat dihindari, saya ingin membuatnya sesederhana mungkin.

Ringkasnya: Haruskah saya memasukkan semua logika AI ke dalam satu komponen atau memecah setiap keadaan logika menjadi komponen yang terpisah untuk membuat varian entitas lebih mudah?

sunting : Saya curiga ada beberapa kebingungan tentang apa yang saya maksud dengan situasi pertama dan kedua. Saya sudah mencoba menjelaskannya pada diagram di bawah ini.

Diagram komponen

Perhatikan hubungan antara masing-masing negara bagian dan entitas. Dalam situasi pertama, komponen AI dibangun sebelum dimasukkan ke dalam entitas. Seorang desainer hanya dapat memilih dari satu set komponen AIC yang berbeda yang disediakan oleh programmer. Situasi kedua memiliki keadaan yang berbeda pada tingkat yang sama dengan komponen lainnya. Seorang desainer sekarang dapat membuat entitas dengan AI unik tanpa campur tangan seorang programmer.

Pertanyaannya adalah, apakah ini satu-satunya dua opsi untuk penataan AI dalam entitas berbasis komponen dan, jika demikian, apa yang akan memberikan fleksibilitas maksimum?


Saya pikir jawaban yang baik akan tergantung pada di mana Anda ingin menegakkan eksklusivitas tindakan. Jika Anda ingin berada di objek itu sendiri desain akan jauh berbeda dibandingkan dengan mengatakan, menegakkannya melalui antarmuka drag and drop (Negara ini sudah memiliki tindakan gerakan sehingga tidak dapat memiliki yang lain, wadah transisi keadaan ini sudah berisi keadaan akhir berbasis waktu, dll atau apa pun).
James

2 bukan opsi yang layak.
Coyote

Jawaban:


6

Jika Anda berniat untuk memiliki lebih banyak musuh atau pemain yang tidak dapat Anda bayangkan saat ini, maka Anda harus memecahnya. Apa yang Anda jelaskan pada poin kedua Anda pada dasarnya adalah pola keadaan .

Saya pikir saya setuju dengan Gregory bahwa Anda seharusnya tidak memiliki komponen stand and walk state yang terpisah. Itu hanya komponen gerakan dengan kecepatan 0. Di sisi lain, jika Anda memiliki objek yang tidak dapat bergerak, Anda harus membaginya, atau hanya meletakkan semacam pembatasan boolean dalam keadaan gerakan yang mencegah tidak memiliki kecepatan nol. .

Untuk pemain saya tidak berpikir itu harus benar-benar terpisah. Masih dapat menggunakan semua komponen lainnya, dengan penambahan komponen input. Komponen ini mendorong transisi antar negara, sedangkan di musuh itu dikendalikan oleh AI default, atau jika Anda mau, subkelas AI berbeda yang dapat dipilih oleh perancang musuh Anda.

sunting: sebenarnya, untuk musuh stasioner Anda, daripada membatasi komponen gerakan, cukup beri mereka komponen AI stasioner yang tidak pernah memilih untuk memindahkan mereka.


Bukankah pola negara menyiratkan situasi pertama? Ini menghasilkan satu komponen AIC yang mengimplementasikan mesin negara yang berisi objek negara yang berbeda. Yang saya maksud dengan opsi kedua adalah WalkComponent dan SwingComponent memiliki tipe yang sama dengan, katakanlah, RenderComponent dan PhysicsComponent.
hantu

@ ghostonline Sejauh idenya, semacam. Dalam implementasinya, tidak juga. Komponen AIC akan terpisah, seperti pada diagram kedua. Itu tidak akan mengandung komponen lain. Pertanyaan yang lebih penting untuk situasi kedua Anda adalah, jika perancang hanya memilih komponen tanpa programmer, bagaimana Entitas tahu kapan harus mengubah keadaan? Negara bagian yang berbeda menyiratkan transisi negara bagian yang berbeda - seseorang masih perlu menentukannya.
Tesserex

Apakah maksud Anda menambahkan komponen AIC ke entitas pada diagram 2, yang akan mengontrol komponen Stand / Walk / Swing-Component? Ide saya adalah bahwa komponen mengirim sinyal blok atau aktivasi pada kondisi tertentu. Misalnya, SwingComponent akan memancarkan sinyal generik, misalnya sinyal "bound_feet" saat mulai dan "release_feet" saat menyelesaikan ayunan. WalkComponent akan menonaktifkan dan mengaktifkan sendiri berdasarkan sinyal-sinyal ini. Karena 'transisi negara' diringkas dalam komponen itu sendiri, perancang tidak perlu programmer yang menggabungkan komponen-komponen tersebut.
ghost

@ghostonline Itu berfungsi dengan baik untuk hal-hal yang memiliki aturan tetap seperti "tidak bisa berjalan sambil berayun" tetapi bagaimana dengan transisi antara berdiri dan berjalan? Jika berdiri memegang kendali, bagaimana ia tahu mencoba berjalan? Logika berdiri mungkin ingin memilih berjalan atau mengayun, yang dipengaruhi oleh ketiadaan kemampuan berjalan - itu harus selalu memilih untuk mengayun dalam kasus itu. Tapi saya pikir Anda berada di jalur yang benar.
Tesserex

2

Saya setidaknya akan menjaga Player AI (atau apa yang saya sebut Player Controller) sebagai komponennya sendiri. Pada sebagian besar game, pemain pada dasarnya cukup berbeda dari NPC sehingga Anda tidak dapat menggeneralisasi satu sama lain kecuali dalam dasar-dasar seperti poin hit.

Untuk NPC, saya melihat StandComponent dan WalkComponent sebagai aspek dari hal yang sama. Apakah Anda pernah memiliki WalkComponent tanpa StandComponent? Aku meragukan itu. Demikian juga, RunComponent hanya akan menjadi WalkComponent dengan kecepatan yang lebih tinggi dan animasi yang berbeda. Saya dapat melihat nilai dalam memiliki NPCMovementComponent dan NPCSwordFighterComponent yang terpisah, tetapi bahkan itu terasa seperti rekayasa berlebihan bagi saya.


Saya tidak akan memisahkan gerakan NPC dan gerakan pemain sebanyak itu. Tindakan gerakan yang menggerakkan animasi dan fisika pasti bisa dibagikan; itu yang memilih tindakan atau transisi yang berbeda (pemain mengambil input saat AI adalah ... AI). Saya setuju Anda akan memiliki PlayerController, tetapi Anda juga akan memiliki AIController, yang keduanya dapat menggunakan Komponen Gerakan / Komponen Ayun untuk menyelesaikan pekerjaan animasi / fisika yang sebenarnya.
homebrew

Benar. Saya berasumsi bahwa semua objek bergerak memiliki PhysicsComponent atau MovementComponent yang menangani gerakan mereka, dan bahwa PlayerController dan AIController akan menggunakannya untuk menangani gerakan. Gerakan pasti harus menjadi komponen yang terpisah, karena mungkin ada hal-hal yang perlu bergerak yang tidak memiliki AI atau memiliki AI yang paling sederhana (benda-benda fisika bodoh seperti peti atau sampah).
Gregory Avery-Weir

2

Pertama saya akan membuat komponen State dan kemudian saya akan membuat mesin state untuk menangani transisi. Buat itu cukup generik sehingga Anda bisa menggunakan ini untuk pemain dan AI Anda. Ini akan memastikan AI bermain dengan aturan yang sama dan Anda tidak perlu mengubah logika saat Anda mengubah cara kerja pemain dibandingkan dengan status AI.

Mesin Hingga Hingga C ++

Di atas memiliki contoh nyata dari mesin negara di c ++ yang dapat digunakan oleh pemain dan AI.


1

Yang Anda inginkan adalah komponen yang menangani pergerakan karakter (pemain dan NPC). Komponen AI atau komponen pemain akan mengirim perintah ke komponen gerakan ini dan akan memeriksa apakah tindakan dapat dimulai. Ini akan merangkum kendala gerakan Anda menjadi satu komponen tunggal. Kode AI dan kode pemain Anda tidak harus tahu bagaimana pedang ayun dieksekusi. AI akan memiliki status internal misalnya Idle, Attacking, Fleeing.


1
TYPO: "Akan menerima ..." bagaimana dengan komponen AI?
Pup
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.