본문 바로가기

언리얼 BluePrint 정리

07/12 학습 정리 ( 전투 모드 구현 )

전투 모드 구현

 

게임에서 적이 플레이어를 인식하고 전투모드로 변경하는것을 구현해보자

순서는 플레이어를 적이 인식  → 플레이어를 쳐다보기 → 무기 장착 → 플레이어에게 다가오기 → 공격 순이다

 


플레이어 인식 ( Perception )

 

AI Perception

 

BP_Enemy_Melee에서 AI Perception 컴포넌트를 추가한다. AI Perception은 Enemy가 적을 인식하는 컴포넌트이다.

 

 

Detail에서 Senses Config에 원소를 추가. 적이 플레이어를 인식하는 방법의 대표적인 시각과 청각이다.

 

AI SIght Config

 

Sight Radius : 시야의 반경

Lose Sight Radius : 인식이 풀리는 범위 ( 인식된 후 인식이 풀리려면 Lose Sight Radius밖으로 나가야 한다 )

Peripheral Vision Half Angle Degrees : 인식 각도 ( 45도로 설정하면 좌우로 45도씩 총 90도의 인식각을 갖는다 )

Detection by Affiliation : 적,중립,아군의 식별 여부

Auto Success Range from Last Seen Location : 마지막으로 인식된 위치에서 설정한 거리 내에 재등장할 경우 즉시 인식

( Lose Sight Radius 밖으로 나갔어도 나간위치로부터 설정한 거리에 들어오면 Lose Sight Radius 범위라도 인식됨 )

Point Of View Backward Offset : 시야각의 중심을 뒤로 이동시켜 후방에서의 접근도 인식한다. 음수로는 설정불가

Near Clipping Radius : 중심으로부터 설정한 값만큼의 범위를 자른다.

Life Span : 인식이 풀리는데 걸리는 시간


AI Hearing Config

 

 

Hearing Range : 청각의 범위

 

Sound

 

Play Sound 2D : 시스템 사운드 같이 어디에 있든 똑같은 소리로 들리게 하는 소리 재생에 사용

Play Sound At Location : 사운드를 정해진 위치에서 재생

둘 다 웨이브, 큐만 재생 가능하다.

큐 내부에서 감쇠를 하여 소리의 근원지로 떨어지면 소리가 작아진다.

(Attenuation에서 사운드 감쇠를 에셋의 형태로 사용가능하다)

 

하지만 AI Perception에서 사용하는 청각은 Sound를 인식 하는게아니라 Noise를 인식한다.

Noise를 발생시키려면 BP의 Make Noise 노드나  BT의 Make Noise Task를 사용한다

 

 

 

AnimNotify로 AN_MakeNoise를 만들어 공격에 적용시키고 적의 Hearing Range 안에서 휘두르면 적이 인식한다.

어째선지 Notify 내부에서는 Make Noise를 검색해도 나타나지 않기에 Make Noise를 Notify가 부모클래스가 아닌 다른 BP에서 복사해서 가져와야한다. ( 컨텍스트에 따라 체크박스를 해제하면 언리얼엔진의 모든 함수를 검색이 되지만 컴포넌트에서 사용하는거라서 사용 불가능하다. )


Target 등록 ( BTS_FindTarget )

 

 

블랙보드에서 TargetActor를 추가하여 AI가 인식한 플레이어의 정보를 TargetActor에 세팅한다.

Get Currently Perceived Actors : 현재 인식 범위에 있는 Actor들의 배열

Get Known Perceived Actors : 인식을 한번이라도 하고 범위 밖으로 나갔어도 LifeSpan이 남아있는 Actor들의 배열

Get Perceived Actors : 옛날에 쓰다가 이제는 위의 두 노드에 밀려 사용되지 않는 노드

Sense to Use : 시각으로 설정하면 시각만 청각으로 설정하면 청각만, None으로 설정하면 모든 감각의 결과를 리턴한다.

 

 

BP_Enemy에서 Tick이벤트로 설정이 가능하나 이 방식은 BlackBoard Key값의 이름이 바뀌면 오류가 나기에 Service로 만든다.

 

BTS_FindTarget

인식할 대상이 많으면 Loop돌리겠지만 지금은 Player 하나 이기에 Get으로 배열의 0번값을 가져온다.

인식대상이 Enemy일수 있으니 Equal노드로 검사하고 Select로 True일때는 0번값 False일때는 None값을 TargetActor에 세팅한다.


플레이어 쳐다보기 ( BTT_LookAt )

 

BT에서 플레이어를 쳐다보게 하는 Rotate To Face BBEntry 라는 Task가 이미 존재하는데 이 Task는 실행되는 즉시 그 방향으로 휙하고 이동하여 부자연스럽기에 BTT_LookAt이라는 Task를 만들어 적용한다.

BTT_LookAt의 이벤트 그래프에서 플레이어를 인식한 Enemy의 Rotation에서 인식된 플레이어의 Rotation으로

RInterp To 노드를 사용하여 DeltaTime으로 Rotation을 보간하여 서서히 고개를 돌리는 것처럼 만든다.

 


무기 장착 ( BTT_Arm, BTD_IsArmed )

BTT_Arm(왼쪽)과 BTD_IsArmed(오른쪽)

장착 시키는 기능을 가지는 BTT_Arm 생성 BP_Character에서 사용하는 기능이기에 재활용하면 된다.

하지만 이것만 있으면 실행될때마다 꺼냈다 넣었다를 반복하기에 변수 Compare To가 항상 False로 설정하여 장착을 하고있으면 False가, 미장착이면 True가 리턴되어 True일때만 통과시켜준다.

장착해제 하려면 Compare To 변수를 항상 True로 설정하면 된다.


플레이어의 방향으로 이동 ( BTT_MoveTo )

 

BlackBoard Key의 위치로 이동하는 BT에서 기본적으로 제공하는 Task다.

 

- Detail

Acceptance Radius : 목표 위치에 도착하기 위해 허용되는 반경을 지정, 일정 반경내에 도착하면 이동이 완료된것으로 간주

 

 


공격 ( BTT_Attack )

 

BTT_Arm과 마찬가지로 BP_Character에서 사용하던 기능이니 재활용한다.

 


 

Root에서 TargetActor값이 없으면 진행불가

TargetActor값이 있으면 BTD_IsArm 검사하여 미장착 상태면 장착을 하고 Target을 쳐다본다.

이미 장착되어 있다면 BTT_Arm과 BTT_LookAt을 실행 할 필요없기에 BTD_IsArm을 넣어준것

BTD_IsArm 부분이 성공을 했기에 Selector는 자식이 하나라도 성공하면 뒤는 실행하지 않기에 돌아오게 되고 다시 Selector로 넘어와서 BTD_IsArm이 실패하여 다음 노드인 Sequence로 넘어와 TargetActor에게 이동하고 공격한다.

아직 Enemy가 이동중인데 Player가 계속 도망가면 MoveTo가 실패하여 BTT_Attack은 실행되지않는다.