This document is about: QUANTUM 2
SWITCH TO

공유 개념

한 개 이상의 Bot SDK AI 모델에 대해 몇 가지 동일한 개념을 확인하실 수 있습니다.

액션 정의하기

HFSM에서는 모든 상태는 그 내부에 하위-그래프를 가지고 있습니다. GOAP에서는 모든 태스크에도 하위-그래프가 있습니다. 이는 상태/태스크를 두 번 클릭하여 액세스할 수 있습니다. 이러한 하위-그래프에서, 액션 생성을 할 수 있습니다.

하위 그래프에 액세스할 때 맨 위 막대에 현재 계층 깊이를 나타내는 빈틈이 있음을 알 수 있습니다.
이 버튼를 사용하여 계층의 이전 수준으로 이동할 수 있습니다.

breadcrumb

하위 그래프에 이미 중요한 노드인 액션 루트 노드가 정의되어 있습니다.

subgraph actions

HFSM 상에서

다음은 수행할 세 가지 작업 목록입니다:

  1. On Enter 목록은 HFSM이 이 상태에 들어갈 때 실행할 작업을 정의하며
  2. On Update 목록은 list는 HFSM이 업데이트될 때마다 실행할 작업을 정의하고 (일반적으로 모든 프레임)
  3. On Exit 목록은 HFSM이 이 상태를 벗어날 때 실행할 작업을 정의합니다.

GOAP 상에서

다음은 수행할 작업의 단일 목록입니다:

  1. On Update 목록은 GOAP가 업데이트될 때마다(일반적으로 모든 프레임) 실행할 작업을 정의합니다.

이러한 작업 목록을 정의하려면 작업 루트 노드의 오른쪽에 있는 화살표를 클릭한 다음 작업의 인바운드 슬롯을 클릭하거나 빈 공간을 클릭하여 새 작업을 즉시 만듭니다:

actions sample 1

여기서 중요한 것은 필요한 만큼의 연결된 액션을 정의할 수 있으며 이러한 액션이 동일한 프레임에서 순차적으로 실행된다는 것입니다.
화살표 버튼을 사용하여 계속 연결하기만 하면 됩니다:

actions sample 2

원하는 대로 작업을 다시 정렬할 수 있습니다.
또한 삭제하지 않고 실행하지 않을 경우 나중에 사용할 분리된 작업 집합을 가질 수도 있습니다:

actions sample 3

인바운드 슬롯을 클릭하여 작업 필드 값을 정의할 수 있다는 점에 주목하세요.

변경사항 적용을 하기 위해서 엔터키 입력하거나 변경사항 무시를 하려면 Esc 키 입력을 하세요.

action fields

이미 살펴본 바와 같이 에디터는 이미 몇 가지 사전 정의된 액션 및 결정 사항을 제공합니다.
이것들은 개발자가 시작할 수 있도록 만들어졌습니다.

프로젝트에서 특정 액션 및 결정 사항을 구현해야 합니다.
어떻게 하는지 살펴보겠습니다.

액션 코딩하기

새로운 액션을 생성하기 위해서, quantum_code 솔루션을 열어야 합니다.

quantum.code 프로젝트에서, AIAction 추상 클래스에서 상속받은 클래스를 생성할 수 있습니다. 이렇게 상속을 받으면, 에이전트(HFSM 또는 GOAP)를 갱신할 때마다 호출되는 Update메소드를 구현할 수 있습니다.

HFSM의 경우 정의한 작업 목록에서 실행됩니다: OnEnter, OnUpdate 그리고 OnExit입니다. 따라서 예를들면, 일부 HFSM 상태에서 입력하면 초기 상태에 나열된 액션에 대해서도 이 코드가 실행됩니다.

중요: 새로운 클래스를 [Serializable]partial 로 표시해주어야 합니다.

C#

namespace Quantum
{
    [Serializable]
    public partial class IdleAction : AIAction
    {
        public override unsafe void Update(Frame f, EntityRef e)
        {
            // insert the action code here
        }
    }
}

