This document is about: QUANTUM 2
SWITCH TO

행동 트리

소개

Bot SDK의 행동 트리는 아직 알파 버전으로, 제품 준비 중이며 API와 성능이 향후 버전에서 향상될 것입니다.

다음은 행동 트리의 동작 방식과 일부 구현에 대하여 상세하게 소개하는 동영상입니다:

**동영상에서 보실 수 있습니다...**

시작부터 1:15까지: 소개;

1:15부터 21:40까지: 행동 트리 기본 개념;

21:40부터 끝까지: 샘플 Decorator/Leaf/Service 노드의 코드 분석.

새로운 행동 트리 생성하기

편집기의 탑 바에서 (+) 버튼을 누르고, 행동 트리 옵션을 선택합니다.

BT 문서 생성
그러면 BT 파일을 저장하라는 메시지가 표시됩니다. 원하는 곳에 저장하십시오. 이렇게 하면 수행한 작업을 **비주얼 편집기**에서 유지하는 데 사용되는 데이터 에셋이 생성됩니다.
BT 파일

노트: 지금 선택한 이름은 비주얼 편집기에서 수행한 작업을 컴파일할 때 추가로 생성된 다른 데이터 에셋의 이름이 됩니다.
이는 Quantum 시뮬레이션에서 봇을 실제로 구동하는 데 사용되는 데이터 에셋이므로 이미 제안된 이름을 선택할 수 있습니다.

초기 노드

파일을 저장하면 작업을 시작할 수 있도록 주 Bot SDK 창이 단일 노드(루트 노드)로 채워집니다.

루트 노드

이름에서 알 수 있듯이, 루트 노드는 트리의 시작점입니다. BT 에이전트 구성요소에서 참조되어야 하는 주요 에셋이며, 실행할 첫 번째 복합 노드 또는 리프 노드가 무엇인지 정의합니다.

루트 노드는 하나의 하위 노드만 가질 수 있습니다. 루트 노드를 다른 노드에 연결하려면 마우스 커서를 루트 노드의 아래쪽에 놓고 나타나는 "+" 단추를 클릭하십시오. 이렇게 하면 연결 프로세스가 시작됩니다.

아직 생성된 다른 노드가 없는 경우 빈 공간을 클릭하면 노드 생성 패널이 나타납니다.

초기 노드

노드 상태

행동 트리의 거의 모든 노드가 고유한 상태를 가집니다. 행동 트리의 흐름이 대부분 그렇게 정의되기 때문에 이것은 매우 중요합니다.

가능한 상태:

  • 성공: 노드가 원래 의도했던 작업을 성공적으로 완료했을 때입니다. 노드가 성공을 반환하면 컨트롤이 트리에서 상위 노드로 상위 노드로 이동합니다. 이제 하위 노드는 하위 노드가 성공했음을 알고 해당 정보를 기반으로 흐름을 정의할 수 있습니다.
  • 실패: 노드가 작업을 실행하지 못한 경우입니다. 이 경우, 결과가 성공일 때 제어는 트리 위로 이동합니다.
  • 실행 중: 해당 특정 프레임에서 노드가 작업을 실패하거나 실행하지 않은 경우 실행을 상위 노드에 다시 조정하기 전에 노드가 더 많은 프레임을 실행해야 합니다. 실행 노드는 BT 에이전트에 캐시되고 결과가 변경될 때까지 연속 프레임에서 반복적으로 실행되므로 한 번에 하나의 실행 노드만 있을 수 있습니다..
  • 비활성: 내부에서만 사용되도록 되어있기 때문에 이 상태에 대해서는 신경 쓰지 않아도 됩니다.

게임의 특정 노드를 코딩할 때, 언제 노드 성공, 실패 또는 실행을 원하는지 결정합니다. 이것은 어떤 행동 트리의 가지를 취할 것인지에 직접적으로 영향을 미칠 것입니다.

노드 유형과 새로운 노드 생성 방법에 대해 자세히 알아보겠습니다.

새로운 노드 생성하기

새 노드를 생성하는 두 가지 주요 방법은 다음과 같습니다.

  • 편집기 창의 빈 공간에 있는 오른쪽 마우스 버튼을 클릭하면 상황에 맞는 메뉴에서 찾을 수 있습니다.
  • 노드에서 새 링크를 초기화한 다음 빈 공간을 클릭합니다.

