오늘은 FSM(유한 상태 머신), HFSM(계층형 유한 상태 머신), BT(비헤이비어 트리) 에 대해서 공부하도록 하겠습니다.
1. FSM, HFSM, BT?
FSM HFSM BT라는 말을 들으면 무슨 약자인가?? 라는 생각이 먼저 떠올릴것입니다.
이 각각 유한상태 기계, 계층 유한상태 기계, 비헤비어 트리라는 약자이며 각각 AI행동 패턴을 설계하는등 다양한 곳에서 사용됩니다.
프로그래머 뿐만아니라 기획자분들도 알면 좋다고 하며 알고리즘적이 아닌 구조를 이해하기위해 포스팅합니다.
2. FSM
유한상태 기게 단순한 AI를 설계할때 사용을 많이합니다.
해당 구조가 사용된 AI는 한 번의 한가지 상태를 이전합니다.
심플하게 두 가지 AI가 있다고 생각해봅시다.
FSM은 한 번의 한가지의 상태만 가지고 있을수 있고 상태를 바꾸기위해서는 전이가 필요합니다. 이 전이를 하기 위해
특별한 이벤트 로직이 필요합니다.
대기에서 걷기로 상태를 변경하기 위해서 특별한 이벤트 로직을 통해 상태를 전이합니다.
만약 캐릭터가 움직이게 된다면 걷기 상태를 만들어라 라는 로직을 사용할수 있지요
이러한 로직은 화살표로 설정할수 있고 만약 이 로직이 참이면 걷기로 상태가 변환될거입니다.
이렇게 심플하고 간단한 FSM이지만 상태가 많으면 많을수록 기능이 점점 약화 되고 장점을 잃어버리는 형식이 됩니다.
이러한 달리기를 추가했다고 봅시다. 대기 걷기 달리기 순으로 가야하므로 상태가 바로바로 변하지않는이상 매우 비효율적입니다.
그렇다면 아래처럼 추가를 했다고 봅시다.
조금더 좋은 방식일수있지만 화살표가 매우 많이 늘어났습니다. 이말은 즉슨 이벤트 로직이 많이 생겨났다는 뜻입니다.
하지만 만약 여기에 공격을 추가한다면 어디에 추가를 해야하나요??
대기 다음으로 추가를 해야하나 걷고있는중에 추가를 해야하나 달리는 중에 추가를 해야하나?? 뭐든 상황이 점점 않좋아질겁니다.
그럼 대기 걷기 달리기중에도 공격을 하는 로직을 만들면
이러한 엉청난 화살표가 만들어집니다. 하지만 지금은 매우 괜찮습니다 많은것이 아니니깐요 하지만 더 많이 늘어나면 어떻게될가요???
AI는 대기 공격 걷기 달리기 뿐만아니라 다양한 기능을 추가해야합니다.
이러한 말도안되는 상태가 나옵니다.
그러므로 단순한 AI를 구성할때만 FSM을 사용하고 복잡하면 다른 방식을 사용해야합니다.
그런데 이 그래프 모양 어디서 많이 본 모양이지 않나요??? 언리얼을 해보셨던 분들은 애니메이션 블루프린트가 바로 생각이 나실겁니다.
제생각에도 언리얼 ABP는 FSM토대로 만들어진 기법인듯 합니다.
3. HFSM
계층형 유한 상태 머신 이라고 불립니다. 앞에 FSM을 개선한 버전이며 항목별로 분류한 FSM이라는것이 특징입니다.
FSM을 오른쪽같이 HFSM으로 변경을 해보았습니다.
FSM은 단순 AI를 처리를 했다면 HFSM은 복잡한 AI를 처리하도록 설계가 되었습니다.
대기 이동 공격을 각 전이후 조건에 맞게 하위 계층에 선택하는 구조입니다.
하지만 전체적인 툴은 FSM이랑 동일합니다. 점점 늘어나면 가독성이 낮아질것이고 복잡도는 높아지며 유지 보수는 하기 매우 어려운 구조가 될 것입니다.
4. BT
다음은 BT 비헤비어 트리 입니다.
비헤이비어 트리는 위에 HFSM을 개선하기 만든 구조 입니다. HFSM 구조는 각 상태마다 지닌 로직을 통해 다음 상태로 전이했다고 하면 BT 구조는 상위 노드에서 매 틱마다 우선순위를 평가하고 상태를 결정합니다.
그림으로 쉽게 이야기하자면 서로 엇갈리는 화살표가 필요 없습니다.
BT에서는 상태를 정해주는 건 Root 노드라고 생각하시면 됩니다. 그 때문에 각각의 상태 노드들은 자신들이 맡은 독립적인 행동 노드들만 컨트롤하면 됩니다.
쉽게 적을 추적하고 공격하는 행동을 한다고 합시다. FSM에서는 이동 상태에서 로직을 통해 판단 후 공격 상태로 전이 후 공격을 하면 되지만 BT에서는 전이를 담당하는 노드에서 우선순위를 재판단한 뒤 즉각 상태를 바꿔 버립니다.
-엄밀히 따지자면 상태와 상태를 점프하는 것이 아닌 이어달리기처럼 진행 중인 상태의 서브 트리로 다음 상태를 연결하는 방식입니다.-
또한 우선순위를 미리 결정할 수 있기에 먼저 처리해야 하는 일들이 있으면 우선순위를 조정해서 처리가 가능합니다. 복잡한 화살표도 없고 트리 구조를 띄고 있기 때문에 높은 가독성과 유지 보수가 장점입니다.
앞서 이야기했듯이 FSM 구조는 상태가 추가될수록 점점 복잡한 구조를 띄게 됩니다. 하지만 BT 구조는 말 그대로 나무가 뿌리를 내리듯 위에서부터 아래로 각 상태가 쉽게 확인이 가능합니다. 뭐든지 일단 잘 읽히면 최고입니다.
추가, 삭제 역시 편리합니다. 어떤 행동을 추가하고 싶으면 새로운 상태 노드를 끌어다가 추가한 다음 행동을 결정하는 상위 노드를 수정해 주면 됩니다. 제거 역시 해당 노드를 제거하고 상위 노드를 수정해 주면 됩니다. FSM의 경우 서로 연결되어 있는 모든 상태 노드를 수정해 줘야 합니다.
그래도 HFSM과 BT가 뭐가 다른 건지 잘 이해가 안 되시는 분들도 있으실 겁니다. 회사로 비유를 한다고 했을 때 HFSM이 수평 구조라면 BT는 수직 구조입니다. HFSM은 각 상태들이 스스로 다음 행동을 결정하지만 BT는 상위 상태가 할 일을 결정해 줍니다. 각 하위 상태들은 자신이 맡은 일만 하면 됩니다.
이러한 구조를 가지고있는 것이 언리얼에서 비헤비어트리입니다. 비헤비어 트리는 서비스 데코레이터 태스크 루트 등이 있으며 각각의 역할은
서비스 = 비헤비어트리에 저장된 블랙보드 키의 조건 및 상태의 맞는 로직을 변경
데코레이터 = 트리에 조건에 맞으면 하위 노드 실행
태스크 = 실행 단위 실행이 정상적으로 성공하면 성공을 반환 아니면 실패를 반환
5. Ref
https://neulsang-day.tistory.com/30
'개발자 면접 공부 > 언리얼 엔진' 카테고리의 다른 글
언리얼 엔진 액터의 생명주기(디스크 로드) (0) | 2024.03.19 |
---|---|
RTTI vs Reflection (2) | 2024.03.11 |
언리얼 엔진의 가비지 컬렉션 (0) | 2023.02.22 |
언리얼 엔진의 리플렉션 (프로퍼티) (0) | 2023.02.02 |
언리얼 엔진의 CDO 로딩 과정 등 (0) | 2023.01.31 |