언리얼 엔진 본캠프 20주차-7 언리얼 엔진 C++ : AI(Advanced) - 시각 부여 트러블 슈팅

정재훈·2025년 5월 5일
0

unreal engine

목록 보기
43/45

시야감지 트러블 슈팅

강의 따라한 로직 : AI의 시야에 플레이어가 있으면 계속 쫒아오고, 시야에서 사라지면 마지막으로 본 위치까지 이동(이걸 원하신 것 같음)

문제

근데 실제로 실행해보면 시야에서 사라져도 계속 쫒아옴(AI 시야에서 나가기 위해 큐브를 계속 빙글빙글 돌았음)

따옴표('(아포스트로피))를 눌러서 AI 디버깅을 활성화하고, BehaviorTree를 보면서 Blackboard의 Key값이 잘 변경되는지 봤음 + 로그도 찍어봄

  • CanSeePlayer의 값이 계속 잘 바뀜, AI가 플레이어 캐릭터를 인식할 때/못 할 때에 대해 값은 바뀜
  • 로그도 잘 바뀜

정리해보면 현재 CanSeePlayer Key 값이 바뀌어도, 캐릭터를 쫒아오는 왼쪽 Behavior Tree 로직만 실행함

이유

MoveTo Task의 Key가 Actor일 때 어떻게 계속 위치를 업데이트해서 쫒아오는지는 모르겠지만, TrackMovingGoal이 켜져있으면, 캐릭터를 따라잡았을 때까지 계속 쫒아오고, 따라잡았을 때 멈춤

➕ Decorator 조건부 검사(CanSeePlayer is Is Set)는 해당 서브 트리로 이동할 때만 하고, 해당 서브트리를 진행 중에 조건이 변경되더라도 실행이 중단되거나 그러진 않음

=> 캐릭터를 AI의 시야에서 벗어나게 하기위해 계속 도망다님 → MoveTo Task가 끝나지 않음 → Decorator 조건부 검사를 못함 → 다른 서브 트리 로직을 실행할 수 없음 → 계속 쫓아옴

해결 방법

Decorater의 Details → Flow Controll → Observer aborts를 Self로 변경 : Decorater 조건의 Key값(CanSeePlayer)이 변경되면 트리 실행을 중단시킴 = 조건부 검사를 할 수 있음

  • 이유를 알게되고나서 생각해보니, 로직적으로 멈출 수 있는 Task를 직접 만들어도 되고, AIController에서 인식에 실패한 경우 StopMovement()로 이동을 멈추게 하면, 문제를 해결할 수 있겠다는 생각이 듦, (StopMovement()를 사용하면 해결되긴 함)








참조 사이트
0. AI Debugging
1. Observer Aborts
2. AI Chasing - Observer Aborts
3. MoveTo Task의 문제점에 대해 설명
4. Behavior Tree Flow

profile
드가자

0개의 댓글