Общая библиотека C# Goap (Planned Action Planning) с классами Unity3D и помощниками.
Эта библиотека очень общая, если вы не включаете папку Unity, вы можете использовать ее в любом игровом двигателе.
Начните с проверки примера Unity FSM здесь.
В этом примере используется библиотека RegoAP в Unity с простым FSM (конечным состоянием машины) для обработки макро -поведения (в большинстве игр должно быть достаточно трех состояний FSM: Idle, Goto, Animate).
Чтобы использовать его, создать новый проект Unity, открыть оболочку, перейдите в каталог активов и клонируйте весь репозиторий там:
git clone https://github.com/luxkun/ReGoap.git(В Windows вы можете сделать то же самое с командной строкой или любым клиентом GIT, также вы можете просто нажать на «клон или скачать», а затем «Загрузить Zip»)
Кроме того, вы можете просто загрузить пакет Unity Legance, который, вероятно, не будет иметь последних изменений, здесь или в магазине Unity Asset.
(Если вы просто хотите использовать библиотеку и хотите объясненный пример, пропустите, как использовать RegoAp )
Прежде чем объяснить, как использовать эту библиотеку в вашей игре, позвольте мне объяснить, как работает система кожи, начиная с цитаты Джеффа Оркина
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.
По сути, все, что он делает, - это найти план (список действий), который выполнит цели выбранной цели.
Основная концепция, которую вам нужно понять, - это состояния, действия, цель, память и датчики
является определением мира, в этой библиотеке они обрабатываются как словарь строки для объекта (словарь <строка, объект>).
Проверьте класс RegoApState в этом файле: https://github.com/luxkun/regoap/blob/master/regoap/core/regoapstate.cs
Пример: «isat»: «враг», «iswarned»: true, «hasweapon»: true
Может быть определен как список предварительных условий и эффектов, это действия, которые может сделать агент (AI Pawn, теперь будет называться агентом).
Предварительные условия - это требование о том, что действие требует выполнения, описанного как состояние, эффекты, как следует из названия, являются последствиями действия, а также описаны как состояние.
Примеры:
Важно : ложные предварительные условия не поддерживаются важны : эффекты действия не записаны в памяти, когда действие будет выполнено, это разыскиваемое поведение, потому что в большинстве игр вы захотите установить эти переменные из памяти или от датчиков Полем Если вы хотите, вы можете переопределить выход в своем RegoApaction и установить эффекты в память, пример следующим образом.
может быть определен как список реквизитов, описанный как состояние, это в основном то, что должен делать агент.
Примеры:
Это память агента, все, что агент знает и чувствует, должно быть вставлено здесь. В этой библиотеке также может быть много датчиков, которые являются помощником памяти. В основном задача памяти состоит в том, чтобы создать и продолжать обновлять состояние «мира».
это помощник памяти, он должен обрабатывать определенную область.
Пример:
Теперь вы должны понимать, для чего это библиотека Goap, и для чего вы должны использовать ее, если все еще иметь вопросы или хотите узнать больше об этой области, я советую вам прочитать документы Джеффа Оркина здесь: http://alumni.media.mit. edu/~ jorkin/
git clone https://github.com/luxkun/ReGoap.gitЧто еще? Ничего, библиотека не будет справляться со всем планированием, выберите действия, чтобы достичь цели и запустить первую, пока она не будет сделана, затем второй, и так далее, все, что вам нужно сделать, это реализовать свои собственные действия и цели.
В следующих параграфах я объясню, как создать свои собственные занятия (но для большинства поведений все, что вам нужно для реализации, это GoApcation и Goapgoal).
Проверьте действия в этом примере: https://github.com/luxkun/regoap/tree/master/regoap/unity/fsmexample/actions
Проверьте реализацию RegoApaction, чтобы увидеть, какие функции вы можете переопределить: https://github.com/luxkun/regoap/blob/master/regoap/unity/regoapaction.cs
Вы должны реализовать свой собственный RegoApaction, внедрив интерфейс IREGOAPACTION или унаследовав RegoApaction. Выбирайте мудро общие типы, они должны быть одинаковыми во всех классах агента. Обычно строка, объект является наиболее общим, также 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
}
}Как было написано до того, как регроапикция не по умолчанию не записывает эффекты на память, но память должна проверить, эффективно ли это эффекты, если по какой -либо причине вы хотите установить эффекты в конце действия, вы можете добавить Этот код для вашей реализации RegoApaction:
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
Это менее сложно, большая часть цели только переоценит функцию бодрствования, чтобы добавить свое собственное состояние цели (цели).
В любом случае, проверьте RegoApgoal, как и все, что вам нужно для реализации собственного класса с нуля, внедряя интерфейс iRegoApgoal или унаследовав RegoApgoal: https://github.com/luxkun/regoap/blob/master/regoap/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 здесь: 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, это отладчик агента.
Теперь, если вы нажмете на любого агента в своей сцене (во время игры, работает только на управляемых агентах), окно автоматически обновляет вас, сообщая вам «мысли» агента (текущее мировое государство, выбранное цель и текущий план, возможные цели, возможные действия, Что можно сделать, а что нет, попробуйте!).
Любой запрос на вытягивание ценится, просто обязательно проверьте тесты Unity ( Windue Menu -> Editor Tests Runner -> запустить все ), прежде чем совершать и сохранить тот же стиль кода.