2023-07-12 언리얼(Ai 타겟 인식, AIPerception)
Enemy가 Player 쪽으로 회전하기
Enemy가 Target(플레이어 키)를 바라보도록 하기 위해 Rotate to Face BBEntry라는 태스크를 사용할 수 있지만, 적이 캐릭터를 너무 빠르게 돌아보는 상황이 생겨 어색한 모습을 볼 수 있다.
이로 인해 Rotate to Face BBEntry라는 태스크를 사용하지 않고 적이 캐릭터를 천천히 돌아보는 로직을 추가해 보자.
새 태스크를 생성한 뒤 블루프린트 베이스에서 Target변수(인스턴스 편집가능)를 추가한다.
새 태스크 이름을 BTT_LookAt으로 이름을 변경시킨다.
이후 Target 변수에서 Get Blackboard Value as Actor를 추가해 이 노드로 나오는 값을 변수로 승격하여 그 승격한 변수에 값을 집어넣게 된다.
승격한 변수 이름은 Actor to Face로 변경한다.
BTT_LookAt 태스크는 Target이 Set 되면 해당 Target을 바라보도록 부드럽게 회전시켜 줄 태스크로 사용할 것이다.
그다음 회전을 위해 Receive Tick Ai이벤트를 추가해 해당 이벤트를 우클릭 - 함수로 변환 후 함수로 변환해 준다.
Get Controlled Pawn에서 GetActorLocation을 뽑아와 Find Look at Rotation의 Start에 연결해 주고,
Get Actor to Face 변수에서 GetActorLoaction을 뽑아와 Find Look at Rotation의 Target에 연결해 준다.
Rinterp To
Get Controlled Pawn에서 GetActorRotation을 뽑아와 RInterp To(보간)에 이어준다.
Rinterp To은 현재 회전에 기반하여 타깃 회전에 도달하려고 시도하며, 타깃 회전으로 회전할 때 부드러운 느낌을 준다.
따라서 현재 회전 Current(GetActorRotation)에서 Target(Find Look at Rotation)으로 회전하게 될 텐데 Delta Seconds마다
Interp Speed만큼 회전하게 될 것이다.
Interp Speed는 변수로 승격하여 15.0의 값을 지정해 주었다.
그렇게 회전하게 되는(RInterp To) 값을 Get Controlled Pawn의 SetActorRotation의 New Rotation에 연결하여 매 Tick마다
부드러운 회전이 가능하도록 구현하였다.
Finish Execute를 통해 SetActorRotation의 Return Value값을 그대로 반환해 주었다.
이제 해당 LookAt 태스크가 잘 작동하는지 확인하기 위해 몇 군데를 더 수정할 것이다.
BTT_LookAt 태스크의 이벤트그래프에서 Target 변수에서 actor에서 받아왔던 로직을 vector로 받도록 수정한다.
BTT_LookAt 태스크의 Receive Tick AI 함수 내부에서 Find Look at Rotation의 Target을 vector로 받았던 변수로 바꿔준다.
BT_Enemy_Melee 비헤이비어 트리를 수정해 보자.
Sequence 다음으로 수행해 주기 위해 Simple Parallel을 추가한다.
여기서 Simple Parallel을 추가해 준 이유는, 무기 장착(BTT_Arm)과 동시에 Target에 대한 회전(BTT_LookAt)이 동시에
이루어져야 하기 때문에 선택하였다.
해서 Main 태스크는 BTT_Arm, Sub 태스크는 BTT_LookAt이 되었다.
BTT_Arm에 있던 데코레이터 BTD_IsArmed를 Simple Parallel에게 옮겼다.
우선 구조를 만들어만 두고 아직 연결은 하지 않은 상태이다.
AIPerception 사용 전 간단 세팅
1. BP_Enemy의 클래스 세팅에서 Generate Abstract Class(가상 클래스 지정)로 체크
2.BP_Enemy의 트리를 비워둔다.
3. BP_Enemy의 컴포넌트에 AIPerception을 추가
4. Enemy의 무기 소지 비워주기
5. BP_Character에서 LIfe Now / State / AttackIndex / bAttackEnabled / bAttackTransited 들을 프라이빗 해준다.
6. BP_Enemy의 자손 BP_Enemy_Melee 생성 후 tree와 weapon classes를 설정해 준다.
7. 이후 BP_Enemy_Melee을 맵에 투고한다.
AI Perception
Enemy가 캐릭터를 감시하는 형태라고 한다면 Enemy에게 특정 범위를 주고 해당 범위와 캐릭터가 충돌 시, 이를 Enemy가 감지하여 캐릭터가 Target에 지정이 되는 방식일 것이다.
언리얼엔진에서는 이러한 기능을 지원해 주게 AI Perception 컴포넌트가 있다.
그리고 BP_Enemy에서 만들었고 자손으로 BP_Enemy_Melee에도 들어있으니 건들어보자.
AI Perception 에는 7개의 기능을 지원해 주지만 블루프린트에선 Ai Hearing config / Ai Sight config 2가지 기능만 사용해 볼 것이다.
AI Sight config(시야)
AI Sight config : AI에게 시야기능을 주어 특정범위 안에 적을 인지하는 관련 기능을 제공해 준다.
- Sight Radius : 목표를 인식할 수 있는 최대 시야 거리
- Lose Sight Radius : 이미 본 타깃을 놓치게 되는 최대 시야 범위
- PeripheralVisionHalfAngleDegrees : AI가 얼마나 넓게 볼 수 있는지 지정해 주는 시야
- Detection by Affiliation : Enemy(적), Neutrals(중립), Friendlies(아군)이 Sense를 감지할 수 있는지 결정
ㄴDetect Enemies
ㄴDetect Neutrals
ㄴDetect Friendlies
- Auto Succes Range from Last Seen Location : 보였던 타깃이 마지막으로 보인 위치에서 해당 범위 내로 다시 보인다면 다시 타깃 추적 가능
- Point of View Backward Offset : 특정 값만큼 시야를 더 뒤에 옮겨줌
- Near Clipping Radius : 시야의 시작 부분을 해당 값만큼 잘라냄
- Debug Color : 디버그 시 보이는 색상 지정
- 최대 수명 : 이 Sense에서 받은 자극이 잊혀서 추적이 소멸하기까지 걸리는 시간
- Start Enabled : 해당 Sense 활성화 여부
AISense Hearing(청각)
AISense Hearing : 소리를 감지할 수 있는 역할을 준다.
- Hearing Range : 소리를 인식할 수 있는 범위
SOUND(2D, 3D)
언리얼에선. wav 확장자만 사용이 가능하다.
엔진콘텐츠에서 2개의 사운드를 가져온다
엔진 콘텐츠 - 필터 - 사운드 - 사운드웨이브
이후 WhiteNoise 사운드 우클릭 - 큐 생성을 하여 WhiteNoise_Cue를 만들어준다.
추가로 WhiteNoise_Cue 내부에서 해당 사운드를 계속 들을 수 있게 Looping을 켜준다.
2D Sound
Sound 2D는 듣는 자의 위치와 관계없이 소리가 나온다
블루프린트에 play Sound 2D 노드를 추가해 듣으려는 sound를 지정해 놓으면 된다.
3D Sound
3D Sound는 듣는 자의 위치에 따라서 소리의 크기가 달라질 수 있다.
블루프린터에서 Play Sound at Location노드를 불러와 듣고 싶은 sound를 선택하면 된다.
또한 WhiteNoise_Cue내부에서 Overide Attenuation 활성화 시 해당 소리에 관해 직접 설정(감쇠)을 해줄 수도 있다.
- 감쇠 함수 : 거리 알고리즘 - 거리에 대한 함수로 사용할 어테뉴에이션 유형
- 감쇠 모양 : 어테뉴에이션 메서드 모양
- 내부 반경 : 사운드 감쇠가 시작되는 지점을 정의하는 반경(최대로 사운드를 들을 수 있는 거리)
- 감쇠 거리 : 이 거리에 걸쳐 볼륨 어테뉴에이이 발생(어디까지 감쇠가 적용될지의 거리)
AI Perception 컴포넌트 내에 사용가능한 이벤트
AI Perception에는 5개의 이벤트가 있다
위 5가지 중 On Percetion Updated / On Target Perception Updated / On Target Perception Info Updated 3가지의 이벤트가
가장 많이 사용되며 On Percetion Updated 이가 가장 많이 자주 사용된다.
위 들은 AI Perception이 특정 대상을 인지했을 경우에 자동으로 호출되는 공통점이 있다.
플레이 후 디버깅 화면
위 AI Perception의 지원하는 기능의 범위를 확인하고 싶을 때 사용된다.
사용방법은 플레이 후 작은따옴표(') 입력 후 디버그 창을 열어볼 수 있으며 키번호 중 4번을 누르면 Perception이 활성화하게 되며, sense의 범위와 동작을 실시간으로 확인해 볼 수 있다.