Generic C#GOAP(目標指向アクションプランニング)Unity3Dの例を備えたライブラリとヘルパークラス。
このライブラリは非常に一般的です。Unityフォルダーが含まれていない場合は、任意のゲームエンジンで使用できます。
ここでUnity FSMの例をチェックすることから始めます。
この例では、単純なFSM(有限状態マシン)を備えたUnityのRegoapライブラリを使用してマクロの動作を処理します(ほとんどのゲームでは、3つのFSM状態が十分である必要があります:アイドル、goto、アニメーション)。
それを使用するには、新しいUnityプロジェクトを作成し、シェルを開き、Assets Directoryに移動し、そこにリポジトリ全体をクローン化します。
git clone https://github.com/luxkun/ReGoap.git(Windowsでは、コマンドラインまたはgitクライアントでも同じことができます。「クローンまたはダウンロード」をクリックしてから「zipのダウンロード」をクリックすることもできます)
また、最後のリリースのUnityパッケージをダウンロードするだけで、おそらくここまたはUnity Asset Storeで最新の変更がありません。
(ライブラリを使用して、説明した例を必要としたい場合は、Regoapの使用方法についてスキップしたい場合)
あなたのゲームでこのライブラリの使用方法を説明する前に、ジェフ・オーキンの引用から始めて、Guapシステムがどのように機能するかを説明させてください
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.
基本的に、それが行うのは、選択された目標の目的を満たす計画(アクションのリスト)を見つけることです。
あなたが理解する必要がある主な概念は、状態、アクション、目標、メモリ、センサーです
世界の定義であり、このライブラリでは、それらはstring to object(辞書<string、object>)の辞書として処理されます。
このファイルのregoapstateクラスをご覧ください:https://github.com/luxkun/regoap/blob/master/regoap/core/regoapstate.cs
例: 「ISAT」:「敵」、「ISWARNED」:true、「hasweapon」:true
前提条件と効果のリストとして定義できます。これらは、エージェント(AIポーン、これからエージェントと呼ばれる)ができるアクションです。
前提条件は、アクションが状態として記述された実行を必要とする要件であり、名前が示唆するように、効果はアクションの効果であり、状態として説明されています。
例:
重要:誤った前提条件はサポートされていません。必要に応じて、再生の出口をオーバーライドして、メモリに効果を設定できます。
国家として記述された要件のリストとして定義できます。これは基本的にエージェントがすべきことです。
例:
エージェントの記憶であり、エージェントが知っていて感じることはすべてここに挿入されるべきです。メモリには、このライブラリにメモリヘルパーである多くのセンサーがあります。基本的に、記憶の仕事は、「世界」状態を作成し、更新することです。
メモリヘルパーであり、特定の範囲を処理する必要があります。
例:
これで、GOAPライブラリとは何か、何のために使用すべきかを理解する必要があります。まだ質問があるか、このフィールドについてもっと知りたい場合は、ここでJeff Orkinの論文を読むことをお勧めします:http://alumni.media.mit。 edu/〜jorkin/
git clone https://github.com/luxkun/ReGoap.gitそれ以上は何ですか?実際には、図書館がすべての計画を処理し、目標を完了するアクションを選択し、それが完了するまで最初のアクションを実行する、次に2番目の計画などを実行する必要があるのは、独自のアクションと目標を実装することだけです。
次の段落では、独自のクラスを作成する方法を説明します(ただし、ほとんどの動作については、実装する必要があるのはGoApactionとGoapgoalだけです)。
この例のアクションをご覧ください:https://github.com/luxkun/regoap/tree/master/regoap/unity/fsmexample/actions
RegoApactionの実装をチェックして、どの機能をオーバーライドできるかを確認してください:https://github.com/luxkun/regoap/blob/master/regoap/unity/regoapaction.cs
IREGOAPACTIONインターフェイスを実装するか、再生を継承することにより、独自の再現を実装する必要があります。一般的なタイプを賢く選択してください。エージェントのすべてのクラスで同じでなければなりません。通常、文字列、オブジェクトは最も一般的で、int/enumであり、オブジェクトは一般的ですが軽量です。
簡単な実装のために、あなたがしなければならないのはこれだけです:
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
}
}再承認の前に書かれているように、リゲーションはデフォルトではメモリへの効果を記述しませんが、何らかの理由で効果が効果的に行われるかどうかをメモリが確認する必要があります。このコードへの再承認の実装:
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 ) ;
}
}また、次のアクションの前提条件/効果に基づいて動的に変更される前提条件と効果を持つこともできます。たとえば、エージェントのGOTOアクションを処理する方法などです。
これを行う方法については、fsmexampleをご覧ください:https://github.com/luxkun/regoap/blob/master/regoap/unity/fsmexample/actions/genericgotoaction.cs
これはそれほど難しくありません。目標のほとんどは、目覚め機能をオーバーライドして独自の目標状態(目標)を追加するだけです。
とにかく、IREGOAPGOALインターフェイスを実装するか、レゴアプゴールを継承することにより、自分のクラスをゼロから実装する必要があるすべてのように、RegoApgoalをチェックしてください:https://github.com/luxkun/regoap/blob/master/unity/regoapgoal.cs
また、この例の目標(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 ) ;
}
}注:目標が利用できないことをエージェントに自動的に警告する場合は、必ずregoapgoaladvancedを使用してください。
Goapsensor Basic Classをご覧ください:https://github.com/luxkun/regoap/blob/master/regoap/unity/goapsensor.cs
https://github.com/luxkun/regoap/tree/master/regoap/unity/fsmexample/sensorsをご覧ください
いつものように、Regoapsensorを継承するか、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 :)
}
}注:基本クラスではセンサーをチェックおよび更新しないため、センサーを使用するときはregoapmemoryadvancedを使用してください。
もちろん、自分のエージェントをデバッグするには、お気に入りの編集者で自分でデバッグできます。
しかし、Regoapには、Unityのエージェント向けの非常にユーザーフルデバッガーがあります(https://github.com/luxkun/regoap/blob/master/regoap/unity/editor/regoapnodeeditor.csおよびhttps://github.com/luxkun/regoap/ blob/master/regoap/unity/editor/regoapnodebaseeditor.cs)。
使用するには、UnityのメニューウィンドウをクリックしてからRegoApデバッガーをクリックするだけで、Unityウィンドウが開きます。これはエージェントデバッガーです。
これで、シーン内のエージェントをクリックすると(再生中に実行中のエージェントのみ)ウィンドウは自動的に更新され、エージェントの「思考」(現在の世界状態、選択した目標と現在の計画、可能性のある目標、可能なアクション、何ができるのか、何ができないのか、試してみてください!)。
任意のプルリクエストが高く評価されています。ユニティテスト(メニューウィンドウ- >エディターテストランナー- >すべてを実行する)を確認して、同じスタイルのコードを保持してください。