필드값 정의하기

Bot SDK에서는 코드에 public 필드를 선언하여 해당 필드를 Visual Editor에 표시할 수 있습니다. HFSM의 경우 작업 및 결정 코드에 대해 이 작업을 수행할 수 있으며, GOAP의 경우 작업에서 이 작업을 수행할 수 있습니다. 에디터에서 사용자는 해당 필드의 값을 정의할 수 있습니다.

이러한 값을 설정하는 가장 간단한 방법은 필드를 클릭하고 즉시 값을 할당하는 것입니다. 그러나 다음과 같은 다른 옵션이 있습니다:

  • Blackboard 노드 사용하기
  • Constant 노드 사용하기
  • Config 노드 사용하기
  • AIFunction 노드 사용하기

Blackboard 노드는Blackboard 문서에서 이미 설명되어 있기 때문에, Constant 노드와 Config 노드에 대해서 살펴보겠습니다.

상수 패널

왼쪽 패널에서 상수를 정의하고 사용할 수 있습니다.

상수를 정의한 후에는 상수 노드를 가져와 HFSM에서 작업 및 결정의 인바운드 슬롯에 연결할 수 있습니다. 단일 상수 노드를 여러 번 입력으로 사용할 수 있으므로 동일한 값을 가진 여러 필드를 더 쉽게 정의할 수 있습니다.

상수에 대한 또 다른 중요한 측면은 설정 메뉴에서 값을 변경할 때마다 해당 상수에서 생성된 모든 노드가 그에 따라 업데이트되므로 HFSM의 여러 부분에서 값을 쉽게 정의하고 나중에 이러한 값을 변경할 수 있다는 점입니다.

왼쪽 메뉴를 사용하여 새 상수를 정의하고 상수 탭에서 (+) 기호를 클릭합니다.

hfsm asset

그리고 나서 이름, 타입, 기본 값 을 선택하고 저장합니다. 이제 상수가 정의되어 있으므로 그래프 뷰로 끌어서 놓을 수 있으며 이미 인바운드 슬롯에 연결할 수 있습니다.

hfsm asset

Config 패널

동일한 HFSM/GOAP를 사용하는 여러 에이전트에 대해 상숫값을 가질 수 있습니다. 예를 들어 Bots를 여러 가지 난이도에 대해 원할 경우 유용할 수 있지만 동작 논리는 동일합니다. 이지 모드의 슈터 봇은 반응 시간으로 "2초"의 값을 가질 수 있고, 하드 모드에서는 "0.5초"의 값을 가질 수 있습니다. 이 작업은 Config 패널을 사용하여 쉽게 수행할 수 있습니다.

왼쪽의 패널을 사용하여 Config 값을 만든 다음 AIConfigAsset 유형의 새 데이터 에셋으로 컴파일합니다. 컴파일 후 이름이 <DocumentName>DefaultConfig 인 에셋을 AIConfig_Assets 폴더에서 찾을 수 있습니다.

그런 다음 이러한 에셋을 사용하여 상숫값을 검색할 수 있습니다.

매우 간단한 구성 레이아웃을 생성할 수 있습니다.

createconfig

처음부터 새 구성 필드를 만드는 것 외에도 상수를 구성으로 변환할 수도 있고 그 반대의 경우도 가능합니다.

converttoconfigurable

그런 다음, 문서를 컴파일한 결과는 다음과 같습니다:

defaultconfig

마지막으로, 이 에셋과 다른 상수 값을 정의하려면 유니티의 프로젝트 탭에서 마우스 오른쪽 버튼을 클릭하고Create/Quantum/Assets/AIConfig 아래로 이동합니다.

