언리얼 엔진 5/개발 일지

[UE5] 블루아카이브 TPS게임 개발일지 (22) - 비헤이비어 트리를 이용한 적 AI 제작 3

ciel45 2023. 12. 31. 09:56

시작에 앞서, 비헤이비어 트리의 Chase Selector 부분을 조금 수정했다.

이제 플레이어를 시야에서 놓칠 시 마지막으로 본 위치로 이동하여 5초간 기다린 후, 마지막으로 본 위치 키 값을 리셋한다.

 

플레이어가 숨어도 확실하게 접근해서 확인하도록 하기 위해서이다.

 

 

 

이제 비헤이비어 트리에서 쓴 BTTask를 만드는 과정을 담을 것이다.

BTTask 역시 블루프린트 에셋으로, 다음과 같이 만들 수 있다.

부모 클래스를 BTTask_BlueprintBase로 지정한다.

 

BTTask_MoveRandomLocation 이름으로 블루프린트를 만들어 이벤트 그래프를 열면, 좌측의 My Blueprint 탭의 Functions 섹션에 (5 Overridable) 표시가 있을 것이다.

좌측 FUNCTIONS 섹션 주목

 

말그대로 BTTask Blueprint Base 부모클래스에 정의되어있는 함수를 재정의할 수 있는 것이다. Override 버튼을 눌러, Receive Execute AI를 만들고 노드를 다음과 같이 짜주었다.

 

GetRandomReachablePointInRadius라는 내장함수가 있다.

 

GetRandomReachablePointInRadius는 노드이름 그대로 Origin 주변에 도달할 수 있는 포인트를 만들어 준다.

 

Radius와 Acceptance Radius가 변수로 있는데, 

 

Radius는 랜덤 포인트를 생성할 수 있는 반경,

 

Acceptance Radius는 포인트까지 이동하는 목적지로 삼는 목적지로부터의 반경이다.

즉, 딱 그 위치까지 가지 않아도 적당히 가까이 가면 된다는 의미이다.

 

두 변수는 public으로 만들어, 비헤이비어 트리에서 값을 바꿀 수 있도록 하였다. 왼쪽 변수 목록에 떠진 눈 표시가 이 변수가 public임을 의미한다.

 

 

*** 자주들 하는 실수로, 마지막에 Finish Execute 노드로 성공 여부를 전달하지 않으면 태스크는 끝나지 않는다.

 

 

그 다음은 BTTask_ClearBlackBoard의 내부이다.

 

Blackboard Key를 Clear Blackboard Value 노드를 통해 값을 지운다.

 

지난 포스팅에 이어 한번 더 강조하자면, 값을 0으로 만드는 것과 지우는 것은 엄연히 다른 것이다.

즉 값을 '비활성화'시키기 위해서는 Clear Blackboard Value를 사용해야 한다.

 

BTTask 두개가 완성되었으니, 이제 AIController에서 Sense Handling 함수를 만들어 줄 시간이다.

AI_Enemy 블루프린트에 두 함수를 새로 만들어 주었다.

 

그리고 AI_Enemy의 이벤트 그래프를 다음과 같이 짜주었다.

BeginPlay에서는 Enemy 변수에 값을 할당하고, 비헤이비어 트리를 작동시킨다. OnTargetPerceptionUpdated는 자극이 들어왔을 때 수행되는 이벤트이다. HandleSightSense와 HandleSoundSense를 실행하도록 했다.

 

 

 

두 함수의 진행 과정에 대한 설명은 블루프린트 내부 코멘트로 달아두었다.

Handle Sight Sense 함수 전체 구조.
함수의 초반 부분
함수의 후반 부분
Handle Sound Sense 함수 구조.

 

 

그리고 중간중간에 BP_Enemy의 이벤트를 호출하고 있는데, 그 내용은 아래와 같다.

 

 

 

 

 

다음은 테스트 영상이다.

사실 비헤이비어 트리를 수정하기 전 영상이라 AI 동작이 조금 다르다. 이런 느낌이다만 알면 좋을 것 같다.

https://www.youtube.com/watch?v=RtBI96Y1c5Q&ab_channel=Ciel45