Perpustakaan Generik C# GOAP (Perencanaan Tindakan Berorientasi Sasaran) dengan Contoh -contoh Unity3D dan kelas pembantu.
Perpustakaan ini sangat umum, jika Anda tidak memasukkan folder Unity Anda dapat menggunakannya di mesin game apa pun.
Mulailah dengan memeriksa contoh Unity FSM di sini.
Contoh ini menggunakan pustaka Regoap di Unity dengan FSM sederhana (mesin negara hingga) untuk menangani perilaku makro (di sebagian besar game, tiga negara bagian FSM sudah cukup: idle, goto, animate).
Untuk menggunakannya, buatlah proyek Unity baru, buka shell, buka direktori aset dan klon seluruh repositori di sana:
git clone https://github.com/luxkun/ReGoap.git(Di Windows Anda dapat melakukan hal yang sama dengan baris perintah atau klien git apa pun, Anda juga bisa mengklik "klon atau unduh" dan kemudian "unduh zip")
Anda juga dapat mengunduh paket Unity rilis terakhir, yang mungkin tidak akan memiliki perubahan terbaru, di sini atau di Unity Asset Store.
(Jika Anda hanya ingin menggunakan perpustakaan dan ingin contoh yang dijelaskan lewati cara menggunakan regoap )
Sebelum menjelaskan cara menggunakan perpustakaan ini di game Anda, izinkan saya menjelaskan bagaimana cara kerja sistem goap, dimulai dengan kutipan dari Jeff Orkin
Goal-Oriented Action Planning (aka GOAP, rhymes with soap) refers to a simplfied STRIPS-like planning architecture specifically designed for real-time control of autonomous character behavior in games.
Pada dasarnya semua yang dilakukan hanyalah menemukan rencana (daftar tindakan) yang akan memenuhi tujuan tujuan yang dipilih.
Konsep utama yang perlu Anda pahami adalah: negara bagian, tindakan, tujuan, memori dan sensor
adalah definisi dunia, di perpustakaan ini mereka ditangani sebagai kamus string ke objek (kamus <string, objek>).
Lihat kelas RegoapState di file ini: https://github.com/luxkun/regoap/blob/master/regoap/core/regoapstate.cs
Contoh: 'isat': 'musuh', 'iswayned': true, 'hasweapon': true
Dapat didefinisikan sebagai daftar prasyarat dan efek, ini adalah tindakan yang dapat dilakukan oleh agen (AI Pawn, yang akan disebut agen mulai sekarang).
Prasyarat adalah persyaratan bahwa tindakan tersebut perlu dijalankan, digambarkan sebagai keadaan, efeknya, seperti namanya, adalah efek dari tindakan, juga digambarkan sebagai keadaan.
Contoh:
Penting : Prasyarat palsu tidak didukung Penting : Efek tindakan tidak ditulis dalam memori ketika tindakan dilakukan, ini adalah perilaku yang dicari karena di sebagian besar game Anda ingin mengatur variabel -variabel ini dari memori atau dari sensor . Jika Anda mau, Anda dapat mengganti keluar dalam regoapaction Anda dan mengatur efeknya ke memori, contoh berikut.
Dapat didefinisikan sebagai daftar syarat, digambarkan sebagai keadaan, ini pada dasarnya adalah apa yang harus dilakukan agen.
Contoh:
adalah memori agen, semua yang diketahui dan dirasakan agen harus dimasukkan di sini. Memori juga dapat memiliki banyak sensor, di perpustakaan ini, yang merupakan penolong memori. Pada dasarnya tugas memori adalah menciptakan dan terus memperbarui keadaan 'dunia'.
adalah penolong memori, itu harus menangani ruang lingkup tertentu.
Contoh:
Sekarang Anda harus memahami untuk apa perpustakaan GOAP dan untuk apa Anda harus menggunakannya, jika masih memiliki pertanyaan atau ingin tahu lebih banyak tentang bidang ini, saya menyarankan Anda untuk membaca surat -surat Jeff Orkin di sini: http://alumni.media.mit. edu/~ jorkin/
git clone https://github.com/luxkun/ReGoap.gitAda apa lagi? Tidak ada yang benar -benar, perpustakaan akan menangani semua perencanaan, memilih tindakan untuk menyelesaikan tujuan dan menjalankan yang pertama sampai selesai, lalu yang kedua dan sebagainya, yang perlu Anda lakukan adalah menerapkan tindakan dan tujuan Anda sendiri.
Dalam paragraf berikutnya saya akan menjelaskan cara membuat kelas Anda sendiri (tetapi untuk sebagian besar perilaku yang perlu Anda terapkan adalah goapaction dan gooPgoal).
Check out the actions in this example: https://github.com/luxkun/ReGoap/tree/master/ReGoap/Unity/FSMExample/Actions
Lihat Implementasi Regoapaction, untuk melihat fungsi apa yang dapat Anda ganti: https://github.com/luxkun/regoap/blob/master/regoap/unity/regegegoapaction.cs
Anda harus menerapkan regoapaction Anda sendiri dengan menerapkan antarmuka iregoapaction atau mewarisi regoapaction. Pilih dengan bijak tipe generik, mereka harus sama di semua kelas agen. Biasanya string, objek adalah objek yang paling umum, juga int/enum, adalah generik tetapi lebih ringan.
Untuk implementasi sederhana yang harus Anda lakukan adalah ini:
public class MyGoapAction : ReGoapAction < string , object >
{
protected override void Awake ( )
{
base . Awake ( ) ;
preconditions . Set ( " myPrecondition " , myValue ) ;
effects . Set ( " myEffects " , myValue ) ;
}
public override void Run ( IReGoapAction < string , object > previous , IReGoapAction < string , object > next , ReGoapState < string , object > settings , ReGoapState < string , object > goalState , Action < IReGoapAction < string , object > > done , Action < IReGoapAction < string , object > > fail )
{
base . Run ( previous , next , goalState , done , fail ) ;
// do your own game logic here
// when done, in this function or outside this function, call the done or fail callback, automatically saved to doneCallback and failCallback by ReGoapAction
doneCallback ( this ) ; // this will tell the ReGoapAgent that the action is succerfully done and go ahead in the action plan
// if the action has failed then run failCallback(this), the ReGoapAgent will automatically invalidate the whole plan and ask the ReGoapPlannerManager to create a new plan
}
}Seperti yang ditulis sebelum regoapaction tidak, secara default, tulis efeknya pada memori, tetapi memori harus memeriksa apakah efeknya dilakukan secara efektif, jika karena alasan apa pun Anda ingin mengatur efek pada akhir tindakan yang dapat Anda tambahkan Kode ini untuk implementasi regoapaction Anda:
public override void Exit ( IReGoapAction < string , object > next )
{
base . Exit ( next ) ;
var worldState = agent . GetMemory ( ) . GetWorldState ( ) ;
foreach ( var pair in effects ) {
worldState . Set ( pair . Key , pair . Value ) ;
}
}Anda juga dapat memiliki prasyarat dan efek yang diubah secara dinamis berdasarkan prasyarat/efek aksi berikutnya, misalnya ini bagaimana Anda dapat menangani aksi goto di agen Anda.
Lihat FSMEXAMPLE untuk melihat cara melakukan ini: https://github.com/luxkun/regoap/blob/master/regoap/unity/fsmexample/actions/genericgotoaction.cs
Ini kurang rumit, sebagian besar tujuan hanya akan mengesampingkan fungsi terjaga untuk menambahkan keadaan tujuan Anda sendiri (tujuan).
Pokoknya periksa regoapgoal, seperti semua yang Anda miliki untuk mengimplementasikan kelas Anda sendiri dari awal dengan menerapkan antarmuka iregoapgoal atau mewarisi regoapgoal: https://github.com/luxkun/regoap/blob/master/regoap/unity/regoapgoal.cs
Lihat juga tujuan dalam contoh ini: https://github.com/luxkun/regoap/tree/master/regoap/unity/fsmexample/goals
public class MyGoapGoal : ReGoapGoal < string , object >
{
protected override void Awake ( )
{
base . Awake ( ) ;
goal . Set ( " myRequirement " , myValue ) ;
}
}Catatan : Pastikan untuk menggunakan RegoapGoalAdvanced jika Anda ingin secara otomatis memperingatkan agen bahwa suatu tujuan tidak tersedia.
Lihat kelas dasar goapsensor di sini: https://github.com/luxkun/regoap/blob/master/regoap/unity/goapsensor.cs
Lihat contoh di sini: https://github.com/luxkun/regoap/tree/master/regoap/unity/fsmexample/sensors
Seperti biasa, Anda harus mengimplementasikan kelas Anda sendiri dengan mewarisi regoapsensor atau menerapkan antarmuka Iregoapsensor.
public class MySensor : ReGoapSensor < string , object >
{
void FixedUpdate ( )
{
var worldState = memory . GetWorldState ( ) ;
worldState . Set ( " mySensorValue " , myValue ) ; // like always myValue can be anything... it's a GoapState :)
}
}Note : make sure to use ReGoapMemoryAdvanced when working with sensors, since the basic class does not check and update sensors.
Untuk men -debug agen Anda sendiri, Anda dapat, tentu saja, men -debug sendiri, dengan editor favorit Anda.
Tapi Regoap memiliki debugger yang sangat sopan untuk Agen di Unity (https://github.com/luxkun/regoap/blob/master/regoap/unity/editor/Regoapnodeeditor.cs dan https://github.com/loxkun/regoap/ Blob/Master/Regoap/Unity/Editor/RegoapnodeBaseEditor.cs).
Untuk menggunakannya cukup klik pada jendela menu Unity dan kemudian Regoap Debugger , jendela Unity akan terbuka, ini adalah agen debugger.
Sekarang jika Anda mengklik agen mana pun di adegan Anda (saat bermain, hanya bekerja pada agen yang sedang berjalan) jendela akan secara otomatis memperbarui agar Anda mengetahui "pemikiran" agen (negara dunia saat ini, tujuan yang dipilih dan rencana saat ini, tujuan yang memungkinkan, tindakan yang mungkin, kemungkinan, kemungkinan tindakan, kemungkinan Apa yang bisa dilakukan dan apa yang tidak, coba!).
Permintaan tarik apa pun dihargai, pastikan untuk memeriksa tes Unity ( jendela menu -> Tes Editor Runner -> Jalankan semua ) sebelum berkomitmen dan untuk menjaga gaya kode yang sama.