이렇게 하면 기반이 될 다른 구성 에셋을 찾는 매우 간단한 구성 에셋이 생성됩니다. 기본 구성 필드를 입력하고 구성 업데이트를 클릭하여 기본 구성 에셋을 미러링 합니다. 그런 다음 원하는 대로 값을 변경할 수 있습니다. 또한 값을 원래 구성 에셋 값으로 되돌리려면 기본값으로 재설정을 클릭합니다.

configvariation

이제 이러한 구성을 사용하기 위해 몇 가지 대안이 있습니다:

  1. 구성 에셋에서 직접 읽어보고 구성 키를 알려주고 그에 따라 값을 검색합니다:

    var myBoolean = myConfig.Get("Key").Value.Boolean;

    타입은 Integer, Boolean, Byte, FP, FPVector2, FPVector3 그리고 String 이 될 수 있습니다.

  2. 또는 AIParam type과 함께 사용하세요.

    예를 들어:

    먼저 AIParamFP 필드의 액션/결정을 작성합니다. Visual Editor에 표시되도록 컴파일합니다;

    그런 다음 왼쪽 패널에서 일부 Config 값을 끌어다 놓고 AIParam 필드에 연결합니다.

confignode

​ 그런 다음 문서를 컴파일합니다. 코드에서 AIParam API를 사용하여 값을 검색합니다. 이렇게 하면 이미 다음과 같이 매개 변수로 전달된 Config 에셋과 함께 그에 따라 구성 값을 검색합니다:

Unknown

// Considering that the variable "AttackRange" is of type AIParamFP
FP rangeValue = AttackRange.Resolve(f, blackboard, myConfig);

따라서 기본적으로 여기서 유용한 방법은 Visual Editor에 있는 내용을 기반으로 기본 Config 에셋을 생성한 다음 Configs 패널을 사용하여 그 변형을 만든 다음 AssetRefs를 사용하여 필요에 맞게 링크하는 것입니다.

HFSMAgent와 GOAPAgent는 편의상 Config 에셋을 특정 에이전트/엔티티로 참조할 수 있는 필드를 이미 제공합니다. 그래서 직접 참고할 수 있습니다:

Unknown

// The config to be set can come from any source that you prefer. Some custom asset, RuntimeConfig, RuntimePlayer...it's up to you. Just set it to the component:
hfsmAgent->Config = config;
// or
goapAgent->Config = config;

// Then, when you need to GET the Config:
hfsmAgent.GetConfig(frame);
//or
goapAgent.GetConfig(frame);

AIParam

필드에서 값의 소스를 정의하는 방법에는 여러 가지가 있습니다. 현재 Blackboard, Constants 및 Config를 사용하여 수행할 수 있습니다. 이 때문에 코드에서 이러한 값을 읽는 방법 또한 다양합니다. 따라서 개발자가 소스 유형을 한 유형에서 다른 유형으로 변경해야 하는 경우(즉, Blackboard Node에서 Constant Node로 변경), 소스 코드도 변경해야 합니다.

그러나 소스 유형을 변경하는 것이 유용할 수 있는 이유는 무엇입니까?

  • 간단하게 값을 수동으로 정의할 수 있습니다;
  • 런타임 중에 값이 변경될 수 있는 경우 Blackboard에 저장할 수 있으므로 Blackboard 노드를 사용하여 값을 정의합니다;
  • 값이 변경되지 않지만 노드에서 가져온 값인 경우 그래프를 보다 유연하게 하려면 Constant 노드를 사용하여 값을 정의합니다.
  • 위의 사항이 적용되지만 에이전트마다 달라야 하는 경우 Config 노드를 사용합니다.

AIParam은 갑자기 소스가 바뀔 수 있는 이런 상황을 돕기 위해 만들어진 형태입니다. 하지만, 그 사용법에 대해 배우기 전에, 값을 읽기 위한 코드 간의 차이를 빠르게 분석해보도록 하겠습니다.

일부 필드의 값이 Visual Editor에서 수동으로 정의되었거나 Constant 노드를 사용하여 정의된 경우 읽을 코드는 일반적이고 단순합니다.

C#

