개발일지공부아이디어
    • 4월
    • 3월
    • 2월
    • 1월
  • 28

    26. 4. 28.

  • 27

    26. 4. 27.

  • 24

    26. 4. 24.

  • 23

    26. 4. 23.

  • 22

    26. 4. 22.

  • 21

    26. 4. 21.

  • 20

    26. 4. 20.

  • 17

    26. 4. 17.

  • 16

    26. 4. 16.

  • 15

    26. 4. 15.

  • 14

    26. 4. 14.

  • 10

    26. 4. 10.

  • 09

    26. 4. 9.

  • 08

    26. 4. 8.

로딩 중...

2026. 4. 28.

복습: UseBlackboard

bool AAIController::UseBlackboard(UBlackboardData* BlackboardAsset, UBlackboardComponent*& BlackboardComponent){	if (BlackboardAsset == nullptr)	{		UE_VLOG(this, LogBehaviorTree, Log, TEXT("UseBlackboard: trying to use NULL Blackboard asset. Ignoring"));		return false;	}	bool bSuccess = true;	Blackboard = FindComponentByClass<UBlackboardComponent>();	if (Blackboard == nullptr)	{		Blackboard = NewObject<UBlackboardComponent>(this, TEXT("BlackboardComponent"));		REDIRECT_OBJECT_TO_VLOG(Blackboard, this);		if (Blackboard != nullptr)		{			bSuccess = InitializeBlackboard(*Blackboard, *BlackboardAsset);			Blackboard->RegisterComponent();		}	}	else if (Blackboard->GetBlackboardAsset() == nullptr)	{		bSuccess = InitializeBlackboard(*Blackboard, *BlackboardAsset);	}	else if (Blackboard->GetBlackboardAsset() != BlackboardAsset)	{		// @todo this behavior should be opt-out-able.		UE_VLOG(this, LogBehaviorTree, Log, TEXT("UseBlackboard: requested blackboard %s while already has %s instantiated. Forcing new BB.")			, *GetNameSafe(BlackboardAsset), *GetNameSafe(Blackboard->GetBlackboardAsset()));		bSuccess = InitializeBlackboard(*Blackboard, *BlackboardAsset);	}	BlackboardComponent = Blackboard;	return bSuccess;}
  • 사실 두번쨰 인자에 블랙보드 애셋 객체를 채워 넘겨주지 않아도 된다
    • 왜냐면 내부에서 Blackboard = FindComponentByClass<UBlackboardComponent>()로 컴포넌트를 찾고 이 유무로 조건식을 통과하기 때문

UE5 StateTree

https://velog.io/@imeamangryang/Unreal-Engine-State-Tree-%EA%B0%9C%EC%9A%94 특징

  • 행동 트리에 상태 머신을 결합한 구조
  • 계층적 상태 구조: 부모/자식 상태 구조로 관리할 수 있음
  • AI뿐만 아니라 UI, 애니메이션 등 범용적으로 사용함
  • MassEntity, SmartObjects 등 5버전 신규 시스템과 호환이 잘됨
  • 대규모 군중 등 상태 중심 로직에 특화

+비헤이비어 트리만 있는게 아니라 스테이트 트리, 신경망 엔진, 매스 엔티티 등 다양한 서브시스템들이 존재함

그리고 UBrainComponent 구조를 두어 언제든지 AIController에 서브시스템을 뺏다꼈다할 수 있게 확장성 갖춘 구조를 이미 완성해놓음

12. 행동트리 모델의 구현 총정리

Blackboard는 조회가 잦으므로 Key(FName)으로 구현돼있음

  • 유지보수성을 위해 AI/ABAI.h를 만들고 #define으로 Key들을 변수화함

설계구조

  • AIController가 두뇌 시스템(BT)을 사용함
  • 두뇌시스템(BT)은 Pawn의 행동을 관장함. 범용적으로 작성되기 때문에 특정 유형의 액터에 대한 구체적인 지시는 피해야 함
  • 그렇게 하기 위해서 각 BTTask에서 행동트리의 소유자 컴포넌트를 가지고 컨트롤러가 소유한 Pawn을 변환해 사용함

흠.. 결국 또 중요한건 아무리 설계에 대해 떠들어봤자 그래서 뭘 만들건데?가 더 우선인 것 같다. 뭘 만들지 정확하게 알아야 그에 맞는 설계가 생기고 과한지 부족한지 판단할 수 있음

왼쪽 화살표다음 글이 없습니다.