이제 어떤 유형의 노드를 생성할 수 있는지 살펴보겠습니다.

복합 노드

이러한 것들이 행동 트리의 주요 흐름 제어 소스입니다. 이들은 실행할 수 있는 다음 노드를 정의하고 서로 다른 방식으로 작동합니다.

복합 노드에서는 자식 노드를 왼쪽에서 오른쪽으로 실행하려고 합니다. 즉, 우선순위가 정의되는 방법입니다.

복합 노드는 0부터 여러 개까지 자식 노드에 연결할 수 있습니다.

선택 노드

OR 연산자와 동일합니다.

  • 자식이 성공하는 즉시 성공합니다. 이때 실행이 중지되고 컨트롤이 Selector의 상위 노드로 이동하여 "성공" 결과가 나타납니다. 실행할 하위 항목이 남아 있는 경우 이 반복 시 하위 항목이 실행되지 않습니다.
  • 모든 하위 항목이 실패하는 경우에만 실패하며, 이 경우 Selector는 "실패" 결과를 상위 노드에 반환합니다.
선택 노드

시퀀스 노드

AND 연산자와 동일합니다.

  • 자식이 실패하는 즉시 실패합니다. 부모 노드에 "실패"를 되돌려주고, 자식은 실행된 채로 남아있지 않습니다.
  • 하위 항목이 모두 성공한 경우에만 성공합니다. 이 경우 시퀀스는 "성공" 결과를 상위 노드에 반환합니다.
시퀀스 노드

데코레이터를 사용하여 중단

노드 상태 항목에서 설명한 것처럼 리드 노드의 상태가 실행 중이면 특정 리프 노드가 캐시 되어 다음 프레임에서 다시 실행됩니다. 그러나 이는 또한 일부 조건에 따라 해당 리프 노드의 실행을 중단시킬 수 있는 몇 가지 방법이 필요하다는 것을 의미합니다. 예를 들어, FPS 캐릭터가 표적을 쏘다가 갑자기 자신의 방향으로 수류탄이 던져진 것을 인식한다면, 캐릭터는 슈팅을 멈추고 수류탄을 피할 수 있도록 엄호해야 합니다.

이미 체크된 데코레이터는 매 프레임마다 다시 체크되지 않습니다. 하지만 위의 예에서 설명한 것처럼, 우리는 우리가 리프를 방해할 수 있도록 데코레이터가 재실행되는 특별한 경우를 원할 수도 있습니다.

방해는 2가지 방식으로 수행할 수 있습니다:

동적 구성 노드

이미 인지하고 계실 수 있으나, 모든 복합 노드는 IsDynamic 필드가 있으며, 편집 시간 동안에 Boolean 값을 토글 할 수 있습니다:

Dynamic Composites

복합 노드가 동적 노드인 경우 이는 특정 복합 노드가 실행 중인 현재 하위 트리의 일부이지만 모든 해당 장식자가 프레임마다 다시 검사됨을 의미합니다. 데코레이터 중 하나에 장애가 발생하면 현재 리프 노드가 중단되고 복합 노드가 실패로 됩니다.

이 이점은 체크 표시마다 재평가해야 하는 복합 노드를 선택할 수 있기 때문에 자신의 트리를 최적화할 수 있는 방법을 보다 효과적으로 제어할 수 있습니다는 점입니다.

반응형 데코레이터

Blackboard를 사용하는 데코레이터 노드가 있는 경우, 해당 데코레이터를 특정 Blackboard 항목의 변경 사항을 감시하도록 할 수 있습니다.

장점은 모든 체크 표시를 수행하는 것이 아니라 Blackboard 항목에 새로운 체크 표시를 설정한 경우에만 체크합니다는 것입니다.

예를 들어: "CompareIntegersDecorator"가 있습니다. Blackboard의 정수 "A"가 Blackboard의 정수 "B"보다 큰 지 여부를 확인합니다. 반응형 데코레이터를 사용하면 코드의 어느 부분에서든 Blackboard의 항목 "A" 또는 "B"를 변경한 경우에만 검사가 적용됩니다.

중단이 발생하면 현재 실행 중단 방법을 선택할 수 있습니다. 세 가지 유형은 다음과 같습니다.

  • Self: 현재 노드 실행을 중지하고 흐름을 다시 판단합니다.
  • 낮은 우선순위 : 현재 노드를 계속 실행하지만 낮은 우선순위 노드를 실행할 수 없게 합니다.
  • 둘 다: 이건 셀프 설명입니다.