// In this case, the value is directly stored on the field itself, with no need for any extra code
public Int32 MyInteger;

이제 이 값이 Blackboard 노드에서 가져온 경우:

C#

// Read the value from the blackboard asset
var value = blackboardComponent->Board.GetValue("someKey");

Config 노드에 대해서는:

C#

// Read the value from the config asset
var myBoolean = myConfig.Get("Key").Value.Boolean;

따라서 Visual Editor에서 값 소스가 변경될 때 코드를 변경할 필요가 없도록 필드에 AIParam 타입을 사용합니다. 주요 특징은 다음과 같습니다.

  • Blackboard를 받아 에셋을 구성하는 Resolve 메소드를 가지고 있습니다. 필드 값의 소스가 무엇인지 알면 이 메소드는 필드를 수동으로 정의했을 때 값을 직접 리턴하거나 Blackboard/Configs에서 값을 리턴하여 올바른 값을 이미 반환합니다. 따라서 필요한 횟수만큼 값 소스 타입을 변경할 수 있으며, 이 코드는 값 소스 타입을 읽기 위한 코드입니다.

C#

public AIParamInt MyAIParam;
var value = MyAIParam.ResolveResolve(frame, blackboard, aiConfig);
  • 현재 8개의 가능한 타입이 있습니다:

C#

AIParamInt, AIParamBool, AIParamByte, AIParamFP, AIParamFPVector2, AIParamFPVector3, AIParamString, AIParamEntityRef
  • 내부적으로, AIParam이 Visual Editor에서 어떻게 정의되었는지 이미 확인합니다. 직접 정의했거나 특수 노드에서 정의한 경우입니다.

AIFunction 노드

AIFunction를 사용하면 다양한 유형의 "Getter" 노드를 미리 정의할 수 있습니다. 이것의 주된 목적은 게임별 필요에 따라 값을 반환하는 특정 노드를 만드는 것입니다.

AIFunction 노드의 기본 유형은 다음과 같습니다.

  • AIFunctionByte
  • AIFunctionBool
  • AIFunctionInt
  • AIFunctionFP
  • AIFunctionFPVector2
  • AIFunctionFPVector3
  • AIFunctionEntityRef

사용자 고유의 AIFunction 노드를 만들려면 위의 클래스 중 하나에서 상속하고 추상적인 Exectue() 메서드를 구현하면 됩니다. 다음은 사용자 지정 구성 요소에 저장된 일부 엔티티의 위치를 반환하는 예제 AIFunction 노드입니다.

C#

namespace Quantum
{
  [System.Serializable]
  public unsafe class GetEntityPosition : AIFunctionFPVector3
  {
    public override FPVector3 Execute(Frame frame, EntityRef entity = default)
    {
      MyComponent myComponent = frame.Unsafe.GetPointer<MyComponent>(entity);
      Transform3D* targetTransform = frame.Unsafe.GetPointer<Transform3D>(myComponent->TargetEntity);
      return targetTransform->Position;
    }
  }
}

이제 quantum 솔루션을 컴파일하면 콘텍스트 메뉴에서 AIFunction을 사용할 수 있습니다. AIFunction 클래스에 공개 필드를 선언할 수도 있으며, 이 필드를 비쥬얼 에디터에 직접 채울 수도 있습니다.

AIFunctionNodes 연결은 위에서 설명한 AIParam 타입으로 해야 합니다. 따라서 위의 AIFunction 클래스에 기반하여 엔티티의 위치를 얻어야 하는 HFSM Action이 있는 경우 AI ParamFP 필드가 필요합니다.

Unknown

namespace Quantum
{
  [System.Serializable]
  public unsafe partial class SampleAction : AIAction
  {
    public AIParamFP TargetPosition;

