Saya menerapkan NPC untuk berjalan di sekitar ruang virtual, khususnya kucing. Saya memiliki serangkaian klip animasi pendek (3-5 detik). Insting pertama saya adalah hanya memilih animasi acak ketika yang terakhir berakhir, tetapi saya menyadari bahwa itu tidak akan terlihat realistis karena akan mengubah perilaku terlalu sering, bahkan jika animasi berikutnya terbatas pada kemungkinan kontingen fisik.
Solusi yang saya maksudkan adalah sesuatu seperti pohon perilaku ( http://www.gamasutra.com/blogs/ChrisSimpson/20140717/221339/Behavior_trees_for_AI_How_they_work.php ), di mana setiap animasi memiliki daftar animasi berikutnya yang berbobot. Yaitu jika kucing berjalan, ia memiliki peluang 80% untuk terus berjalan, 20% duduk, 0% tidur. Pada dasarnya menggunakan model markov untuk mendapatkan langkah selanjutnya yang sesuai.
Namun saya tidak tahu apakah ini solusi yang baik, saya juga tidak tahu bagaimana saya akan menghasilkan pemetaan dari animasi saat ini ke kemungkinan animasi berikutnya + probabilitas. 30 animasi * 30 animasi berikutnya = 900 bobot. Itu banyak menghitung secara manual.
Kucing kadang-kadang akan bereaksi jika menabrak rintangan, tetapi beban masalahnya adalah memilih urutan animasi yang realistis tanpa memilih semuanya terlebih dahulu. Di pohon itu juga akan ada beberapa input lain, seperti kedekatan dengan seseorang, lokasi di ruangan, waktu sejak terakhir makan dll.
sumber
Jawaban:
Secara umum, Anda perlu memisahkan logika kucing dari animasinya.
Sekarang pertama-tama Anda perlu menulis logika kucing. Satu pendekatan bagus yang saya temukan adalah dengan memecah logika menjadi beberapa lapisan.
Kebutuhan
Kucing dapat memiliki beberapa keadaan dengan beberapa motif / kebutuhan (makan, tidur, dll.) Yang perlahan-lahan tumbuh seiring waktu dan berkurang ketika melakukannya (pikirkan Sims). Anda dapat memilih tugas saat ini yang memenuhi kebutuhan terbesar menggunakan logika fuzzy jika Anda mau.
Tugas
Sekarang pada setiap saat kucing memiliki tugas (Temukan makanan, temukan tempat tidur untuk tidur, ruang untuk berlarian, dll. Menganggur juga merupakan tugas). Tugas-tugas ini memberi tahu kucing ke mana harus pergi dan apa yang ingin dilakukan.
Tindakan
Sekarang ada layer ke-3 - aksi. Setiap tujuan memiliki antrian tindakan yang harus dilakukan (berdiri, berjalan ke, berjongkok, makan, dll.). Setiap tindakan bertanggung jawab atas pelaksanaannya. Misalnya, tindakan jalan kaki harus memeriksa hambatan dan mengirimkan kucing dari titik A ke titik B, mungkin berisi dan menjalankan sub-aksi (melompati rintangan, berjongkok di bawah furnitur, dll.).
Animasi
Sekarang ketika kucing memiliki kebutuhan, tugas dan tindakan, Anda dapat memilih animasi yang tepat untuk tindakan itu. Mengetahui animasi saat ini dan selanjutnya Anda harus dapat beralih dari satu ke yang lain. Misalnya, jika tugas mengatakan kucing harus berbaring setelah berjalan ke bantal, animasi akan mengantri - berjalan-berhenti-duduk-berbaring.
Antrian animasi dapat dilakukan secara efektif jika Anda memetakannya dalam grafik sebagai simpul dan menghubungkan simpul antara animasi yang dapat ditransisikan (misalnya berjalan untuk duduk adalah mungkin, tetapi melompat untuk mengunyah - tidak). Kemudian Anda dapat mengantriasi animasi dari masing-masing ke yang lain menggunakan A * pada grafik ini.
Contoh: Kucing perlu istirahat dan makan. Biarkan "Istirahat" tugas menemukan tempat untuk beristirahat, berjalan kucing di sana, meletakkannya dan beristirahat. Biarkan tugas "Istirahat" memeriksa kondisi setiap saat, jika lingkungan menjadi tidak nyaman - biarkan tugas berakhir. Periksa apa yang diinginkan kucing sekarang, jika masih ingin beristirahat - ulangi bagian sebelumnya. Saat kucing diistirahatkan - pilih tugas baru.
sumber
Saya pikir apa yang Anda cari adalah mesin negara terbatas atau FSM. Singkatnya, ini adalah cara mengubah perilaku NPC: sesuai dengan kondisi mereka saat ini.
EDIT:
Ini seperti pohon perilaku tetapi diringkas ke beberapa kelompok "menyatakan" bahwa NPC kembali. Pohon perilaku memungkinkan lebih banyak fleksibilitas perilaku tetapi juga membutuhkan lebih banyak data untuk menimbang probabilitas (cara cerdas untuk mengotomatiskannya adalah dengan tag, seperti yang disarankan scriptin dalam jawabannya). Ketika Anda menggunakan negara Anda memutuskan serangkaian tindakan dan probabilitas tertentu untuk tindakan tersebut di negara. Untuk secara aktif mengubah tindakan saat ini dapat menjadi bias dengan mungkin 80% untuk menjaga tindakan yang sama, jika tindakan harus diubah, berbagai probabilitas digunakan untuk memilih tindakan baru.
Dalam kasus Anda, status dapat (sedikit disederhanakan):
Setiap negara dapat memiliki probabilitas berbeda untuk mengubah keadaan, misalnya keadaan marah atau terluka mungkin tidak berlangsung lama. Negara bagian yang berbeda juga dapat memiliki aturan yang berbeda untuk apa yang legal (mengubah dari "mengantuk" menjadi "playfull" bisa ilegal, tetapi kucing tampaknya tidak peduli tentang itu). Peristiwa yang berbeda dapat memicu negara untuk berubah.
Lihat- lihat dengan mencari di web untuk FSM dan AI dan Anda dapat melihat cara kerjanya. Mungkin terlihat rumit ketika menjelaskannya, tetapi sangat sederhana.
sumber
Anda dapat menggunakan pemberian tag:
Mungkin ada tag gerakan seperti "meletakkan", "duduk", "berdiri", "berjalan", dan "berlari". Kemudian, Anda dapat menghilangkan kombinasi tag yang tidak realistis, misalnya "meletakkan" -> "berlari" (harus ada "berdiri" di antaranya).
Tag lain mungkin menggambarkan aktivitas: "tidur", "makan", "berburu", dll. Lagi-lagi, "tidur" -> "berburu" tidak mungkin tanpa kondisi perantara.
Karena animasi seperti "berdiri" bersifat transisi, mungkin merupakan ide yang baik untuk memiliki tag terpisah untuk awal dan akhir setiap animasi. Misalnya, "berdiri" mungkin merupakan transisi dari "duduk" ke "tinggal", dll.
Jadi, untuk setiap animasi Anda dapat memiliki beberapa tag:
Dengan itu, Anda dapat memfilter hanya kombinasi yang mungkin dengan menetapkan batasan seperti "
A->B
hanya mungkin jikafinal_movement_tag(A) == initial_movement_tag(B)
", yang akan menghasilkan angka yang jauh lebih kecil. Dengan kemungkinan kombinasi itu, Anda dapat melakukan apa yang telah Anda jelaskan - tambahkan probabilitas. Menambahkan probabilitas mungkin didasarkan pada tag aktivitas, karena tetap dalam aktivitas yang sama lebih mungkin daripada mengubah aktivitas.Jadi, dengan tag, Anda mungkin dapat mengotomatiskan pembuatan semua transisi di pohon perilaku / FSM Anda, dan menyetelnya nanti jika Anda tidak senang dengan beberapa kombinasi.
sumber
Jika Anda ingin menyimpan banyak kemungkinan pohon perilaku, Anda dapat menambahkan jenis baru simpul pemilih komposit: simpul pemilih Markov.
Anda harus mengimplementasikan sendiri simpul pemilih Markov. Ini akan memilih salah satu dari simpul anaknya secara acak, tergantung pada simpul (anak) yang sebelumnya berhasil (atau gagal).
sumber