소개
언리얼 엔진 5.4에는 다른 스테이트 트리 내부에서 스테이트 트리 에셋을 링크하는 기능이 도입되었습니다. 이 기능을 사용하면 프로젝트에서 스테이트 트리를 빌드하고 재사용할 때 모듈형 접근법을 더 활용할 수 있습니다.
이제 특정 기능이 있는 스테이트 트리를 생성하고 필요할 때 재사용할 수 있습니다.
이 가이드는 단순한 스테이트 트리를 생성하고 스테이트 트리 퀵스타트 가이드에서 생성한 스테이트 트리에 이를 링크하는 방법을 단계별로 안내합니다.
목표
이 가이드에서는 히트 시 움직이는 타깃을 회전시키는 스테이트 트리를 생성하고, 이 스테이트 트리를 타깃의 이동을 처리하는 다른 스테이트 트리에 외부 에셋으로 추가합니다.
목적
- 히트 시 움직이는 타깃을 회전시키는 새 히트 반응 스테이트 트리 및 스테이트 트리 작업 생성하기
- 히트 반응 스테이트 트리를 사격 타깃 스테이트 트리에 외부 에셋으로 추가하고 환경설정하기
- BP_ShootingTarget 및 STT_MoveAlongSpline가 이러한 새 기능을 수용하도록 수정하기
1- 전제조건
이 가이드에서는 외부 스테이트 트리 사용법을 보여주기 위해 스테이트 트리 퀵스타트 가이드에서 생성한 스테이트 트리를 사용합니다. 이 문서의 예시를 따르려면 해당 퀵스타트 가이드를 완료해 주세요.
퀵스타트 가이드를 완료한 후에는 플레이 를 눌러 비헤이비어를 확인하세요.