    public override void Update(Frame f, EntityRef e)
    {
      // If you are not sure if your AIParam's source is a Blackboard/Config/AIFunction node, then use the general Resolve method
      var position = TargetPosition.Resolve(/*args*/);
      
      // If you are sure that the source is an AIFunction node, then you can use the specific Resolve method
      var position = TargetPosition.ResolveFunction(frame, entity);
      
      // Now, do something with the position
    }
  }
}

위의 예와 같이 비쥬얼 편집기(블랙보드, 구성, AIFunction 노드)에 정의된 소스에 따라 값을 반환하는 일반 해결 방법을 사용할 수 있습니다. 그러나 AIFunction 노드에 의해 AIParam이 정의되어 있는 것으로 알려진 경우, 많은 매개 변수가 필요하지 않고 속도가 조금 더 빠르기 때문에 특정 Resolve 방법을 사용하는 것이 더 나을 수 있습니다.

AIFunction Node에는 중첩된 AIFunctions를 만들 수 있는 AIParam 필드도 있을 수 있습니다.

Visual Editor에서

public AIParam 이 액션과 결정에 선언되면 Visual Editor에 표시되며 수동으로 또는 특수 노드에서 값을 정의할 수 있습니다. 예를 들어, public AIParamInt IncreaseAmount 을 고려한다면 다음과 같습니다.

aiparam sample
### 사용자 정의 Enums 용 AIParam 생성하기

앞에서 언급한 유형 외에도 Enums용 AIParam을 만드는 것이 유용할 수 있습니다. 이렇게 하려면 필요한 특정 Enum 에 대한 고유한 AIParam 타입을 생성해야 합니다. 다음은 코드 일부입니다:

C#

// Considering this enum:
public enum BotType { None, HFSM, GOAP };

// Create a new AIParam class based on that enum:
[System.Serializable]
  public unsafe sealed class AIParamBotType : AIParam<BotType>
  {
    public static implicit operator AIParamBotType(BotType value) { return new AIParamBotType() { DefaultValue = value }; }

    protected override BotType GetBlackboardValue(BlackboardValue value)
    {
      int enumValue = *value.IntegerValue;
      return (BotType)enumValue;
    }

    protected override BotType GetConfigValue(AIConfig.KeyValuePair config)
    {
      return (BotType)config.Value.Integer;
    }
  }

AIContext

Bot SDK에는 에이전트 업데이트 루틴에서 콘텍스트별 데이터를 전달하는 데 도움이 될 수 있는 데이터 컨테이너가 구현되어 있습니다.

이러한 콘텍스트 컨테이너의 사용은 필수 사항은 아니지만 HFSM의 AIAction.Update(), BT의 Leaf.OnUpdate()와 같은 사용자 엔드포인트에서 데이터를 쉽게 가져올 수 있도록 사용할 수 있습니다


이를 사용하는 주된 이유는 Frame 및 EntityRef 이외의 사용자 코드에 추가 데이터를 제공하기 위한 것입니다. 이렇게 하면 에이전트의 단일 업데이트에 대해 여러 번 수행해야 하는 경우가 있는frame.Get<MyComponent>(entityRef)와 같은 많은 반복되는 코드를 피할 수 있습니다.

AIContext를 사용하면 업데이트 루틴의 시작 부분에 데이터를 저장할 수 있습니다(예, HFSMManager.Update 호출 전, BT, GOAP 그리고 UT와 동일)
예를 들어, 여기서 콘텍스트의 목적은 특정 에이전트의 콘텍스트와 관련된 데이터로 채우는 것입니다. AIBlackboard 컴포넌트를 저장할 수도 있습니다. 다른 사용자 지정 컴포넌트 일 수도 있습니다. 아니면 에이전트 업데이트 로직을 나타내는 정수일 수도 있습니다.
즉, 실행을 위해 필요한 코드가 몇 개 있습니다. HFSM의 예는 다음과 같습니다. 그러나 BT, GOAP 및 UT에도 동일하게 적용됩니다.

AIContext 구조체 확장하기

  • 원하는 이름과 위치를 가진 새 파일을 만듭니다. AIContext.User.cs처럼.
  • 그 안에 필요한 필드를 사용하여 AIContext 구조의 partial 선언을 작성합니다:

