게임 개발 메모장
[ UE5 ] Behavior Tree : Composites(Sequence/Selector/Simple Parallel) 본문
[ UE5 ] Behavior Tree : Composites(Sequence/Selector/Simple Parallel)
Dev_Moses 2023. 12. 21. 15:06컴포짓은 상태들의 시작점이다. 상태가 복귀와 실행 플로우에서 어떻게 행동해야 하는지 정의한다.
BT의 메인 요소는 'Task'이다. Task는 보다 복잡한 액션을 표현하는 서브 트리로 구성이 된다.
모든 Task들은 공통의 인터페이스를 가지고 있고, 그 자체가 독립적으로 모듈화되어 있어
계층적 구조를 쉽게 구성할 수 있다.
Composite
Composite 에는 크게 Selector와 Sequence 두 종류가 있다(사실 세 종류이다. Parallel Task).
이 둘 모두 그들의 자식 노드를 순차적으로 방문한다. 하나의 자식 노드가 수행을 완료하면
그 결과값(True or False)을 반환하는데 Composite는 그 결과값을 보고, 진행을 계속할지
멈출지를 결정한다.
* Selector
Selector는 Sequence와 달리 하나라도 true로 종료하는 태스크가 있으면 이후의 실행을 종료한다.
다른 말로 표현하면 true로 종료하는 태스크가 있을 때까지 실행한다.
여러 행동 중 하나만 실행해야 할 때 사용하기 좋다.
* Sequence
Sequence는 자식노드가 성공하면 계속 순차 방문을 하고, 자식노드가 실패하는 경우 실행을 중지하는 구조로 이루어져 있다. 이는 일련의 액션 전부가 성공해야만 하나의 행위가 완성되는 것을 의미한다.
Composite 1. Sequence
왼쪽부터 오른쪽으로 아래 노드를 타고가 true인지를 확인하게 됨.
SequenceValue가 0이라서 왼쪽 노드에서 3초 뒤에 오른쪽 노드로 바뀐다.
3초 후 오른쪽 노드를 타고 다시 3초 뒤 왼쪽으로 다시 순환됨.
왼쪽 블랙보드의 SequenceValue is Not Equal To 0.0 으로 바꾸면
아예 왼쪽 노드에 진입하지도 않게 된다.
* 시퀀스 노드는 간단히 요약하지면 왼쪽 노드 부터 오른쪽으로 순차적으로 노드가 진행되는 순간
false가 발생하면 오른쪽 노드로 넘어가지 않는다.
* 시퀀스 노드는 하위 노드가 모두 성공해야 해당 시퀀스가 완료된다.
Task 는 BehaviorTree를 통해 하려는 궁극적인 일들을 말한다. ( Custom 가능 )
Task가 성공했는지 실패했는지 여부를 체크 해준다.
즉, Task에 원하는 코딩을 하고 Finish Execute 함수에 Successs를 체크를 넘겨주어야 한다.
그렇게 되어야, 비헤이비어 트리에 Sequence로 연결된 Task중에 다음 Task로 넘어갈 수 있는 것이다.
Task가 실패를 리턴을 한다면, Sequence 뒤로 더 이상 가지 않는다.
결론은 Sequence 순서대로 진행을 하는데, 앞에 있는 Task가 성공을 해야 그 다음이 진행이 되고
만약에 Task가 하나라도 실패가 되면, 해당 Sequence의 맨 처음 Task부터 다시 실행한다.
예를 들어, Task 1에서 적을 감지 하는 Sensing 을 구현한다고 해보자
Task1에서 적을 탐지 할때까지 Sensing을 한다.
적을 감지 하지 않으면 FALSE를 반환하기 때문에
TASK 1에서 TASK 2로 넘어가지는 않겠지
그러다가 적군을 감지 했다. 그러면 TASK1은 TRUE를 반환을 하고
그러면 적군을 감지했을때 어떻게 행동할지에 대한 TASK2가 실행이되겠지
Composite 2. Selector
Selector 노드는 왼쪽부터 검사하는게 검사하기는 하나
왼쪽 노드가 마무리 되더라도 오른쪽 노드로 넘어가지 않는다.
그리고 왼쪽에 있는 노드 조건이 안 맞으면 오른쪽 노드로 넘어가게 된다.
즉, Sequence 노드는 중간 조건이 실행되지 않는다면, 마치 while문 안에서 break로
while문을 탈출하게 되면서 그 아래에 있던 노드들이 동작하지 않는 꼴이다.
Selector 노드는 while 안에서 break 가 나더라도 그 상황에 대비하여
다른 로직이 동작하게 되는 것과 같은 것 같다.
Selector의 예시 상황 Task1, Task2, Task3 이 있다고해보자
Task1이 참이면 그냥 해당 Task1만 실행하고 끝
다음으로 넘어가지 않는다. 거짓이면 그다음 Task2가 실행된다.
또 다른 예시 Selector에 Sequence 1, Sequence 2 가 있다고 가정해보면
Sequence 1이 true를 리턴을 하면 그냥 그곳에서 끝이다.
Selector에 엮인 Sequnce 2가 실행이되려면 Sequence 1 이 false가 되어야 한다.
Composite 3. Simple Parallel
Simple Parallel 동시에 두 가지 일을 한다.
왼쪽 주 테스크 오른쪽 주 테스크와 동시에 할 것
'언리얼 엔진 > AI' 카테고리의 다른 글
[ UE5 ] Behavior Tree - Service (0) | 2023.12.21 |
---|---|
[ UE5 ] Behavior Tree : Decorator (0) | 2023.12.21 |
[ UE5 ] BehaviorTree : Blackboard (0) | 2023.12.21 |