개요
스테이트 트리(StateTree)는 범용적인 계층형 스테이트 머신으로, 비헤이비어 트리의 셀렉터(Selector) 와 스테이트 머신의 스테이트(State) 및 트랜지션(Transition) 을 결합하여 만들어졌습니다. 이를 통해 안정적이고 체계화된 고성능 로직을 만들 수 있습니다.
스테이트 트리에 관한 자세한 내용은 스테이트 트리 개요 문서를 참고하세요.
목표
이 가이드에서는 스테이트 트리를 사용해서 플레이어가 사격하여 소멸시킬 수 있는 움직이는 타깃을 만들어 봅니다.
세부 목표
-
플레이어가 사격하여 소멸시킬 수 있는 타깃 액터의 블루프린트 를 만듭니다.
-
이동하여 타깃 액터를 소멸시키는 로직이 포함된 스테이트 트리를 만듭니다.
-
스테이트 트리 태스크(Task)를 만들고 스테이트 트리에서 사용합니다.
-
스테이트 트리 이밸류에이터(Evaluator)를 만들고 스테이트 트리에서 사용합니다.
1 - 필수 구성
-
새 프로젝트를 생성한 다음 게임(Games) 카테고리와 일인칭(First Person) 템플릿을 선택합니다. 프로젝트의 위치와 이름을 입력합니다. 생성(Create) 을 클릭합니다.
이미지를 클릭하면 최대 크기로 볼 수 있습니다.
-
세팅(Settings) > 플러그인(Plugins) 을 클릭하여 플러그인 창을 엽니다.
-
GameplayStateTree 와 StateTree 플러그인을 검색하고 활성화 합니다. 언리얼 엔진 에디터를 재시작합니다.
섹션 결과
이 섹션에서는 새 프로젝트를 생성하고 스테이트 트리 플러그인을 활성화했습니다. 이제 타깃 액터에서 사용할 스테이트 트리를 생성할 준비가 되었습니다.
2 - 스테이트 트리 생성하기
이 섹션에서는 타깃 액터가 사용할 스테이트 트리를 생성합니다. 타깃 액터의 컴포넌트로 사용하기 위한 스테이트 트리이므로 이 예시에서는 스테이트 트리 컴포넌트 스키마(State Tree Component Schema) 를 사용합니다.
-
콘텐츠 브라우저에서 우클릭하고 인공 지능(Artificial Intelligence) > 스테이트 트리(StateTree) 를 선택합니다.
-
StateTreeComponentSchema 클래스를 선택하고 선택(Select) 을 클릭합니다.
-
스테이트를 Tree ST_ShootingTarget 으로 명명합니다.
섹션 결과
이 섹션에서는 타깃 액터가 사용할 컴포넌트 스키마가 있는 스테이트 트리를 생성했습니다.
3 - 사격 타깃 블루프린트 생성하기
이 섹션에서는 움직이고 플레이어로부터 대미지를 입을 타깃 액터의 블루프린트를 생성합니다.
-
콘텐츠 브라우저 에서 우클릭하고 기본 에셋 생성(Create Basic Asset) 섹션의 블루프린트 클래스(Blueprint Class) 를 선택합니다.
-
부모 클래스 선택(Pick Parent Class) 창에서 액터(Actor) 버튼을 눌러 새 액터 블루프린트를 생성합니다.
-
블루프린트를 BP_ShootingTarget 으로 명명합니다.
-
-
BP_ShootingTarget 을 열고 컴포넌트(Components) 창으로 이동합니다. +추가(+Add) 를 클릭하고 스태틱 메시(Static Mesh) 를 선택합니다.
-
디테일 패널에서 스태틱 메시(Static Mesh) 섹션으로 내려갑니다.
-
스태틱 메시(Static Mesh) 드롭다운을 클릭하고 1M_Cube 를 선택합니다.
-
-
스태틱 메시(Static Mesh) 의 스케일(Scale) 을 X = 0.2 , Y = 2.0 , Z = 2.0 으로 설정합니다.
-
컴포넌트(Components) 창에서 +추가(+Add) 를 클릭하고 State Tree 를 선택합니다.
-
디테일 패널에서 AI 섹션으로 내려갑니다.
-
State Tree 드롭다운을 클릭한 다음 ST_ShootingTarget 을 선택합니다.
State Tree가 드롭다운으로 나타나지 않는다면, 잘못된 스키마를 선택한 것입니다. 스테이트 트리 컴포넌트에 사용할 StateTreeComponentSchema 를 선택했는지 확인하세요.
-
-
스태틱 메시(Static Mesh) 컴포넌트를 우클릭하고 이벤트 추가(Add Event) > OnComponentHit 추가(Add OnComponentHit) 를 선택합니다.
-
새 변수를 생성하고 HitCount 로 명명합니다.
- 디테일 패널에서 변수 타입(Variable Type) 을 인티저(Integer) 로 설정합니다.
-
HitCount 변수를 이벤트 그래프(Event Graph) 에 드래그하고 Get HitCount 를 선택합니다.
-
HitCount 노드에서 드래그하여 Increment Int 를 검색하고 선택합니다.
-
On Component Hit 노드를 Increment Int 노드에 연결합니다.
-
섹션 결과
이 섹션에서는 게임플레이 중에 플레이어가 사격할 사격 액터 블루프린트를 생성했습니다. 이제 스테이트 트리에 대기(Idle) 및 사망(Dead) 스테이트를 생성할 준비가 되었습니다.
4 - 대기 및 사망 스테이트 생성하기
-
ST_ShootingTarget 으로 돌아가서 Schema 섹션의 아래 Context Actor Class 드롭다운을 클릭합니다. BP_ShootingTarget 을 선택합니다.
-
+상태 추가(+Add State) 를 클릭하여 새로운 스테이트를 생성하고 Idle 로 명명합니다.
-
디테일 패널에서 트랜지션(Transitions) 섹션으로 내려갑니다.
- 스테이트로 이동(Go to State) 섹션을 펼치고 Transition To 드롭다운을 클릭합니다. Root 를 선택합니다. 그러면 이 스테이트가 완료된 후 스테이트 트리가 루트(Root) 스테이트로 트랜지션하도록 설정됩니다.
-
스테이트를 하나 더 생성하고 Dead 로 명명합니다.
-
Idle 스테이트를 선택하고 트랜지션(Transition) 을 하나 더 추가합니다.
-
Trigger 드롭다운을 클릭하고 On Tick 을 선택합니다.
-
Transition To 드롭다운을 클릭하고 Dead 를 선택합니다.
-
-
더하기 기호 를 클릭하여 새로운 조건(Condition) 을 추가합니다. 드롭다운을 클릭하고 Integer Compare 를 선택합니다.
-
구조를 펼치고 Left 의 바인드(Bind) 드롭다운을 클릭한 후 Actor > Hit Count 를 선택합니다. 그러면 BP_ShootingTarget 내의 Hit Count 값이 스테이트 트리의 조건에 바인딩됩니다.
-
Right 의 인티저 값에 5 를 입력합니다.
-
섹션 결과
이 섹션에서는 대기(Idle) 및 사망(Dead) 스테이트를 스테이트 트리에 추가했습니다. 이제 사망(Dead) 스테이트를 처리할 스테이트 트리 태스크를 생성할 준비가 되었습니다.
5 - 스테이트 트리 태스크 생성하기
이 섹션에서는 Dead 스테이트가 실행되었을 때 액터를 소멸시킬 새로운 스테이트 트리 태스크(State Tree Task) 를 생성합니다.
-
콘텐츠 브라우저에서 우클릭하고 블루프린트 클래스(Blueprint Class) 를 선택합니다.
-
부모 클래스 선택(Pick Parent Class) 창에서 모든 클래스(All Classes) 드롭다운을 펼친 후 StateTreeTaskBlueprintBase 를 검색하고 선택합니다.
-
선택(Select) 을 클릭하여 에셋을 생성합니다.
-
블루프린트 클래스를 STT_Destroy 로 명명합니다.
-
-
콘텐츠 브라우저 에서 STT_Destroy 를 더블클릭하여 엽니다. 함수(Functions) 섹션으로 이동하여 오버라이드(Override) 드롭다운을 클릭합니다. ExitState 를 선택합니다.
-
새 변수를 생성하고 Actor 로 명명합니다. 변수 타입을 액터(Actor) 오브젝트 레퍼런스(Object Reference) 로 설정합니다.
-
디테일 패널에서 카테고리(Category) 를 컨텍스트(Context) 로 설정합니다.
-
Actor 변수를 이벤트 그래프(Event Graph) 에 드래그하고 Get Actor 를 선택합니다.
-
Actor 노드에서 드래그하여 Destroy Actor 를 검색하고 선택합니다.
-
ExitState 이벤트(Event ExitState) 노드를 Destroy Actor 노드에 연결합니다.
-
섹션 결과
이 섹션에서는 Dead 스테이트가 실행되면 작동하는스테이트 트리 태스크 를 생성했습니다. 이 태스크는 액터를 소멸시킵니다.
6 - 사망 스테이트 완료하기
-
ST_ShootingTarget 으로 돌아가서 Dead 스테이트를 선택합니다. 새 태스크(Task) 를 추가하고 드롭다운에서 Debug Text Task 를 선택합니다.
-
Text 필드에 'Actor Destroyed' 를 입력합니다.
-
Text Color 와 Font Scale 을 입력합니다.
-
-
태스크(Task) 를 하나 더 추가하고 드롭다운에서 Delay Task 를 선택합니다.
- Duration 에 2.0 을 입력합니다.
-
세 번째 태스크(Task) 를 추가하고 드롭다운에서 STT_Destroy 를 선택합니다. 이 태스크는 액터를 소멸시킵니다.
-
새 트랜지션(Transition) 을 생성하고 Trigger 를 On State Completed 로 설정합니다.
- Transition To 드롭다운을 트리 성공(Tree Succeeded) 으로 설정합니다.
-
BP_ShootingTarget 을 레벨에 드래그하고 플레이(Play) 를 누릅니다. 블루프린트를 사격하여 스테이트 트리가 작동하는 것을 확인합니다.
섹션 결과
이 섹션에서는 사망(Dead) 스테이트를 완성하고 사격 액터 블루프린트가 대미지를 받고 소멸되는지 테스트했습니다.
7 - 스플라인 경로 추가하기
이 섹션에서는 스플라인 컴포넌트가 있는 액터를 생성합니다. 이 스플라인은 사격 타깃 블루프린트가 레벨에서 움직이기 위해 사용합니다.
-
콘텐츠 브라우저 에서 우클릭하고 기본 에셋 생성(Create Basic Asset) 섹션의 블루프린트 클래스(Blueprint Class) 를 선택합니다.
-
부모 클래스 선택(Pick Parent Class) 창에서 액터(Actor) 버튼을 눌러 새 액터 블루프린트를 생성합니다.
-
블루프린트를 BP_SplineActor 로 명명합니다.
-
-
BP_SplineActor 를 열고 컴포넌트(Components) 창으로 갑니다. +추가(+Add) 를 클릭하고 스플라인(Spline) 을 선택합니다.
- 블루프린트를 컴파일 하고 저장 합니다.
섹션 결과
이 섹션에서는 스플라인 컴포넌트가 있는 일반적인 블루프린트 액터를 생성했습니다. 이 스플라인은 레벨에서 사격 액터의 이동 경로를 생성하는 데 사용됩니다.
8 - 스테이트 트리 이밸류에이터 추가하기
이제 레벨의 모든 스플라인 액터를 찾아 스테이트 트리에 가장 가까운 것을 반환하는 스테이트 트리 이밸류에이터(State Tree Evaluator) 를 생성하겠습니다.
-
콘텐츠 브라우저 에서 우클릭하고 기본 에셋 생성(Create Basic Asset) 섹션의 블루프린트 클래스(Blueprint Class) 를 선택합니다.
-
부모 클래스 선택(Pick Parent Class) 창에서 모든 클래스(All Classes) 드롭다운을 펼친 후 StateTreeEvaluatorBlueprintBase 를 검색하고 선택합니다.
-
선택(Select) 을 클릭하여 에셋을 생성합니다.
-
블루프린트 클래스를 STE_GetSpline 으로 명명합니다.
-
-
내 블루프린트(My Blueprint) 패널의 함수(Functions) 섹션으로 가서 STE_GetSpline 을 엽니다.
- 오버라이드(Override) 드롭다운을 클릭하고 TreeStart 를 선택합니다.
-
TreeStart 이벤트(Event TreeStart) 노드에서 드래그한 후 Get All Actors of Class 를 검색하고 선택합니다.
- Actor Class 드롭다운을 클릭하고 BP_SplineActor 를 선택합니다.
-
새 변수를 생성하고 Actor 로 명명합니다.
-
디테일 패널에서 변수 타입(Variable Type) 을 액터(Actor) 오브젝트 레퍼런스(Object Reference) 로 설정합니다.
-
카테고리(Category) 드롭다운을 클릭하고 'Context '를 입력합니다.
-
-
Get All Actors from Class 노드의 Out Actors 핀에서 드래그하여 Find Nearest Actor 를 검색하고 선택합니다.
-
Actor 변수를 이벤트 그래프(Event Graph) 에 드래그하고 Get Actor 를 선택합니다.
-
Actor 노드에서 드래그하여 Get Actor Location 을 검색하고 선택합니다.
-
Get Actor Location 노드의 Return Value 를 Find Nearest Actor 노드의 Origin 핀에 연결합니다.
-
-
Find Nearest Actor 노드의 Return Value 핀에서 드래그하여 BP_SplineActor에 형변환(Cast to BP_SplineActor) 을 검색하고 선택합니다.
-
BP_SplineActor에 형변환(Cast to BP_SplineActor) 노드의 As BP Spline Actor 핀을 우클릭하여 변수로 승격(Promote to Variable) 을 선택합니다.
-
이 변수를 SplineActor 로 명명하고 카테고리(Category) 에 'Output '을 입력합니다.
-
블루프린트를 컴파일 하고 저장 합니다.
-
-
ST_ShootingTarget 으로 돌아가서 스테이트 트리(StateTree) 창 아래 이밸류에이터(Evaluators) 옆에 있는 더하기 기호 를 클릭합니다.
- 드롭다운을 클릭하고 STE_GetSpline 을 선택합니다.
섹션 결과
이 섹션에서는 스테이트 트리가 실행되기 시작할 때 작동할 스테이트 트리 이밸류에이터를 생성했습니다. 이 이밸류에이터는 레벨의 모든 스플라인 액터를 확인하여 사격 액터에서 가장 가까운 것을 반환합니다.
9 - 스플라인을 따라 이동할 스테이트 트리 태스크 추가하기
이 섹션에서는 BP_SplineActor 의 스플라인을 따라 액터를 이동시키는 스테이트 트리 태스크 를 생성합니다.
-
콘텐츠 브라우저에서 우클릭하고 블루프린트 클래스(Blueprint Class) 를 선택합니다.
-
부모 클래스 선택(Pick Parent Class) 창에서 모든 클래스(All Classes) 드롭다운을 펼친 후 StateTreeTaskBlueprintBase 를 검색하고 선택합니다.
-
선택(Select) 을 클릭하여 에셋을 생성합니다.
-
블루프린트 클래스를 STT_MoveAlongSpline 으로 명명합니다.
-
-
내 블루프린트(My Blueprint) 패널의 함수(Functions) 섹션으로 가서 STT_MoveAlongSpline 을 엽니다. 오버라이드(Override) 드롭다운을 클릭하고 틱(Tick) 을 선택합니다.
-
새 변수를 생성하고 Actor 로 명명합니다.
-
디테일 패널에서 변수 타입(Variable Type) 을 액터(Actor) 오브젝트 레퍼런스(Object Reference) 로 설정합니다.
-
카테고리(Category) 드롭다운을 클릭하고 'Context '를 입력합니다.
-
-
새 변수를 생성하고 SplineActor 로 명명합니다.
-
디테일 패널로 가서 변수 타입(Variable Type) 을 BP Spline Actor 로 설정합니다.
-
카테고리 에 'Input '을 입력합니다.
-
-
Actor 변수를 이벤트 그래프(Event Graph) 에 드래그하고 Get Actor 를 선택합니다.
-
Actor 노드에서 드래그하여 Set Actor Location 을 검색하고 선택합니다.
-
Tick 노드를 Set Actor Location 노드에 연결합니다.
-
-
SplineActor 를 이벤트 그래프(Event Graph) 에 드래그하고 Get SplineActor 를 선택합니다.
-
SplineActor 노드에서 드래그하여 Spline 을 검색하고 선택합니다.
-
Spline 노드에서 드래그하여 Get Location at Distance Along Spline 을 검색하고 선택합니다.
-
Get Location at Distance Along Spline 노드의 Return Value 를 Set Actor Location 노드의 New Location 핀에 연결합니다.
-
Get Location at Distance Along Spline 노드의 Distance 핀을 우클릭하고 변수로 승격(Promote to Variable) 을 선택합니다.
-
-
Set Actor Location 노드에서 드래그하여 Branch 를 검색하고 선택합니다.
-
Distance 변수를 이벤트 그래프(Event Graph) 에 드래그하고 Get Distance 를 선택합니다.
-
Distance 노드에서 드래그하여 작음(Less) 를 검색하고 선택합니다.
-
< 노드를 Branch 노드의 Condition 핀에 연결합니다.
-
-
SplineActor 를 이벤트 그래프(Event Graph) 에 드래그하고 Get SplineActor 를 선택합니다.
-
SplineActor 노드에서 드래그하여 Spline 을 검색하고 선택합니다.
-
Spline* 노드에서 드래그하여 Get Spline Length** 을 검색하고 선택합니다.
-
Get Spline Length 노드의 Return Value 를 Less 노드의 아래 핀에 연결합니다.
-
-
Distance 변수를 이벤트 그래프(Event Graph) 에 드래그하고 Get Distance 를 선택합니다.
-
Distance 노드에서 드래그하여 추가(Add) 를 검색하고 선택합니다.
-
플로트(Float) 타입의 새 변수를 생성하고 MovementSpeed 로 명명합니다.
-
MovementSpeed 를 + 노드의 아래 핀에 연결합니다.
-
Distance 변수를 이벤트 그래프(Event Graph) 에 드래그하고 Set Distance 를 선택합니다.
-
Add 노드를 Set Distance 노드에 연결합니다.
-
아래와 같이 Branch 노드의 True 핀을 Set Distance 노드에 연결합니다.
-
-
MovementSpeed 변수를 선택하고 기본값 값을 5.0 으로 설정합니다.
-
Distance 변수를 이벤트 그래프(Event Graph) 에 드래그하고 Set Distance 를 선택합니다.
-
Branch 노드의 False 핀을 Set Distance 노드에 연결합니다.
-
두 Set Distance 노드를 Return Value 가 Running 인 반환 노드(Return Node) 에 연결합니다.
-
섹션 결과
이 섹션에서는 스플라인 액터 블루프린트로 생성된 스플라인 경로를 따라 사격 액터 블루프린트를 움직이는 스테이트 트리 태스크를 생성했습니다.
10 - 스테이트 트리 마무리하기
-
ST_ShootingTarget 으로 가서 +상태 추가(+Add State) 를 클릭합니다. 새로운 스테이트를 MoveAlongSpline 으로 명명합니다.
- MoveAlongSpline 스테이트를 클릭한 후 Idle 스테이트로 드래그하여 부모를 설정합니다.
-
디테일 패널로 가서 새 태스크(Task) 를 추가하는 + 버튼을 클릭합니다.
-
드롭다운 을 클릭하고 STT Move Along Spline 을 선택합니다.
-
Spline Actor 옆에 있는 바인드(Bind) 드롭다운을 클릭하고 STE Get Spline > Spline Actor 를 클릭합니다.
-
-
BP_SplineActor 를 레벨에 드래그합니다.
-
BP_SplineActor 의 Spline 컴포넌트를 선택합니다. Alt+드래그 하여 새 스플라인 포인트를 생성하고 닫힌 형태로 만듭니다.
- SplineActor 블루프린트의 Spline 컴포넌트를 선택하고 스플라인(Spline) 섹션으로 내려갑니다. 스플라인을 닫힌 형태로 만들기 위해 닫힌 루프(Closed Loop) 체크박스를 활성화 합니다.
-
플레이(Play) 를 눌러 목표물을 사격합니다.