C#

namespace Quantum
{
    public unsafe partial struct AIContext
    {
        public readonly HFSMAgent* HfsmAgent;
        public readonly AIBlackboardComponent* Blackboard;

        public AIContext(HFSMAgent* hfsmAgent, AIBlackboardComponent* blackboard)
        {
            this.HfsmAgent = hfsmAgent;
            this.Blackboard = blackboard;
        }
    }
}
  • 컨테이너의 레이아웃이 준비되었습니다. 이제 에이전트가 업데이트될 때마다 콘텍스트 객체를 만들고 이를 ref 파라미터로 전달합니다:

C#

AIContext aiContext = new AIContext(hfsmAgentComponent, blackboardComponent);
HFSMManager.Update(frame, frame.DeltaTime, hfsmData, entityRef, ref aiContext);
  • 이러한 방식으로 엔드포인트는 AIAction의 Update와 같이 콘텍스트에 접근할 수 있습니다:

C#

namespace Quantum
{
    [System.Serializable]
    public unsafe class SampleAction : AIAction
    {
        public override void Update(Frame frame, EntityRef entity, ref AIContext aiContext)
        {
            // either cash the data in local variables
            var agent = aiContext.HfsmAgent;
            var blackboard = aiContext.Blackboard;
            
            // or use it right away where needed
        }
    }
}

중요한 고려 사항

AIContext를 관리하는 방법에 매우 주의해야 합니다. 모든 프레임에서 처음부터 작성하여 데이터를 채우는 것이 가장 안전한 사용 방법입니다. 다른 가능성도 있습니다.

또한 콘텍스트의 주요 목적은 의사 결정에 도움이 되도록 콘텍스트에 관한 데이터를 읽는 좋은 방법을 제공하는 것입니다. 데이터를 콘텍스트에 저장하고 즉시 변경할 수 있도록 설계되지 않았습니다. 원하는 대로 사용하고, 추적하기 어려운 문제를 방지하기 위해 주의해서 사용하십시오.

뮤팅(Muting)

각 AI 모델에 대해 뮤트 할 수 있는 특정 노드가 있습니다. 이렇게 하면 기본적으로 어떤 것도 삭제/연결 해제할 필요 없이 컴파일 프로세스에서 로직의 해당 부분을 비활성화합니다. 다양한 AI 모델에서 뮤트할 수 있는 요소를 분석해보겠습니다.

HFSM 특정사항

뮤팅 상태

뮤트 상태로의 전환은 무시됩니다. 또한 해당 상태 내의 모든 동작은 실행되지 않습니다.

PS.: 음소거된 기본 상태로 HFSM을 컴파일하면 오류가 발생합니다.

상태 노드를 음소거하려면 상태를 마우스 오른쪽 단추로 클릭한 다음 "뮤트/뮤트 해제 상태" 를 선택합니다. 뮤트되는는 동안 투명하게 렌더링 됩니다.

mute state

뮤팅 전이

전환 라인을 마우스 오른쪽 버튼으로 클릭하고 "뮤트/뮤트 해제 전환"을 선택하여 뮤트 할 수 있습니다.

컴파일 중에 뮤트 전환이 무시됩니다. 일반적인 전환, 모든 전환, 전환 세트 및 포털로의 전환과 같은 모든 전환 유형을 뮤트 할 수 있습니다.

mute transition

GOAP 특정사항

GOAP에서 계획을 세울 수 있는 가능한 태스크에는 뮤트 작업이 추가되지 않습니다.

작업 노드를 뮤트 하려면 상태를 마우스 오른쪽 단추로 클릭한 다음 "작업 뮤트/뮤트 해제"를 선택합니다. 뮤트 되는 동안 투명하게 렌더링 됩니다.

mute task

HFSM 그리고 GOAP 모두 해당

액션 뮤트 하기