2 - 타깃을 회전시키는 스테이트 트리 작업 생성하기
이 섹션에서는 움직이는 타깃을 회전시키는 스테이트 트리 작업을 생성합니다.
- 콘텐츠 브라우저(Content Browser) 에서 우클릭한 다음 기본 에셋 생성(Create Basic Asset) 섹션에서 블루프린트 클래스(Blueprint Class) 를 클릭합니다.
- 부모 클래스 선택(Pick Parent Class) 창에서 모든 클래스(All Classes) 를 펼친 다음 StateTreeTaskBlueprintBase 를 찾습니다. 선택한 다음 선택(Select) 을 클릭합니다.
- 에셋을 STT_RotateTarget 으로 명명합니다.
-
STT_RotateTarget 을 더블클릭하여 엽니다. 새 변수를 생성하고 ContextActor 로 명명합니다.
- 디테일(Details) 패널에서 변수 타입(Variable Type) 드롭다운을 클릭하고 액터 오브젝트 레퍼런스(Actor Object Reference) 를 선택합니다.
- 카테고리(Category) 텍스트 박스를 클릭하고 Context 라고 입력합니다. 이렇게 하면 변수가 스테이트 트리의 컨텍스트 액터에 자동으로 바인딩됩니다.
- 블루프린트를 컴파일(Compile) 하고 저장(Save) 합니다.
-
함수(Functions) 섹션으로 이동하여 오버라이드(Override) 드롭다운을 클릭합니다. EnterState 를 클릭하여 이벤트 그래프(Event Graph) 에 EventEnterState 노드를 생성합니다. 이 프로세스를 반복하고 ExitState 를 클릭합니다.
- ContextActor 를 이벤트 그래프로 드래그하여 Get ContextActor 를 선택합니다.
- ContextActor 에서 드래그하여 Add Actor Component By Class 를 검색해 선택합니다.
- Class 드롭다운을 클릭하고 Rotating Movement Component 를 검색해 선택합니다.
- Add Rotating Movement Component 노드의 Return Value 핀을 우클릭하고 변수로 승격(Promote to Variable) 을 클릭합니다.
- 변수를 RotatingMovementComp 로 명명합니다.
- RotatingMovementComp 핀에서 드래그하여 Set Rotation Rate 를 검색해 선택합니다. 그런 다음 Z 값으로 720 을 입력합니다.
- RotatingMovementComp 를 이벤트 그래프 로 드래그하여 Get RotatingMovementComp 를 선택합니다.
- RotatingMovementComp 에서 드래그하여 Is Valid 를 검색해 선택합니다.
- EventEnterState 노드를 Is Valid 노드에 연결합니다.
- Is Valid 노드의 Is Not Valid 핀을 Add Rotating Movement Component 노드에 연결합니다.
- RotatingMovementComp 를 이벤트 그래프 로 드래그하여 Get RotatingMovementComp 를 선택합니다.
- RotatingMovementComp 에서 드래그하여 *Set Component Tick Enabled** 를 검색해 선택합니다.
- Enabled 핀이 켜기 로 설정되어 있는지 확인합니다.
- RotatingMovementComp 를 이벤트 그래프 로 드래그하여 Get RotatingMovementComp 를 선택합니다.
- RotatingMovementComp 에서 드래그하여 *Set Component Tick Enabled** 를 검색해 선택합니다.
- Enabled 핀이 끄기 (체크 해제)로 설정되어 있는지 확인합니다.
- EventExitState 노드를 SetComponentTickEnabled 노드에 연결합니다.
-
블루프린트가 아래 예시처럼 설정되었는지 확인합니다.
섹션 결과
이 섹션에서는 타깃 액터에 회전하는 액터 컴포넌트 를 추가하고 이를 회전시키는 스테이트 트리 작업을 생성했습니다.
3 - 타깃을 회전시키는 스테이트 트리 생성하기
이 섹션에서는 히트 시 움직이는 타깃을 회전시키는 스테이트 트리를 생성합니다. 이 스테이트 트리는 스테이트 트리 퀵스타트 가이드의 ST_ShootingTarget 스테이트 트리에 링크됩니다.
-
콘텐츠 브라우저 안을 우클릭하고 인공 지능(Artificial Intelligence) > 스테이트 트리(StateTree)를 클릭합니다. StateTreeComponent를 클릭하고 에셋을 ST_Reaction 으로 명명합니다.
-
ST_Reaction 을 더블클릭하여 엽니다. 스키마(Schema) 섹션을 펼치고 Context Actor Class 드롭다운을 클릭합니다. BP_ShootingTarget 을 찾아 선택합니다.
-
+상태 추가(+Add State) 를 클릭하여 새 스테이트를 생성합니다. 스테이트를 Reaction 으로 명명합니다.
-
Delay Task 를 추가하고 기간(Duration) 에 0.5 를 입력합니다. 그런 다음 새 태스크를 추가하고 드롭다운에서 STT Rotate Target 을 선택합니다.
-
트랜지션(Transition) 을 선택하고 Trigger 를 On State Completed 로, Transition To 를 트리 성공(Tree Succeeded) 으로 설정합니다.
-
스테이트 트리를 컴파일 하고 저장 합니다.
섹션 결과
이 섹션에서는 STT_RotateTarget 작업을 실행하는 ST_Reaction 스테이트 트리를 생성했습니다. 이 작업은 스테이트 트리가 실행될 때 타깃을 회전시킵니다.
4 - 외부 스테이트 트리 추가하기
이 섹션에서는 ST_Reaction 을 ST_ShootingTarget 에 링크된 외부 스테이트 트리로 추가합니다.
-
ST_ShootingTarget 을 열고 +상태 추가 를 클릭하여 새 스테이트를 생성합니다. 스테이트를 Hit Reaction 으로 명명합니다.
-
Hit Reaction 스테이트를 선택하고 디테일 패널로 이동합니다. 타입(Type) 드롭다운을 클릭하고 Linked Asset 을 선택합니다. Linked Asset 드롭다운을 클릭하고 ST_Reaction 을 선택합니다.
- 조건 입력(Enter Condition) 을 추가한 다음 IF 드롭다운을 클릭하고 Integer Compare 를 선택합니다.
- Operator 드롭다운을 클릭하고 Less 를 선택합니다.
- Right 값을 5 로 설정합니다.
- Left 드롭다운을 클릭하고 Actor > Hit Count 를 선택합니다.
-
새 트랜지션 을 추가하고 Trigger 를 On State Completed 로 설정합니다. Transition To 를 Idle 로 설정합니다.
- MoveAlongSpline 스테이트를 선택하고 새 트랜지션 을 생성합니다.
- Trigger 드롭다운을 클릭하고 On Event 를 선택합니다.
- Event Tag 드롭다운을 클릭하고 게임플레이 태그 관리(Manage Gameplay Tags) 를 선택합니다.
-
+ 버튼을 클릭하고 이름이 StateTree 인 새 항목을 추가합니다. 아래에 또 다른 항목을 추가하고 아래 예시처럼 HitReaction 으로 명명합니다.
-
Event Tag 드롭다운을 클릭하고 StateTree > Hit Reaction 을 선택합니다. Transition To 를 Hit Reaction 으로 설정합니다.
섹션 결과
이 섹션에서는 Hit Reaction 스테이트에 ST_Reaction 을 외부 StateTree로 추가하여 ST_ShootingTarget 을 수정했습니다. 또한 게임플레이 이벤트가 호출될 때 MoveAlongSpline 스테이트가 Hit Reaction 으로 전환하도록 수정했습니다.
5 - BP_ShootingTarget 수정하기
이 섹션에서는 ShootingTarget 블루프린트가 Hit Reaction 이벤트를 StateTree에 전송하고 그 결과로 타깃을 회전시키도록, ShootingTarget 블루프린트를 수정합니다.
-
콘텐츠 브라우저 에서 BP_ShootingTarget 을 더블클릭하여 엽니다. 새 플로트 변수를 생성하고 DistanceTraveled 로 명명합니다.
- StateTree 컴포넌트를 이벤트 그래프 로 드래그합니다.
- StateTree 레퍼런스에서 드래그하여 Send State Tree Event 를 검색해 선택합니다.
- ++ 노드를 Send State Tree Event 노드에 연결합니다.
-
Send State Tree Event 노드의 Event 핀에서 드래그하여 Make StateTree Event 를 검색해 선택합니다.
-
태그 드롭다운을 클릭하고 StateTree > Hit Reaction 을 선택합니다.
- OnComponentHit 노드의 Hit Component 핀에서 드래그하여 Get Display Name 을 검색해 선택합니다.
- Get Display Name 노드의 Return Value 핀에서 드래그하여 Make StateTree Event 노드의 Origin 핀에 연결합니다.
- 블루프린트를 컴파일 하고 저장 합니다.
섹션 결과
이 섹션에서는 ShootingTarget 블루프린트가 히트 시 StateTree에 Hit Reaction 이벤트를 전송하도록 수정했습니다.
6 - STT_MoveAlongSpline 수정하기
이 섹션에서는 STT_MoveAlongSpline 이 스플라인상의 위치를 계산할 때 로컬 거리 변수 대신 BP_ShootingTarget 의 DistanceTraveled 변수를 사용하도록 STT_MoveAlongSpline을 수정합니다.
-
콘텐츠 브라우저 에서 STT_MoveAlongSpline 을 더블클릭하여 엽니다. 함수 옆의 오버라이드 드롭다운을 클릭하고 EnterState 를 선택하여 이벤트 그래프 에 Event EnterState 노드를 생성합니다.
- Actor 변수를 이벤트 그래프 에 드래그하여 Get Actor 를 선택합니다.
- 액터 에서 드래그하여 Cast to BP_ShootingTarget 을 검색해 선택합니다.
- Cast to BP_ShootingTarget 노드의 As BP_ShootingTarget 핀을 우클릭한 다음 변수로 승격 을 선택합니다.
- Event EnterState 노드를 Cast to BP_ShootingTarget 노드에 연결합니다.
- AsBPShootingTarget 를 이벤트 그래프 로 드래그하여 Get AsBPShootingTarget 를 선택합니다.
- AsBPShootingTarget 에서 드래그하여 Get Distance Traveled 를 검색해 선택합니다.
- DistanceTraveled 를 Get Location at Distance Along Spline 노드의 Distance 핀에 연결합니다. 이렇게 하면 현재 연결이 Distance로 대체됩니다.
- AsBPShootingTarget 를 이벤트 그래프 로 드래그하여 Get AsBPShootingTarget 를 선택합니다.
- AsBPShootingTarget 에서 드래그하여 Get Distance Traveled 를 검색해 선택합니다.
- DistanceTraveled 를 Less Than 노드에 연결하여 연결을 Distance로 대체합니다.
- AsBPShootingTarget 를 이벤트 그래프 로 드래그하여 Get AsBPShootingTarget 를 선택합니다.
- AsBPShootingTarget 에서 드래그하여 Get Distance Traveled 를 검색해 선택합니다.
- DistanceTraveled 를 + 노드에 연결하여 연결을 Distance로 대체합니다.
- AsBPShootingTarget 를 이벤트 그래프 로 드래그하여 Get AsBPShootingTarget 를 선택합니다. 해당 노드에서 드래그하여 Set DistanceTraveled 를 검색해 선택합니다.
- Branch 노드의 True 핀에 연결된 Set Distance 노드를 대체합니다.
- AsBPShootingTarget 를 이벤트 그래프 로 드래그하여 Get AsBPShootingTarget 를 선택합니다.
- 해당 노드에서 드래그하여 Set DistanceTraveled 를 검색해 선택합니다.
- Branch 노드의 True 핀에 연결된 Set Distance 노드를 대체합니다.
- 블루프린트를 컴파일 하고 저장 합니다.
섹션 결과
이 섹션에서는 STT_MoveAlongSpline 이 로컬 Distance 변수 대신 BP_ShootingTarget 의 DistanceTraveled 변수를 사용하도록 수정했습니다.
7 - 결과 테스트
플레이 를 눌러 목표물을 사격합니다. 히트 시 타깃이 회전하고, 0.5초 후 다시 이동을 시작하는 것을 확인할 수 있습니다.