데코레이터 노드 자체에서 중단 유형을 정의할 수 있습니다.

반응형 데코레이터

반응형 데코레이터는 시뮬레이션 코드에 설정되어 있으므로 BT 코딩 세션에서 자세한 내용을 확인하십시오.

리프 노드

이러한 노드는 동작 트리에서 가장 하위 레벨 노드입니다.

게임 관련 로직의 대부분을 수행할 책임이 있으며, 실행 시 반환되는 상태에 크게 의존합니다.

리프 노드의 간단한 예는 다음과 같습니다.

  • 대기 노드: 일정 시간이 경과할 때까지 계속 실행됩니다. 타이머가 완료되면 SUCCESS를 반환합니다.
  • Chase Node: 실행 중 BT 에이전트를 대상 엔티티로 계속 이동합니다. 에이전트가 목표에 도달하는 경우 성공 여부를 반환합니다. 에이전트가 해당 대상에 도달하지 못하도록 차단된 경우(예: 대상이 파괴된 경우 또는 별도의 탐색 메시 영역에서) FAIL을 반환합니다.
  • 디버그 노드: 콘솔에서 메시지를 인쇄하고 항상 SUCCESS로 돌아갑니다;

따라서 반환해야 하는 상태는 사용자의 필요에 따라 완전히 달라집니다.

리프 노드

데코레이터 노드

데코레이터는 조건 노드입니다. 이러한 분기는 실행할 분기의 정의에 도움이 됩니다.

상태를 반환할 수 있을 뿐만 아니라 이 유형의 노드도Boolean을 반환하고, 부울 결과가 True 이면 성공, 부울 결과가 False 이면 실패로 이어집니다.

데코레이터 노드는 데코레이터가 연결된 하위 트리의 실행을 차단하거나 허용할 수 있습니다. 복합 및 리프 노드 내에 추가되므로 실행하기 전에 고려해야 할 몇 가지 노드를 선택적으로 표현할 수 있습니다.

데코레이터 노드의 예는 다음과 같습니다.

  • Ammunition 노드 포함: BT 에이전트의 무기에 0개 이상의 탄환이 있을 경우 TRUE를 반환합니다.

  • Target Node 포함: BT 에이전트가 메모리(또는 Blackboard에 정의된 Target)를 가진 경우 TRUE를 반환합니다.

  • Cooldown Node: 마지막 "T 초"에 특정 노드가 실행되지 않은 경우에만 TRUE를 반환합니다.

따라서 데코레이터는 일부 가지를 허용하거나 차단하는 데 사용됩니다. 예를 들어, "Ammunition 노드 포함"을 사용하여 "사격" 가지를 실행하거나, 이를 차단하고 트리를 "무기 재적재" 분기로 유도할 수 있습니다.

데코레이터를 정의하려면 복합 또는 리프 노드를 두 번 클릭하면 하위 그래프로 이동됩니다. 여기서 지정된 순서대로 실행할 장식자 목록을 찾을 수 있습니다. 마우스 오른쪽 버튼으로 새 장식기를 만들고 데코레이터 루트 노드와 연결합니다. 아래 이미지와 같습니다.

데코레이터 노드

노드의 하위 그래프에 정의된 데코레이터는 데코레이터 목록의 최상위 보기에서 볼 수 있습니다.

데코레이터 탑 뷰

서비스 노드

대부분 동작 트리의 흐름에 직접적인 영향을 미치지 않는 헬퍼 노드로 사용됩니다. 이러한 노드는 일반적으로 다시 튜닝할 필요 없이 게임 상태를 변경하는 데 사용됩니다.

서비스 노드는 상태를 반환하지 않는 유일한 노드 유형입니다.

데코레이터와 마찬가지로 서비스 노드도 복합 또는 리프 노드에 추가할 수 있습니다. 노드의 하위 그래프로 이동하여 서비스 루트 노드에 만들거나 링크하기만 하면 됩니다.

서비스 노드의 한 가지 중요한 특성은 예약이라는 것입니다. 모든 서비스 노드에는 IntervalInSec 필드가 있습니다. 이 필드는 편집 시간 동안 정의하여 해당 서비스를 실행할 빈도를 정의할 수 있으며, 이 필드를 사용하면 성능에 대한 제어력이 향상되므로 유용합니다.

