몬스터를 구현하기 위한 내용들을 정리한다
전에는 Behavior Tree를 사용했으나 요즘엔 State Tree가 대세라고?!
그래서 본 글에선 ST를 활용해 구현해보았다
첫 번째, 스테이트 트리(ST) 생성
1. 컨텐츠 브라우저에 마우스 우클릭, 호출된 컨텍스트 메뉴에서 [ 게임 플레이 > 스테이트 트리 ]를 선택한다

2. 호출된 창에서 [ 스테이트 트리 AI 컴포넌트 ]를 선택한다

- 위와 같이 안 나올 경우, GameplayStateTree 플러그인이 체크 상태인지 확인해야 한다

이후 디테일한 부분은 다른 것들 준비 후에 진행
두 번째, 몬스터 AI BP 생성
우선 몬스터가 세계를 인지할 수 있도록 하기 위해 아래 과정을 진행한다
1. AI 컨트롤러 타입으로 BP 생성 후 열기

2. 좌측 컴포넌트 리스트에서 [ AI 인지 컴포넌트 ] 추가 후 선택

3. 우측 디테일 항목의 감지 환경설정 배열 추가
4. 감지 환경설정 설정

- 여기서 몬스터가 어떤 감각들을 사용할 건지 설정할 수 있다
- 시각 / 청각 / 피격 등 여러 감각들이 있는데 우선 시각만 다룬다
- 귀속 감지에 중립, 아군 탐지도 설정한다
5. 가장 아래에 주도적인 감각을 설정한다
- 감지 환경설정에서 추가한 여러 개의 감각 중 어떤 것을 주로 사용할 것인지 설정하는 것
- 지금은 시야만 추가했으므로 AISense_Sight로 설정
다음은 몬스터가 규칙에 따라 행동할 수 있도록 하기 위해 아래 과정을 진행한다
1. 좌측 컴포넌트 리스트에서 [ 스테이트 트리 AI 컴포넌트 ] 추가 후 선택

2. 우측 디테일 항목의 [ AI > 스테이트 트리 ]에 첫 번째 단계에서 생성한 ST를 설정한다

마지막으로 몬스터가 유저를 인지할 수 있도록 한다
1. 캐릭터 BP의 컴포넌트 리스트에 [ AI 인지 자극 소스 컴포넌트 ]를 추가한다

※ 이걸 해주면 몬스터가 캐릭터를 인지하게 된다
추가로 몬스터가 인지할 때마다 타겟을 설정토록 해야 하는데
이 부분은 다른 곳에서 선행 작업이 필요하므로 이후에 다룬다
세 번째, 몬스터 BP 생성
보통은 여러 종의 몬스터가 동일 데이터나 기능을 사용하는 경우가 많으므로
부모 몬스터 BP와 자식 몬스터 BP를 생성한다
부모 몬스터 BP는 캐릭터 타입으로 생성
- 여기에는 모든 몬스터가 공용으로 사용할 데이터나 기능들을 구현한다
자식 몬스터 BP도 캐릭터 타입으로 생성
- 그 후 클래스 세팅에서 부모 클래스를 부모 몬스터 BP로 설정한다

- 여기에는 각 몬스터 전용 데이터나 기능들을 구현한다
- 외형이 다르니 모션도 다를 것이므로 애님 클래스도 각 자식 몬스터 BP별로 설정한다
마지막으로 몬스터에게 인지 능력을 적용한다

- AI 자동 빙의는 Placed in World or Spawned로 설정
- AI 컨트롤러 클래스에 두 번째 단계에서 생성한 몬스터 AI BP 설정
※ 위 항목은 모든 몬스터가 동일한 인지 능력을 가진다면 부모 몬스터 BP에
각 몬스터마다 다르다면 해당 자식 몬스터 BP에 설정한다
(자식 몬스터 BP에 설정하면 자식 몬스터 AI가 오버라이드 된다)
네 번째, 몬스터 ABP 생성
몬스터를 움직이게 하기 위한 ABP가 필요하다
이미 세팅되어 있다면 패스
세팅되어 있지 않다면 이벤트 그래프와 애님 그래프를 기존 캐릭터와 유사하게 작성해주면 된다
※ 몬스터는 캐릭터에 비해 행동이 단순하므로 100% 동일하게 작성하지 않아도 된다
요건 캐릭터 세팅할 때 해봤을 테니 따로 설명하지 않는다
(이것까지 작성하긴 귀찮..)
다섯 번째, 부모 몬스터 BP 구현
AI에 따른 몬스터 행동은 크게 세 가지로 구분한다
① 대상을 인지한다
② 대상을 쫓아간다
③ 대상을 공격한다
위 행동들을 구현하기 전, 아래 변수들을 추가한다

각 행동별 Custom Event 생성 후 아래와 같이 그래프를 작성한다

