This document is about: QUANTUM 2
SWITCH TO

Blackboard

소개

Blackboard는 Bot SDK 내에 포함되어 있는 다른 아주 유용한 툴입니다. 사용자 정의 데이터를 보유하는 데 사용할 수 있는 키/값 집합입니다. 컴포넌트상에 사용자 정의 데이터를 저장하는 것과 매우 유사하지만, 중요한 차이점은 DSL에 이쓴 것들을 생성하고 재컴파일 하는 대신 유니티의 Visual Editor상에서 동적으로 생성된다는 것입니다. 이는 에이전트별로 가질 수 있는 액션 및 결정을 위한 읽기/쓰기 메모리와 같습니다.

Blackboard는 Visual Editor만 사용하여 완벽하게 생성될 수 있고 데이터 에셋을 사용하여 완전히 정의되므로 디자이너가 사용하기 쉽습니다. 따라서 Blackboard를 Unity 프로젝트에 저장하고 구성할 수 있습니다.

PS.: Blackboard 데이터 자산은 메모리 레이아웃 정의일 뿐입니다. 메모리 레이아웃이 같아야 하는 많은 Botts/Entities가 있는 경우 이러한 모든 항목이 동일한 Blackboard 에셋을 가리킬 수 있습니다. 그런 다음 각 bot는 레이아웃에 따라 런타임에 생성된 자신의 고유의 메모리를 갖게 됩니다.

아주 간단한 예제

자, 맵에서 아이템들을 수집하는 캐릭터가 있다고 가정해 보겠습니다. 액션 및 결정에서 캐릭터가 특정 결정을 내리기 위해 이미 수집한 아이템들의 개수를 읽을 수 있습니다. 또한 캐릭터가 새 아이템을 수집하는 경우 아이템 수가 증가해야 합니다. 이를 위해 blackboard에 정수형의 ItemAmount라는 항목을 가질 수 있으며 액션 및 의사 결정 코드에 대해 관리할 수 있습니다.

모든 엔티티는 런타임 시에 생성된 자신의 blackboard 메모리를 가지고 있으며, 이 의미는 하나의 엔티티는 다른 엔티티의 blackboard 메모리를 읽을 수 있다는 것입니다. 따라서 blackboard 메모리는 하나가 아니라 모든 에이전트 사이에서 공유됩니다 -- 에이전트 당 하나.

Visual Editor상의 Blackboard

Visual Editor에는 이미 Blackboard용 하위-메뉴가 있습니다.
Blackboard Variables 라고 명명되어 있으며, 왼쪽 패널에서 접근할 수 있습니다:

blackboard visual editor empty

신규 blackboard 변수 생성을 하기 위해서 + 버튼을 누릅니다.
새로운 항목을 생성/편집할 때 다음을 정의해 주어야 합니다:

  • 변수의 이름, 변수의 값을 가져오기 위해 blackboard 에셋 상의 내부적인 키로 사용
  • 변수 타입, 드롭다운 메뉴에서 선택할 수 있음
  • HasDefault 확인란, 설정 시 이 변수가 기본 값으로 설정될지 여부로 사용;
  • 사용될 기본
blackboard visual editor creating entry

여러 타입의 항목이 있을 수 있으며 항상 기본값을 정의해야 하는 것은 아닙니다.:

blackboard visual editor many entries

Blackboard 에서 현재 지원되는 타입은 다음과 같습니다:

  1. Boolean;

  2. Byte;

  3. Integer;

  4. FP;

  5. Vector2;

  6. Vector3;

  7. Entity Ref.

이제 프로젝트를 컴파일할 때마다 2개의 추가 데이터 에셋이 자동적으로 Assets/Resources/DB/CircuitExport/Blackboard_Assets폴더에 생성됩니다:

  • 컴파일된 HFSM에 의해 정의된 항목인 Blackboard 에셋;
  • 그리고 컴파일된 HFSM에 의해 정의된 항목과 기본값인 Blackboard 초기자 에셋 .

한 에셋은 다른 에셋과 관련이 있습니다. 첫 번째 에셋은 레이아웃만 정의하고, 두 번째 에셋은 blackboard를 초기화할 때 삽입할 값을 정의합니다.

