TIL_087 : AI State Tree (2), Task(C++)

김펭귄·2025년 12월 23일

Today What I Learned (TIL)

목록 보기
87/93

0. 컴포넌트로 추가

  • State Tree는 캐릭터 컴포넌트로, State Tree AI는 AI컨트롤러에 추가

1. Transition

  • Completed : 성공하든 실패하든 끝나면 Transition Trigger

  • Succeeded : 성공했을 때 전환 Trigger

  • Tick : 틱마다 Trigger 가능. 그래서 보통 Condition과 같이 사용

  • Event : 외부에서 발생한 Event가 Trigger (예: 총 맞았을 때 바로 전투모드로 전환)
    AI 블루프린트에서 Send State Tree Event 노드로 이벤트 호출 가능

  • 전환은 여러개 만들 수 있음. 위에서 아래로 확인함. 아래 사진은 State가 성공했을 때, 50프로 확률로 Wait로 이동하고, 실패하면 Find로 이동

  • 아래 사진은 위의 transition이 아직 기다려야 하지만, 아래 transition이 우선권이 높아서 둘이 충돌할 때, 우선권 높은 애가 결정권을 가짐

  • group에서도 transition 가능. 해당 전환을 모든 자식노드가 가진 것처럼 됨

2. 이벤트 Transition 사용법

  • 해당 태그를 가진 이벤트를 외부에서 받았을 때 전환 이루어짐

  • Priority가 높아야 다른 전환들보다 우선시하여 전환해줌

  • Send State Tree Event 노드를 이용해 외부에서 State Tree로 이벤트 전달

Event 인자를 Promote To Variable하기컴파일 후 해당 Event에 태그 달아주기

2.1. 참고영상

3. Enter Condition

  • 해당 노드 들어갈 때 조건 확인해서 들어감

  • Required~ : 진입 조건에 이벤트가 필요

  • 해당 Tag가 있는 이벤트여야 가능

  • Check~ : 자식 노드로 바로 전환되려 할 때 부모 state의 조건도 확인하게 함

4. State Tree 동작 총정리

  • State Tree는 하나의 브랜치가 활성화되며 실행되는 것

  • 즉, 어떤 노드가 활성화되면 그 노드로부터 Root까지의 모든 노드가 활성화되며 하나의 브랜치가 활성화되었다고 봄

  • 그리고 이 브랜치의 모든 노드가 동시에 각각 task를 실행

  • 다른 State로 전환이 일어나면 바로 활성 브랜치도 바뀜

  • 브랜치 바뀌면서 제외된 State들은 다 바로 Exit되며 Task도 종료됨

  • 바뀌었는데 여전히 활성 브랜치에 존재하는 State들은 그대로 Task 마저 실행

5. 디버깅

  • tools-rewind debugger 누르고 녹화버튼으로 디버깅 가능

  • 브랜치의 전환이 일어나야 디버깅 잘 되므로 노드 여러개 놓아야 함

6. 네트워크에서의 State Tree

  • State Tree 역시 서버에서만 동작하고, 클라에서는 동작하면 안 됨

  • 서버에서 State Tree로 AI 움직이면 클라는 결과를 받기만 해야함

  • 그래서 아래처럼 서버일때만 Start해주고, 클라일 때는 Stop 해주기

  • 이러면 디버깅할 때, 클라에서는 제대로 디버깅이 불가능해짐.
    따라서, StandAlone이나 Listen Server로 게임 실행해 디버깅 하기

7. Custom State Tree Task (C++)

  • FStateTreeTaskBase를 상속받아 C++로 구현 가능 (에디터에 없어, 직접 구현해야함)
#pragma once

#include "CoreMinimal.h"
#include "StateTreeTaskBase.h"
#include "CustomTask.generated.h"

USTRUCT(BlueprintType)
struct TARCOPY_API FCustomTask : public FStateTreeTaskBase
{
	GENERATED_BODY()
};
  • Build.cs파일에는 StateTreeModule 추가해야함
PublicDependencyModuleNames.AddRange(new string[] { "StateTreeModule" });
  • 그러나 블루프린트로 State Tree를 만들었다면, 해당 Task는 인식 안 됨

  • State Tree의 장점이 UI로 쉽게 할 수 있는 것이므로 UStateTreeTaskBlueprintBase를 상속받아 하면 State Tree에서 인식 가능해짐

#pragma once

#include "CoreMinimal.h"
#include "Blueprint/StateTreeTaskBlueprintBase.h"
#include "CustomTask.generated.h"

UCLASS(BlueprintType)
class TARCOPY_API UCustomTask : public UStateTreeTaskBlueprintBase
{
	GENERATED_BODY()
};
profile
반갑습니다

0개의 댓글