[unrealengine4]

2023-07-13 언리얼(AN_MakeNoise, Enemy사운드 인지)

롤링페이퍼 2023. 7. 18. 01:21
검을 휘두를 때 AI가 소리를 인지하는 걸 만들어 보기

 

AI는 자동으로 소리를 감지를 할수가 없다. 그러므로 소리가 발생하는 대상이 직접 MakeNoise와 Pawn Make Noise 함수를 호출해서 AI가 소리가 났다는 것을 인지할 수 있도록 해줘야 한다.

 

기본으로 소리가 나는 로직을 만들어야 한다.

무기를 휘두를때 소리가 나올 수 있도록 해보자.

일단 소리에 관련된 notify를 만들어야 한다.

animNotify를 추가한다. 

animNotify

 

 

AN_MakeNoise

 

AN_MakeNoise의 Received Notify 함수 로직

Received Notify 오버라이드 함수를 추가한 뒤 Play Sound at Location에서 사운드의 위치와 방향을 지정하고 재생해 준다.

해당 몽타주의 Mesh comp의 Owner를 받아와서 Location과 Rotation을 넘겨주면 된다.

 

이후 Play Sound at Location으로 사운드가 재생되었으면 Make Noise를 통해 사운드가 발생되었다고 호출을 보네 주는 역할을 한다.

주의할 점은 Notify 내부에서는 make Noise함수가 검색되지 않으므로 외부에서 make Noise함수를 복사해 넣어줘야 하거나, 우클릭 창에서 컨텐스트에 따라를 해제하여 모든 함수를 볼 수 있도록 바꿔주면 된다.

 

이후 해당 노티피를 만들고 attak_1_montage에 넣어주면 해당 몽타주가 재생할 때 해당 노티피를 호출할 수 있도록 해주며, 이것으로 통해 Ai가 감지를 할 수 있도록 하게 된다.


 

AI Perception으로 인지된 Target 받아 사용하기

이벤트 그래프에서 AiPerception 컴포넌트를 통해 인지한 대상을 받아오는 3가지 함수가 있다.

- Get Currently Perceived Actors : 현재 인지 범위 안에 있는 Actor 구하기

- Get Known Perceived Actors : 인식된 적이 있고, 인지 범위 바깥에 나갔어도 아직 인식 수명이 남아있는 모든 Actor

- Get Perceived Actors : 공식에서 사용하지 말라고 권하고 있다.

 

Sense to Use에서 특정 Sense의 인지 결과만 받아올 수도 있지만, None으로 두면 모든 Sense의 결과를 받아온다.


BTS_FindTarget 서비스 만들기

 

BT_Enemy_Melee 비헤이비어 트리에서 Selector에 추가해 줄 서비스를 하나 만들어준다.

Receive Search Start AI이벤트를 추가하여 Pawn(Enemy)에서 AI Perception Component를 선택해 받아온다.

그리고 Melee에서 AI Perception 컴포넌트에서 사용한 Get Known Perceived Actors함수를 통해서 인지된 Actors들이 배열에 담겨 반환된다.

반환된 Out Actor 배열의 Length의 길이가 0보다 큰지를 조건으로 select(선택)로 이후의 실행을 결정할 것이다.

배열을 Length가 0보다 크다면 인지된 actor가 배열에 담겨있다는 뜻 이므로, true라면 배열의 0번째 원소를 Target변수에 SetBlackboard Value as Object로 넣어주게 된다.

 

Target 변수는 서비스에서 하나 생성하여 Blackboard Key Selector 유형으로 인스턴스 편집가능을 켜주었다.

 

이후 BT_Enemy_Malee의 비헤이비어 트리에서 Selector에 BTS_FindTarget 서비스를 붙여주고, 서비스 디테일에서 Target 키에 Target 변숫값을 지정해 준다.


BT_Enemy_Melee 비헤이비어 트리

 

이제 소리가 발생 시 Enemy가 소리 난 방향으로 돌아볼 수 있도록 해보자.

 

Sequence에서 BTD_IsArmed로 넘어갈 수 있도록 연결해 준다.

이후 BTT_LookAt의 이벤트 내부에서 Receive Execute Ai 이벤트를 actor to face로 연결해 준다.

이후 BTT_LookAt의 ReceiveTickAt내부에서 actor to face의 actorLocation을 findlookatRotation의 target으로 지정해 준다.

 

마지막으로 Inter Speed의 기본값을 20으로 변경한다.