Unity3d 예제 및 도우미 수업이있는 일반 C# GOAP (GOOR OREDED ACTION PLANNING) 라이브러리.
이 라이브러리는 매우 일반적입니다. Unity 폴더를 포함하지 않으면 모든 게임 엔진에서 사용할 수 있습니다.
Unity FSM 예제를 여기에서 확인하여 시작하십시오.
이 예제는 매크로 행동을 처리하기 위해 간단한 FSM (유한 상태 기계)과 함께 Regoap 라이브러리를 유니티로 사용합니다 (대부분의 게임에서는 3 개의 FSM 상태가 충분해야합니다 : 유휴, Goto, Animate).
이를 사용하려면 새로운 유니티 프로젝트를 만들고 쉘을 열고 자산 디렉토리로 이동하여 전체 저장소를 복제하십시오.
git clone https://github.com/luxkun/ReGoap.git(Windows에서는 명령 줄 또는 GIT 클라이언트를 사용하여 동일한 작업을 수행 할 수 있으며 "복제 또는 다운로드"를 클릭 한 다음 "Zip 다운로드"를 클릭하면됩니다.
또한 마지막 릴리스의 Unity 패키지를 다운로드 할 수 있습니다.이 패키지는 아마도 최신 변경 사항이 없거나 Unity Asset Store에서 최신 변경 사항이 없습니다.
(도서관을 사용하고 싶고 설명 된 예제를 원한다면 Regoap 사용 방법 으로 건너 뛰십시오)
게임 에서이 라이브러리를 사용하는 방법을 설명하기 전에 Jeff Orkin의 견적으로 시작하여 GAAP 시스템이 어떻게 작동하는지 설명해 드리겠습니다.
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.
기본적으로 모든 것은 선택의 목표를 달성 할 계획 (행동 목록)을 찾는 것입니다.
이해해야 할 주요 개념은 상태, 행동, 목표, 메모리 및 센서입니다.
세계의 정의이며,이 라이브러리에서 그들은 문자열 to object (dictionary <string, object>)의 사전으로 처리됩니다.
이 파일에서 https://github.com/luxkun/regoap/blob/master/regoap/core/regoapstate.cs에서 Regoapstate 클래스를 확인하십시오
예 : 'ISAT': 'Enemy', 'Iswarned': True, 'Hasweapon': True
전제 조건 및 효과 목록으로 정의 될 수 있습니다. 이는 에이전트 (AI Pawn, 지금부터 에이전트로 불림)가 할 수있는 조치입니다.
전제 조건은 상태로 설명 된 행동이 실행되어야한다는 요구 사항이며, 이름에서 알 수 있듯이 그 효과는 상태로 설명 된 행동의 영향입니다.
예 :
중요 : 허위 전제 조건이 뒷받침 되지 않습니다 : 작업이 완료 될 때 액션 효과가 메모리에 기록되지 않음, 대부분의 게임에서 이러한 변수를 메모리 나 센서에서 설정하려고하기 때문에 원하는 동작입니다. . 원한다면 regoapaction의 종료를 무시하고 효과를 메모리에 설정할 수 있습니다.
상태로 설명 된 필수 목록으로 정의 될 수 있습니다. 이것은 기본적으로 에이전트가해야 할 일입니다.
예 :
에이전트의 기억은 에이전트가 알고 있고 느끼는 모든 것이 여기에 삽입되어야합니다. 메모리에는 메모리 도우미 인이 라이브러리에 많은 센서가있을 수 있습니다. 기본적으로 메모리의 임무는 '세계'상태를 만들고 업데이트하는 것입니다.
메모리 도우미이며 특정 범위를 처리해야합니다.
예:
이제 GOAP 라이브러리가 무엇인지, 무엇을 사용해야하는지 이해해야합니다.이 분야에 대해 질문이 있거나 더 많은 것을 알고 싶다면 Jeff Orkin의 논문을 읽어 보는 것이 좋습니다 : http://alumni.media.mit. Edu/~ Jorkin/
git clone https://github.com/luxkun/ReGoap.git무엇이 더 있습니까? 실제로 도서관은 모든 계획을 처리하고 목표를 달성하기위한 조치를 선택하고 목표를 달성 할 때까지 첫 번째 목표를 달성 할 수 없습니다. 두 번째 등은 자신의 행동과 목표를 구현하기 만하면됩니다.
다음 단락에서는 자신의 수업을 만드는 방법을 설명하겠습니다 (그러나 대부분의 행동에 대해 구현 해야하는 모든 것은 gooapaction and gaapgoal입니다).
이 예제의 조치를 확인하십시오 : https://github.com/luxkun/regoap/tree/mas
재정의 할 수있는 기능을 보려면 regoapaction 구현을 확인하십시오 : https://github.com/luxkun/regoap/blob/master/regoap/unity/regoapaction.cs
IREGOAPACTION 인터페이스를 구현하거나 RegoApAction을 상속하여 자신의 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 이전에 작성된대로 기본적으로 메모리에 영향을 쓰지 않지만 메모리는 효과가 효과적으로 수행되는지 확인해야합니다. 어떤 이유로 든 추가 작업의 끝에서 효과를 설정하려면 이 코드는 귀하의 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 ) ;
}
}또한 다음 조치의 전제 조건/효과를 기반으로 동적으로 변경된 전제 조건 및 효과를 가질 수 있습니다.
fsmexample을 확인하여 다음 방법을 확인하십시오 : https://github.com/luxkun/regoap/blob/master/regoap/unity/fsmexample/actions/genericgotoaction.cs
이것은 덜 까다 롭습니다. 대부분의 목표는 깨어있는 기능을 무시하여 자신의 목표 상태 (목표)를 추가합니다.
어쨌든 regoapgoal을 확인하십시오. iriregoapgoal 인터페이스를 구현하거나 regoapgoal을 상속 받음으로써 자신의 클래스를 처음부터 구현 해야하는 모든 것과 마찬가지로 : https://github.com/luxkun/regoap/blob/master/regoap/unity/regoapgoal.cs
또한이 예제의 목표를 확인하십시오 : https://github.com/luxkun/regoap/mas
public class MyGoapGoal : ReGoapGoal < string , object >
{
protected override void Awake ( )
{
base . Awake ( ) ;
goal . Set ( " myRequirement " , myValue ) ;
}
}참고 : 대리인에게 목표를 사용할 수 없음을 자동으로 경고하려면 RegoApgoAlAdAnced를 사용해야합니다.
goapsensor 기본 클래스를 확인하십시오. https://github.com/luxkun/regoap/blob/master/regoap/unity/goapsensor.cs를 확인하십시오
https://github.com/luxkun/regoap/tree/mas
언제나 그렇듯이 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 :)
}
}참고 : 센서로 작업 할 때는 기본 클래스가 센서를 확인하고 업데이트하지 않으므로 센서로 작업 할 때 regoapmemoryAdcanced를 사용해야합니다.
자신의 에이전트를 디버깅하려면 물론 좋아하는 편집자와 함께 직접 디버그 할 수 있습니다.
그러나 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 Debugger를 클릭하면 Unity Window가 열리면 에이전트 디버거입니다.
이제 장면의 모든 에이전트를 클릭하면 (플레이 중에, 실행중인 에이전트에서만 작동) 창은 자동으로 업데이트됩니다. 무엇을 할 수 있고 무엇을 시도해보십시오!).
모든 풀 요청에 감사드립니다. 커밋하고 동일한 스타일의 코드를 유지하기 전에 Unity Test (메뉴 창 -> 편집기 테스트 러너 -> 모두 실행 )를 확인하십시오.