서비스 샘플

서비스 노드의 예는 다음과 같습니다:

  • 대상 위치 노드 업데이트: 에이전트가 가야 할 위치를 수시로 업데이트합니다. NavMesh와 관련이 있을 수 있습니다(예: 임의의 위치를 얻는 것 등), 특정 엔터티를 쫓는 것과 관련이 있을 수 있습니다.
  • 점프 노드 수행: 에이전트는 가끔 점프를 수행합니다.

따라서 상태를 반환할 필요가 없으므로 필요한 모든 노드에 연결할 수 있으며 디커플링까지 지원할 수 있기 때문에 서비스가 도우미로 사용됩니다.

서비스는 실행 중인 하위 트리의 일부로 저장됩니다. 즉, 서비스가 있는 선택기 노드가 현재 특정 리프를 실행하여 "고착된" 경우, 선택기 노드에 포함된 서비스는 하위 트리가 더 이상 현재 상태가 아닐 때까지 계속 실행됩니다. 따라서 전체 트리는 대상 위치가 업데이트되는 경우에 따라 다르다고 가정한 다음, 사용자가 가지고 있는 첫 번째 선택기/시퀀스에 UpdateTargetPosition 노드를 추가할 수 있습니다. 또는 트리에 대상 위치가 필요한 부분이 하나만 있는 경우 서비스를 바로 여기에 추가할 수 있습니다. 그래서 매우 유연합니다.

데코레이터와 마찬가지로 맨 위 그래프 보기의 서비스 목록을 관찰할 수 있습니다.

서비스 예제
## 행동 트리 컴파일하기

생성한 BT를 실제로 사용하려면 작업을 컴파일해야 합니다.

컴파일하려면 두 가지 옵션이 있습니다.

컴파일 버튼
  • 왼쪽 버튼은 현재 열린 문서만 컴파일 하는데 사용됩니다.
  • 오른쪽 버튼은 프로젝트의 모든 AI 문서를 컴파일 하는데 사용됩니다.

BT 파일은: "Assets/Resources/DB/CircuitExport/BT_Assets"에 위치해 있습니다.

BT 에셋

봇들이 사용할 수 있도록 AI 설정하기

마지막으로 생성된 AI를 사용하려면 컴파일된 에셋만 참조하면 됩니다.
GUID에 따라 자산을 로드하거나 원하는 AI 에셋에 AssetRefBTRoot를 생성할 수 있습니다.

Referencing AI

행동 트리 코딩

엔티티에 컴포넌트 추가하기

자신의 에이전트 설정을 위해서, 엔티티 프로토타입위에 직접 BTAgent 컴포넌트를 추가하거나 var btAgent = new BTAgent()를 통해 컴포넌트 생성 시에 추가하고 엔티티 선택에 frame.Set(myEntity, btAgent)로 설정합니다.

BTAgent 초기화하기

그런 다음 애플리케이션에 더 적합한 시점에 다음을 호출해야 합니다.

C#

var btRootAsset = f.FindAsset<BTRoot>(btReference.Id);
BTManager.Init(f, myEntity, btRoot);

파라미터는 다음과 같습니다.

  1. 프레임;
  2. BTAgent 컴포넌트를 포함하고 있는 엔티티;
  3. 비주얼 에디터에서 생성된 BTRoot 에셋;

이제 엔티티의 BTAgent가 초기화되었으므로, 시스템의 업데이트에서 Update 메소드를 호출하면 됩니다:

C#

BTManager.Update(f, myEntity);

이를 통해 AI는 사용자가 Visual Editor에 생성한 흐름을 이미 실행해야 합니다.

노드 코딩

전체적으로 대부분의 노드 유형은 동일한 클래스에서 상속되므로 모두 매우 유사한 API를 공유하여 사용자가 직접 사용자 지정 코드를 생성할 수 있습니다.

이 초기 동작 트리 개발 단계에서는 리프, 데코레이터 및 서비스 노드만 구현하고, 새로운 복합 노드를 구현해야 할 경우 각별히 주의해야 합니다. 이러한 유형의 노드는 BT 작동 방식에 대한 약간의 지식이 필요하기 때문입니다. 새로운 복합 노드도 추가하도록 요청할 수 있습니다. 게임 관련 노드가 아닌 일반 사용 노드로서 의미가 있는 경우 기본 SDK의 일부로 구현하여 제공할 수 있습니다.