blackboard assets

Blackboard 노드

변수를 사용하면 변수를 그래프에 끌어다 놓아 Blackboard 노드를 만들 수 있습니다. 이러한 노드에는 항상 이라는 두 개의 아웃바운드 슬롯이 있습니다.

blackboard assets

슬롯은 AIBlackboardValueKey 타입의 필드에 연결하기 위해 사용되며, 이는 가져오거나 설정할 변수를 알릴 때 하드코딩된 문자열을 대체하는 데 사용할 수 있습니다. 그리고 물론 하드 코딩된 키를 제거함으로써 코드의 유연성과 신뢰성이 높아집니다.

퀀텀 코드 측면에서 하드코딩된 키를 사용하는지 또는 Blackboard 노드의 키를 사용하는지에 따라 Get/Set 메소드를 사용하는 방법을 분석하겠습니다.

C#

// -- Using hardcoded keys: --
var bbComponent = f.Unsafe.GetPointer<AIBlackboardComponent>(entityRef);
// To read
var value = bbComponent->GetInteger(frame, "someKey");
// To write
bbComponent->Set(frame, "someKey", value);


// -- Using keys from Blackboard nodes: --
public AIBlackboardValueKey PickupsKey;
// To read
var value = bbComponent->GetInteger(frame, PickupsKey.Key);
// To write
bbComponent->Set(frame, PickupsKey.Key, value);

새 필드가 선언된 상태에서 Visual Editor로 이동하여 Blackboard 노드의 슬롯에 연결할 수 있습니다. 예를 들어 다음과 같습니다.

blackboard assets

이와 같은 슬롯을 사용하는 것 외에도 슬롯을 연결하여 동일한 유형의 필드(예: 일부 액션/결정의 정수 필드에 연결된 정수 blackboard 변수)를 정의할 수도 있습니다. 왼쪽 패널에 정의된 기본값은 자산에 베이크될 값입니다.

blackboard assets

Blackboard 와 노드를 사용하는 시기

런타임 중에 변경될 수 있는 엔티티마다 데이터를 저장하려는 경우 언제든지 사용합니다. 변경되지 않는 값을 정의하려면 Constants 패널을 사용하는 것이 좋습니다.

Blackboard Quantum 코드

Blackboard 컴포넌트 초기화하기

Blackboard 컴포넌트를 초기화하는 데 중요한 부분은 AIBlackboardInitializer에 대한 참조가 있어야 합니다.Visual Editor에서 AI 문서를 컴파일할 때 작성된 Initializer 자산입니다.

그리고나서, 프로젝트 코드에서 다음을 사용하여 컴포넌트를 초기화합니다:

C#

// -- Blackboard setup
// First, create the blackboard component (or have it created on the Entity Prototype)
var blackboardComponent = new AIBlackboardComponent();
// Find the Blackboard Initializer asset
var bbInitializerAsset = f.FindAsset<AIBlackboardInitializer>(runtimeConfig.BlackboardInitializer.Id);
// Call the static initialization method passing the blackboard component and the asset
AIBlackboardInitializer.InitializeBlackboard(f, &blackboardComponent, bbInitializerAsset);
// Set the blackboard into to the entity
f.Set(littleGuyEntity, blackboardComponent);

이게 다입니다. 모든 참조와 초기화를 다 했으면, Blackboard API를 사용하여 읽고/쓸 준비가 다 된 것입니다.

C#

// There is one method for each specific blackboard type (int, byte, FP, boolean, FP vectors and entityRef)
blackboardComponent->GetInteger(frame, key);

// For the setter method, there are different overrides depending on the type of data passed as the value
blackboardComponent->Set(frame, key, value);

PS.: 버전 1.0 RC2 이상의 Bot SDK에는 Blackboard에 읽기/쓰기를 하는 몇 가지 샘플 액션/결정이 이미 포함되어 있습니다. quantum_code 솔루션에서는 BotSDK/Samples 폴더로 이동하여 IncreaseBlackboardInt.cs, SetBlackboardInt.csHFSM.CheckBlackboardInt.cs파일을 확인해보세요.

Back to top