FSM쓰다가 행동트리도 한번 써보려고 행동트리 어제 부터 공부하기 시작했는데 좀 복잡네
내가 글을 못 써서 챗지피티한테 내가 궁금한거 정리해서 써달라하고 그대로 올렸어
이게 내가 지금 딱 궁금한거임 미리 감사합니다.
Behavior Tree를 사용할 때 특정 상태에서 다른 상태로 전환할 때마다 이전 상태를 깔끔하게 종료해야 할 때가 있습니다. 예를 들어 attack, hit, die 상태가 있고, 이 상태들이 다음과 같은 우선순위를 가지고 있다고 가정해 봅시다:
- die - 가장 높은 우선순위
- hit - 중간 우선순위
- attack(공격) - 가장 낮은 우선순위
이제 적이 공격하고 있는 상태(attack)에서 적이 공격을 받고 hit 상태로 전환될 때, 원래는 attack 상태를 종료(예를 들어 attack 애니메이션을 false로 바꾼다던지)하고 hit 상태로 들어가야 하는데, Behavior Tree는 이걸 자동으로 처리하기가 어렵습니다. 특히, 우선순위가 높은 상태가 개입될 때 기존 상태를 어떻게 종료할지 제어하는 것이 까다롭습니다.
문제 요약:
- Behavior Tree에서 상태 전환 시, 이전 상태의 onExit 처리가 자동으로 이루어지지 않음
- 우선순위가 높은 상태(hit, die)로 전환할 때 낮은 우선순위의 상태(attack)가 종료되지 않고 남아있을 수 있음
이런 문제 상황을 해결하기 위해 Behavior Tree 구조를 어떻게 개선할 수 있을까요?
아 코드 열어봐야 정확히 기억나는데 지금 달리고 있는 노드를 강제로 Fail or Success로 바꾸는 구조로 했던거 같은데
튜토리얼 다봄?
그럼 지금 달리고 있는 노드를 참조하는 변수를 만들어야 하나요? 머리 아프네요 ㅠㅠ 그냥 정리 decorator를 만들까 생각중이기도 한데,,,
근데 이거 직접 구현은 어떻게 해결해야할지는 모르겠는데 비헤이비어 디자이너 에셋은 abort라고 실행 우선순위에 상관 없이 해당조건이 바뀌는 순간 해당 로직으로 바로 실행되게 하는 옵션이 있음 abort self 하면 내 자식들이 실행중이다가도 false 로 바뀌면 다음으로 바로 넘어가고 lower priority 하면 내 오른쪽이 실행중이다가도 true로 바뀌면 바로 해당 로직 실행하게 할 수 있었음 직접구현은 잘 모르겠다 미안!
아니에요 감사합니다!! 비헤이비어 디자이너 에셋은 이런 문제 어떻게 해결하나 진짜 궁금했었는데 저런식이군요 감사합니다 ㅎㅎ
https://github.com/BehaviorTree/BehaviorTree.CPP/issues/547
https://gamedev.stackexchange.com/questions/189352/behaviour-trees-how-to-clean-up-when-a-sequence-is-interrupted
https://stackoverflow.com/questions/71096853/how-to-handle-animations-with-behavior-trees-in-unity
링크
열심히 찾아 보고 있긴 한데 직접 구현은 좀 생각할 것이 많네요 ㅠ
https://github.com/meniku/NPBehave/tree/a1bc9673823610ea19198fc3e7268f8da8910cd4
https://github.com/meniku/NPBehave/blob/a1bc9673823610ea19198fc3e7268f8da8910cd4/Scripts/Decorator/ObservingDecorator.cs#L79
노드가
중지될때 예외처리하는 함수 하나를 만들어두고 정지될때 그거는 실행하고 탈출하는것같은데 흠... 몰루!
감사합니다!