나만의 데코레이터/리프 노드로 시작하기

  • 새로운 데코레이터 노드 생성을 위해서, BTDecorator에서 상속받은 새로운 클래스를 생성합니다.
  • 새로운 리프 노드 생성을 위해서, BTLeaf에서 상속받은 새로운 클래스를 생성합니다.
  • 새로운 서비스 노드를 생성하기 위해서, BTService에서 상속받은 새로운 클래스를 생성합니다.

중요: 위의 모든 클래스는[System.Serializable]로 표시해야 합니다.

데코레이터와 리프 노드용 API

  • InitBTManager.Init 이 호출될 때 한 번호출됩니다. 특정 노드의 데이터를 위한 공간을 할당하는 데 사용되어야 합니다. 이에 대한 자세한 내용은 다음 항목인 Node Data를 참조하십시오.
  • OnEnter는 노드의 업데이트가 실행되기 전에 특정 노드를 방문하는 시점에 호출됩니다. 타이머 FP 저장 등 데이터 설정에 유용합니다. WaitLeaf 클래스에는 에이전트에 타이머 정보를 저장하는 방법에 대한 예가 있습니다. 하지만, 이는 Node Data 항목에 더 잘 설명되어 있습니다.
  • OnUpdate는 리프가 실행되는 동안 모든 틱에서 호출됩니다. BTStatus를 되돌려주며 Success/Failure/Running에서 선택하여 리턴할 수 있습니다. 간단한 예로서, DebugLeaf에서는 항상 Success 결과임을 볼 수 있습니다. WaitLeaf 클래스는 샘플보다는 좀 더 복잡하고 Running 또는 Success를 되돌려 줍니다.
  • OnExit는 노드가 해당 작업을 완료했거나 노드가 중단되고 트리에서 실행이 위쪽인 경우 이 명령을 호출합니다. 필요한 경우 데이터를 초기화 취소하는 데 사용할 수 있습니다.

데코레이터 노드에 대하여 고려해야 할 점

데코레이터에는 오버라이드 하는 추가 메소드를 가지고 있습니다:

  • DryRun는 노드의 Update 하는 동안 호출됩니다. 게임 요건에 따라 Boolean 을 리턴해줍니다.

데코레이터를 구현할 때 일반적으로 DryRun 방법을 사용하는데, DryRun이 Success 또는 Failure을 반환하면 직접적으로 달라지는 True 또는 False 중 하나를 반환하기 때문에 DryRun 방법을 구현하는 데 더 신경을 쓰는 것이 일반적입니다. 따라서 OnUpdate 메소드를 구현하여 이를 변경해야 하는 경우가 가장 흔하지는 않지만, 필요한 경우가 될 수 있습니다.

서비스 노드용 API

  • Visual Editor에 정의된 간격에 따라 서비스가 실행될 때마다 OnUpdate가 호출됩니다.

노드 데이터

일부 노드에는 자체 정수 및/또는 FP 데이터가 필요할 수 있으며, 이 데이터는 게임 상태에 추가되어야 하며 노드 자체에서만 업데이트할 수 있습니다.

일부 중요한 노드에서 매우 흔하므로 BTAgent 컴포넌트는 해당 노드별 데이터를 저장할 수 있는 스토리지를 이미 가지고 있습니다.

예를 들어:

  • 복합 노드가 실행 중인 현재 하위 인덱스를 저장해야 합니다.;
  • WaitLeaf 노드는 대기 시간이 끝날 시간 값을 저장해야 합니다.

마찬가지로, 런타임에 변경해야 하는 데이터가 노드에 있을 수 있습니다.

그러나 노드는 데이터 자산이므로 런타임 중에는 필드를 변경할 수 없습니다. 데이터를 프레임 데이터로 저장한 다음 거기서 변경해야 합니다.

정수 및 FP 필드의 경우 BTDataIndex 유형을 사용하여 쉽게 확인할 수 있습니다. 이 구조는 비주얼 에디터의 컴파일 프로세스 중에 미리 작성되며 노드 자산에 있는 모든 BTDataIndex에 고유한 인덱스 값이 지정되도록 보장합니다.