액션 목록의 위치에 관계없이 모든 액션을 뮤트 할 수 있습니다. 뮤트 동작은 컴파일 중에 무시되며 뮤트 동작에 다음 액션이 포함된 경우 체인의 다음 동작만 실행됩니다.

또한 액션 노드를 마우스 오른쪽 버튼으로 클릭하여 액세스할 수도 있습니다.

mute action

Bot SDK 시스템

기본적으로 Bot SDK 패키지와 함께 제공되는 두 가지 클래스는 다음과 같습니다.

  • BotSDKSystem: Blackboard 메모리 할당 해제, 엔티티 프로토타입에 포함된 데이터로 HFSM/BT 에이전트 초기화 등의 일부 프로세스를 자동화하는 데 사용됩니다.
  • BotSDKDebuggerSystem: 유니티 측의 디버거에 대한 중요한 정보를 수집하는 데 사용됩니다.

이것을 사용하려면 SystemSetup 클래스에서 new BotSDKSystem(), 그리고/또는 new BotSDKDebuggerSystem() 을 추가하기만 하면 됩니다.

PS: 이 시스템은 필수는 아닙니다. 그곳에서 하는 모든 일은 나의 클래스에서 할 수 있습니다.

PS2: 해당 코드의 다른 부분에서 이미 수행된 작업도 있을 수 있으므로 이 시스템을 추가하여 문제를 소개할 때 주의하십시오. 시스템을 추가하기 전에 해당 시스템의 기능을 살펴보고 즉시 사용하거나 자신의 코드에 논리적인 내용을 포함하십시오.

Visual Editor 주석

Visual Editor에 주석을 추가할 수 있습니다. 주석 영역을 추가하려면 노드(상태/태스크/작업/결정/시퀀스 등)를 선택하고 **"G"**를 눌러 주석 영역을 추가합니다. 그런 다음 "주석" 헤더 텍스트를 클릭하고 원하는 대로 변경합니다. 둘 이상의 노드에 주석을 추가할 수도 있습니다. 노드를 두 개 이상 선택하려면 윈도우즈 OS에서 "Ctrl" 버튼을 누르고, Mac OS에서 "Command" 버튼을 누릅니다.

commented state
commented actions

컴파일 출력 폴더 변경하기

기본적으로, Bot SDK 컴파일에 의해 생성된 에셋은 Assets/Resources/DB/CircuitExport 폴더에 위치합니다. 이 사항은 Assets/Photon/BotSDK/VisualEditor/CircuitScriptables 폴더상에 SettingsDatabase를 선택하여 변경할 수 있습니다. 그리고 나서, Bot SDK OutputFolder로 명명되어 있는 필드를 찾고 필요한 값으로 변경합니다. 대상 폴더는 이미 생성되어 있어야 한다는 점은 주의하세요.

또한 CircuitExport부모 폴더는 이미 생성되었고 모든 하위 폴더들은 이 폴더 내에 생성되어야 합니다.

change output folder

저장 기록 크기 선택하기

Bot SDK는 기본적으로 5개의 기록 항목을 Visual Editor파일에 저장합니다. 이 기능은 AI 문서를 닫거나 열 때 세션 간의 기록을 유지 관리하려는 경우에 유용합니다. 그러나 저장한 기록 항목에 따라 AI 회로가 커질수록 AI 파일 크기가 증가합니다.

따라서 저장할 기록 항목 수를 선택할 수 있습니다. 기록을 저장할 필요가 없는 경우 기록을 0으로 설정할 수도 있습니다. AI 파일을 다시 열 때만 기록이 다시 로드되므로 유니티를 닫거나 열 수도 있습니다.

기록 항목 양을 변경하려면 Assets/Photon/BotSDK/VisualEditor/CircuitScriptables 폴더에 있는 SettingsDatabase라는 에셋을 선택합니다. 그런 다음 기록 건수 저장 필드를 찾습니다.

history count
Back to top