- AttackTarget은 각 몬스터별 애니메이션이 달라 자식 몬스터 BP에 아래와 같이 작성했다

※ 이것도 부모 몬스터 BP에 구현하라면 할 수 있을 것 같지만 꽤 복잡해지기에 간단한 방법으로 정리했다
여섯 번째, ST 조건 및 작업 구현
ST 조건과 작업도 BP로 생성하는데 타입은 각각 아래와 같다

그렇게 생성된 ST 조건과 작업은 아래와 같다

이제 생성된 각 항목들의 그래프를 작성할 차례
그 전에 공통적으로 사용되는 변수를 추가한다

① AI 실행 주체를 담기 위한 변수
- 반드시 카테고리를 [ Context ]로 설정해야 한다
- 설정하지 않으면 ST에서 변수가 바인딩되지 않아 인식을 못한다

② 명확한 결과값 설정을 위한 변수
- 반드시 [ 인스턴스 편집가능 ]을 체크(true) 상태로 설정해야 한다
(이미지18)
1. STC_HasTarget
(이미지19)
- 조건 확인 : 대상이 있는지 확인한다
※ Receive Test Condition은 좌측 [ 함수 > 오버라이드 ]를 통해 추가할 수 있다

2. STC_TargetInAttackRange

- 조건 확인 : 대상이 공격 범위 내 있는지 확인한다
3. STT_MoveTarget

- 작업 실행 : 대상에게 이동한다
※ Enter State는 좌측 [ 함수 > 오버라이드 ]를 통해 추가할 수 있다

4. STT_AttackTarget

- 작업 실행 : 대상을 공격한다
일곱 번째, ST 구현
1. 좌측 에셋 디테일의 [ 일반 > 스키마 ]에서 AI 컨트롤러 클래스와 컨텍스트 액터 클래스를 설정한다

- AI 컨트롤러 클래스 : 몬스터 AI BP
- 컨텍스트 액터 클래스 : 부모 몬스터 BP
2. 상태를 구성한다
상태는 Idle / Chase / Attack 총 세 가지로 구분

※ Patrol / Search / Investigate / Alert / Doubt / Return / Retreat / Dead 등 여러 가지가 있지만 일단은 세 가지만 다룬다
3. 각 상태별 디테일 설정한다
Idle 상태

- 기본 상태라 다른 상태로 전환시키기만 하면 되므로 트랜지션만 추가해준다
> Trigger는 [ On Tick ] : 수시로 확인해야 함
> 트랜지션 대상은 [ Chase ]
> 조건은 [ STC Has Target ] : 조건 내 Expected Value는 대상이 있는 것이 조건이므로 체크(true) 설정한다
Chase 상태

- 본 상태가 되면 대상에게 이동해야 하므로 태스크 추가가 필요하다
> 추가 태스크는 [ STT_MoveTarget ]
- 그리고 다른 상태로 전환시키기 위해 트랜지션을 추가한다
> 첫 번째 트랜지션
>> Trigger는 [ On Tick ] : 수시로 확인해야 함
>> 트랜지션 대상은 [ Idle ]
>> 조건은 [ STC Has Target ] : 조건 내 Expected Value는 대상이 없는 것이 조건이므로 체크 해제(false) 설정한다
> 두 번째 트랜지션
>> Trigger는 [ On Tick ] : 수시로 확인해야 함
>> 트랜지션 대상은 [ Attack ]
>> 조건1은 [ STC Has Target ] : 조건 내 Expected Value는 대상이 있는 것이 조건이므로 체크(true) 설정한다
>> 조건2는 [ STC TargetInAttackRange ] : Expected Value는 공격 범위 내 있는 것이 조건이므로 체크(true) 설정한다
Attack 상태

- 본 상태가 되면 대상을 공격해야 하므로 태스크 추가가 필요하다
> 추가 태스크는 [ STT AttackTarget ]
- 그리고 다른 상태로 전환시키기 위해 트랜지션을 추가한다
> Trigger는 [ On State Complete ]
※ 본 스테이트가 완료되는 것이 조건이며 이는 STT_AttackTarget의 Finish Task가 실행되면 완료 판정한다
> 트랜지션 대상은 [ Root ]
> 조건은 [ 없음 ] : 완료 판정되면 Root로 돌아가 조건에 따른 상태로 전환되는 형태라 조건 불필요
'개발 > Unreal' 카테고리의 다른 글
| 인터랙티브 컷신 모드 (0) | 2026.04.13 |
|---|---|
| 웅크리기 해제 가능 여부 판단 기능 구현 (0) | 2026.04.12 |
| 애니메이션 몽타주 (0) | 2026.04.09 |
| 몬스터 시야 공유 기능 구현 (feat 렌더 타깃) (0) | 2026.04.08 |
| 캐릭터 인터랙션 기능 (0) | 2026.04.02 |