노드에 이러한 휘발성 데이터가 필요한 경우 다음 단계를 따라 진행하면 됩니다.

  • 해당 인덱스가 나타낼 데이터를 알 수 있도록 제안한 이름을 가진 BTDataIndex 유형의 새 필드를 만듭니다. 예를 들어 WaitLeaf 코드에서 필드 선언은 public BTDataIndex EndTimeIndex;입니다. 특정 노드가 런타임 중에 EndTime을 읽거나 써야 하기 때문에 이 작업을 수행합니다.
  • Init 메소드에, 다음을 실행하여 BTAgent에 데이터를 할당합니다: btAgent->AddFPData() 또는 btAgent->AddIntData();. 매개변수에 저장하고자 하는 초기 값이 무엇인지 알려줍니다.
  • BTAgent로부터 데이터를 읽기 위해서 다음을 실행합니다: p.BtAgent->GetFPData(frame, EndTimeIndex.Index), EndTimeIndex는 WaitLeaf 노드의 폼으로 샘플입니다;
  • BTAgent에 데이터를 작성하기 위해서, 다음을 실행합니다: p.BtAgent->SetFPData(frame, endTimeValue, EndTimeIndex.Index);

반응형 데코레이터 코딩

이전 항목에서 설명한 것처럼 Blackboard 항목을 관찰하는 데코레이터가 있는 경우 이를 사후 대응 데코레이터로 등록할 수 있으므로, 관찰된 항목에 변경 사항이 적용될 때마다 데코레이터가 다시 검사되어 현재 실행을 중단할 수 있습니다.

코드 측면에서는 반응형 장식기를 사용하려면 다음 단계를 수행합니다.

  • Decorator 클래스의 OnEnter 메소드에서 관찰하고 싶은 항목에 따라 필요한 모든 Blackboard 엔트리에 Decorator를 등록합니다:
// --> Sample from BTBlackboardCompare

    // We let the user define, on the Visual Editor, which Blackboard entries
    // shall be observed by this Decorator
    public AIBlackboardValueKey BlackboardKeyA;
    public AIBlackboardValueKey BlackboardKeyB;

    public override void OnEnter(BTParams p)
    {
      base.OnEnter(p);

      // Whenever we enter this Decorator...
      // We register it as a Reactive Decorator so, whenever the entries are changed,
      // the DryRun is executed again, possibly aborting the current execution
      p.Blackboard->RegisterReactiveDecorator(p.Frame, BlackboardKeyA.Key, this);
      p.Blackboard->RegisterReactiveDecorator(p.Frame, BlackboardKeyB.Key, this);
    }
  • OnExit에서, Decorator를 등록 해제합니다:
// --> Sample from BTBlackboardCompare
    
    public override void OnExit(BTParams p)
    {
      base.OnExit(p);
      
      // Whenever the execution goes higher, it means that this Decorator isn't in the current subtree anymore
      // So we unregister this Decorator from the Reactive list. This means that if the Blackboard entries
      // get changed, this Decorator will not react anymore
      p.Blackboard->UnregisterReactiveDecorator(p.Frame, BlackboardKeyA.Key, this);
      p.Blackboard->UnregisterReactiveDecorator(p.Frame, BlackboardKeyB.Key, this);
    }
  • Blackboard 항목을 변경할 때마다 반응형 장식기 반응을 트리거 할수 있습니다.
blackboard->Set(f, "SomeKey", someValue)->TriggerDecorators(p);

필드값 정의하기

여기서 작업/의사 결정 필드에 값을 설정할 때 사용할 수 있는 대체 항목에 대한 자세한 정보를 확인하십시오.: 필드값 정의하기.

AIParam

AIParam 사용에 대한 자세한 내용은 여러 가지 방법으로 정의할 수 있는 필드를 보다 유연하게 사용하려면 여기서 확인하십시오.: 직접 또는 Blackboard/Constant/Config 노드에서 설정: AIParam.

BotSDKSystem

Blackboard 메모리 할당 해제와 같은 일부 프로세스를 자동화하는 데 사용되는 클래스가 있습니다. 자세한 내용은 여기를 참조하십시오: BotSDKSystem.

디버거

Bot SDK는 자체 디버깅 툴과 함께 제공됩니다. 이를 통해 개발자는 런타임 중에 BTA 에이전트를 선택하고 비주얼 에디터에 강조 표시된 최신 에이전트 흐름을 볼 수 있습니다. 다음은 Bot SDK 샘플 프로젝트에서 작업하는 디버깅 툴의 샘플입니다.

