TIL_086 : AI State Tree (1)

김펭귄·2025년 12월 22일

Today What I Learned (TIL)

목록 보기
86/93

0. 플러그인

  • 사진의 2개의 플러그인이 있어야 함 (언리얼 엔진 5.7버젼에는 기본적으로 들어있었음)

1. State Tree

  • 이전엔 Behavior Tree로 AI 행동로직을 구현하였지만, 트리 구조라 로직이 복잡해지면 엄청 구조가 깊어지게 되고, 디버깅도 어렵고 성능도 좋지 않음

  • State Tree는 FSM과 Task 기능을 합쳐 성능 좋음

1.1. Schema

  • 종류는 아래 사진처럼 3개가 존재

StateTree Component

  • 액터 자체에 붙어서 동작

  • AI 컨트롤러 없이 State Tree에 의해서 액터가 동작함

  • 독립적으로 움직이는 신호등, 자동문 같은 액터에 사용

StateTree AI Component

  • AI 컨트롤러가 필요한 State Tree

  • AI Character에 사용됨

Gameplay Camera Director

  • 카메라 연출과 관련된 로직 관련

커스텀 스키마

  • 원하면 C++로 자신만의 스키마도 구현하여 사용 가능

1.2. State Tree Asset Detail

  • AIController Class / Context Actor Class : 해당 State Tree와 함께 사용될 컨트롤러와 캐릭터 설정

  • Context : 기본적으로 가지고 시작할 데이터 정보 (레퍼런스)

    • Parameter : AI마다 다른 값 가지며 시작 가능한 전역 변수 (Health)
    • Evaluators : 활성화 되었을 때, 주기적으로 상태나 환경 정보를 평가하는 컴포넌트
    • Global Tasks : State 상관 없이 항상 실행되는 전역 Task
  • Theme : 보기 편하게 색으로 구분해줄 수 있는 기능 (정말 시각용)

1.3. State

  • 현재 무엇을 해야하는지(상태)를 정의한 노드

  • 각 State는 Task와 Transition을 가짐

  • Task 여러 개 가지면 동시에 실행됨

  • Root State
    • 최상단 노드로 여기서 State Tree가 시작됨
    • 일은 안 하고 다음 State로 전환시키는 역할만 함
  • 현재 상태는 Root로부터 지금 활성화된 Node까지의 모든 경로(브랜치)를 말함
Root
|-A
| |-a			a가 활성화 되어 있으면, A와 a 둘 다 현재 상태로 활성화 된 것임
|    
|-B
  • Child

    • 부모 노드 밑의 자식 노드. 자식 노드가 활성화되면 모든 부모 노드도 활성화되어 함께 동작함
    • 그래서 공통 로직은 부모노드에 넣고, 세부 행동을 자식으로 쪼개서 분리
  • Sibling

    • 형제 노드끼리는 경쟁 관계로, 부모 노드가 자식 노드 중 하나만 골라 활성화 시킴
    • A와 B, 사진의 Wander와 Chase는 서로 형제 관계. Root에선 자식 노드

1.4. State Details

  • Name : 노드 이름

  • Tag : GAS의 태그를 노드에 붙일 수 있음. 자식 노드는 부모 노드의 Tag를 물려받음

  • Color : 보기 편하게 색깔 설정

  • Type

    • State : 일반 State. 지금까지 설명한 일반적인 노드
    • Group : Task 없이 자식 State를 묶어주는 컨테이너(폴더) 역할
    • Subtree : 재사용할 로직 덩어리. 직접 실행되는게 아니라, 함수처럼 누가 호출하기를 기다리는 노드
    • Linked : 이 SubTree를 부를 노드. SubTree 노드로 점프함
    • Linked Asset : State Tree 파일 전체를 호출함
  • Selection Behavior : 부모가 어느 자식 선택할건지

옵션 이름설명
None (선택하지 않음)아무 동작도 설정되지 않음
Try EnterParent 자신만 실행하고 자식 노드는 무시
Try Select Children In Order위에서부터 순서대로 조건을 검사하여 실행 (기본값)
Try Select Children At Random조건을 통과한 Child 중 무작위로 하나를 선택
Try Select Children With Highest UtilityUtility 점수가 가장 높은 Child를 선택
Try Select Children At Random Weighted By UtilityUtility 점수 비율대로 가중 무작위 선택
Try Follow TransitionsChild 선택 없이 Transition 조건을 먼저 검사

2. 이동 Task 생성

  • StateTreeTaskBlueprintBase를 부모로 하여 블루프린트 생성

  • 생명주기 함수

    • EnterState : State 활성화되자마자 호출되는 함수
    • Tick : 매 프레임마다 호출되는 함수
    • StateCompleted : state task의 성공여부 결과값을 state로 넘겨주는 함수
    • ExitState : State 떠나는 순간 무조건 호출되는 함수 (타이미 정리..)
    • Get Description : 에디터/디버깅 용
  • Variables

    • 눈 표시 띄우면(Instance Editable), 해당 값을 State Tree에서 입력 Parameter로 노출
    • 눈 지우면, 이 Task 내부적으로만 사용하고 노출 안 함
    • 변수 Detail창에서 Category를 Input으로 입력하면, 이후 StateTree에서의 Task에서 IN이 표시되므로 설정해줌
    • Output으로 입력하면, 입력 필드가 사라지고 출력 전용이 됨. 다른 Task의 Input으로 바인딩 가능

  • AI Move To로 이동하고, Finish Task로 task 종료 후 성공 여부 저장

  • Finish Task : 해당 Task가 들어있었던 State 자체를 종료시킴. 따라서 같은 State에 있던 다른 Task들도 다 종료됨

3. Find Target Location Task

  • 이동할 위치 찾고 해당 위치를 변수에 저장해야함

  • 하지만 Task는 동작을 수행하는 역할이라 Task 대신, 캐릭터 "블루프린트"에 저장

4. State Tree에 연결

  • Radius 파라미터 생성

  • Task의 입력인자로 파라미터와 Context Actor 연결

  • 캐릭터 블루프린트에 변수 선언해야 Task에 인자로 쉽게 넣을 수 있음
  • State마다 Transition을 성공하면 이동하도록 설정
profile
반갑습니다

0개의 댓글