Cara yang baik untuk menangani AI offscreen?


16

Misalnya sake:

  • Katakanlah ada 10 kamar di dunia.
  • Dan katakanlah dunia dihuni oleh 10 entitas.
  • Dan setiap entitas memiliki "rutinitas harian" sendiri di mana ia melakukan tindakan tertentu di dalam ruangan dan juga dapat bernavigasi di antara kamar.

Mengingat bahwa pemain hanya dapat berada di satu ruangan pada satu waktu, apa cara yang baik untuk melacak tindakan yang dilakukan entitas lain di kamar lain di luar layar?

  1. Opsi yang paling mudah adalah memeriksa masing-masing dari 10 entitas pada setiap frame, memeriksa posisi / negara mereka dan menentukan apakah entitas harus berada di ruangan di mana pemain berada pada waktu tertentu. (Namun ini terasa sangat berat sumber daya terutama karena jumlah kamar / entitas meningkat.)
  2. Pilihan lain adalah untuk melacak waktu yang telah berlalu sejak awal permainan, maka masing-masing entitas memeriksa apakah polanya berpotongan dengan ruang pemain aktif, dan jika ia memeriksa terhadap waktu apakah atau tidak entitas seharusnya berada di ruangan yang sama pada waktu tertentu, entitas yang polanya tidak bersinggungan dengan ruang saat pemain berada tidak melakukan apa-apa sampai pemain memasuki ruangan yang berpotongan pola mereka dan hanya pada titik itu menghitung apakah atau tidak mereka harus membuat. (Tetapi jika mereka berinteraksi dengan ruangan, maka mereka harus selalu memeriksa keadaan kamar yang memotong rute mereka untuk menentukan lokasi mereka pada saat itu, yang tidak terlalu bagus.)

  3. Opsi ketiga yang saya datangi adalah pertama-tama hanya melihat rute yang memotong lokasi pemain (seperti yang dijelaskan sebelumnya), kedua saat memasuki ruangan, periksa apakah pemain ada di ruangan itu, jika tidak maka untuk hanya memeriksa keadaan ruangan dan berapa lama untuk melanjutkan ke kamar berikutnya. Misalnya seorang petugas kebersihan NPC memasuki ruangan, memeriksa keadaan ruangan, melihat bahwa ada tumpahan yang dibuat oleh pemain, menghitung berapa banyak waktu yang diperlukan untuk membersihkannya dan berapa lama lintasan akan berlangsung dll. Dan sampai disebutkan waktunya tiba untuk memasuki kamar sebelah kami hanya memeriksa apakah pemain ada di dalam ruangan. Lokasi persis NPC untuk tujuan rendering hanya akan dihitung ketika pemain memasuki ruangan.

Setelah melakukan brainstorming beberapa saat, saya sampai pada pilihan ketiga, tetapi saya bertanya-tanya apakah mungkin ada cara yang diketahui atau lebih baik untuk menangani hal-hal seperti ini?


1
Pertanyaan ini mengingatkan saya pada blog-dev yang saya baca untuk game bernama Project Zomboid.
Sumurai8

Jawaban:


12

Pendekatan yang sangat sederhana adalah dengan menggunakan "AI Level of Detail." Secara kasar, ini berarti Anda memperbarui AI lebih sering semakin dekat dengan pemutar / kamera. Anda juga dapat mengurangi kompleksitas perhitungan AI yang lebih jauh, khususnya. untuk menemukan jalan. Lagipula, jika pemain tidak dapat melihat karakter dengan baik atau tidak, tidak ada gunanya mengerahkan upaya dalam mensimulasikan karakter pada akurasi tertinggi.

Dalam contoh Anda, ruang pemain mungkin mendapatkan akurasi tertinggi (AI memperbarui setiap frame, resolusi penuh). Kamar-kamar yang berdekatan mungkin mendapatkan akurasi tertinggi berikutnya (memperbarui setiap 10 kutu, menghapus perataan jalur, dan animasi). Semua kamar lain bisa mendapatkan akurasi terendah (memperbarui setiap detik, mencari jalan resolusi rendah, menghilangkan interaksi NPC-ke-NPC yang tidak penting).

Game yang lebih besar dan lebih kompleks dapat (dan telah) menggunakan pendekatan serupa. Mereka mungkin menyederhanakan perhitungan pertarungan, meneleportasi karakter daripada mencari jalurnya ketika mereka perlu bergerak, dll.

Jika permainan Anda cukup besar sehingga Anda tidak dapat menyimpan semuanya dalam memori setiap saat, solusi yang baik adalah menyimpan waktu pembaruan terakhir dalam data yang disimpan dalam ruangan, dan memutar ulang simulasi layarnya (pada resolusi terendah) saat itu dimuat kembali.

Jika Anda mengharapkan AI untuk pindah ke area "langsung" dari area "tertidur" tanpa jadwal, Anda juga ingin membuat data super-low-fidelity untuk wilayah tersebut agar tetap tersimpan dalam memori setiap saat (mis., Hanya yang paling kasar navmesh tingkat detail dan lokasi objek / karakter utama) atau Anda akan ingin secara berkala menggilir area-area tersebut (mis., simpan area X "tertidur" dalam memori dan simulasi dengan kesetiaan rendah dengan pembaruan yang jarang dan kemudian pisahkan semua yang melalui semua " tertidur "area yang memiliki kunci NPC aktif di dalamnya, membongkar dan memuat area saat Anda melakukannya).


1

Saya akan menyimpan entitas yang saat ini berada di sebuah ruangan dalam ruangan itu, objek kamar juga akan melacak kapan entitas yang perlu diperbarui (mis. Bepergian ke ruangan lain atau mengubah sesuatu di ruangan itu, dll.). Dan saya juga memperbarui satu (atau lebih) ruang setiap detik (mungkin di utas lain).

Ketika Anda memperbarui sebuah ruangan, posisi NPC harus diperbarui dan semua tindakan yang telah mereka lakukan yang berinteraksi dengan ruangan sejak pembaruan terakhir harus ditangani juga, terakhir waktu pembaruan yang diperlukan berikutnya harus diperiksa / diperbarui.

Jika suatu entitas berpindah dari satu ruangan ke ruangan lain, instance itu harus disimpan di ruangan lain dan pembaruan selanjutnya dari entitas tersebut harus diperbarui juga.

Dengan cara ini Anda hanya perlu terus memperbarui kamar saat ini dan kamar yang memiliki pembaruan terjadwal pada saat itu, memperbarui kamar lain hanya opsional (tetapi disarankan jika Anda memiliki AI yang diperbarui setiap kali pemain bergerak atau melakukan sesuatu) .

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.