디버거 그래프
  • 파란색 = 현재 실행 중인 하위 트리입니다. 파란색 링크는 멀리까지 이동한 경로를 나타내며 가장 깊은 파란색 노드가 현재 실행 중인 노드입니다.
  • 녹색 = 애플리케이션에서 성공한 모든 하위 트리입니다. 복합 노드는 하위 노드가 적절하게 성공한 경우에만 녹색으로 칠해집니다(순서에는 모든 성공적인 하위 항목이 필요하고 선택기에는 하나 이상의 성공한 하위 항목이 필요합니다).
  • 붉은색 = 애플리케이션에서 실패한 모든 하위 트리입니다;
  • 회색 = 아직 호출되지 않은 가지들이며, 나중에 호출될 수 있습니다.

디버거 사용하기

다음은 프로젝트에서 디버거를 사용하기 위한 단계별 절차입니다:

  1. SystemSetup.cs에서 BotSDKDebuggerSystem를 사용하도록 합니다. 디버깅 로직을 다른 곳에 두는 것이 좋다면, 이 특정 시스템을 사용하는 것은 선택 사항으로 커스텀 시스템에서 검증된 프레임에서 BotSDKDebuggerSystem.OnVerifiedFrame?.Invoke(f); 을 호출하면 됩니다.
  2. 비주얼 편집기에서, 상단 패널의 버그 아이콘을 클릭합니다. 아이콘이 녹색으로 변경될 때 디버깅이 활성화됩니다
Debug Active

이제 디버깅할 엔터티를 선택하는 두 가지 방법이 있습니다. 선택한 게임 개체와 관련되거나 인스펙터 창에서 선택할 수 있습니다. 위의 항목 중 하나를 선택하거나 두 개 모두 선택합니다.

게임 오브젝트에서 디버깅하기:

  1. 컴포넌트로 BTAgent를 갖고 있는 Quantum 엔티티를 나타내는 프리팹/엔티티 프로토타입을 선택합니다.

  2. 거기에 BotSDKDebugger를 추가합니다.

  3. 런타임에 Bot SDK 창이 열린 상태에서 BotSDKDebugger가 추가된 게임 개체를 선택합니다. 잘했어요! 디버깅이 이미 작동 중이어야 합니다.

디버거 인스펙터 창에서 디버깅하기:

  1. 디버거 활성화 버튼 오른쪽에 있는 버튼을 클릭하십시오. BT 에이전트 및/또는 상태 머신 에이전트인 모든 엔티티를 보여주는 새 창이 열립니다. 디버깅할 항목을 선택하면 끝입니다.
디버그 윈도우
Debugger Inspector

중요: 디버거가 활성화되면, 디버거는 디버깅에 필요한 데이터를 저장하기 위해 메모리를 할당합니다. 에디터로부터 플레이하는 경우 게임 속도가 느려질 수 있습니다. 따라서 유니티 내에서 애플리케이션을 프로파일링 하는 경우 프로파일링의 일부가 디버거와 관련이 있을 수 있으므로 프로파일링 중에 비활성화하는 것을 고려해 보십시오.

PS: 디버거 창은 엔티티 뷰를 갖고 있지 않은 엔티티들이 보일 수 있으므로, 이렇게 하면 해당 BT를 디버그 할 수 있습니다.

PS2: 현재 DSL 글로벌에 있는 에이전트와 같이 엔티티에 연결되지 않은 에이전트를 디버깅할 수 없습니다. 이 옵션은 이후 버전에서만 추가됩니다.

비주얼 편집기 주석

비주얼 편집기에 주석을 작성하는 방법에 대한 자세한 내용은 여기에서 확인하십시오.: 비주얼 편집기 주석.

컴파일 내보내기 폴더를 변경

기본적으로 Bot SDK의 컴파일에서 생성된 에셋은 Assets/Resources/DB/CircuitExport 폴더에 저장됩니다. 내보내기 폴더를 변경하는 방법은 여기를 참조하십시오 : 내보내기 폴더 변경하기.

저장된 기록 크기를 선택

Bot SDK 파일에 저장된 기록 항목의 양을 변경할 수 있습니다. 이 문제에 대한 자세한 내용은 여기를 참조하십시오: 기록 저장 개수 변경하기.

Back to top