[Unreal] 29일차 - 죽는 애니메이션 후 적이 사라지게 설정, 적 네비게이션 설정, 적 생성 Spawn Points

2024. 9. 6. 00:34Unreal Engine

728x90
반응형

애니메이션을 잘라서 사용하는 방법

몽타주에서 애니메이션 타임라인을 연다. EnemyDamageMontage를 열었다.

원하는 타겟 프레임에 실행바를 가져다 놓는다.

 

 

상단 바에서 Create Asset - Create Animation - Current Pose를 선택한다.

 

 

원하는 폴더에 원하는 이름으로 생성한다.

 

 

한 틱으로 이루어진 애니메이션을 생성했다.

 

 

만든 애니메이션을 활용할 수 있다.

 

 


 

 

죽는 애니메이션 모두 재생된 후 아래로 사라지도록 설정

맨 마지막 부분에 Notify 생성

 

 

ABP_Enemy의 EventGraph로 간다. DieEnd를 검색하여 노드를 하나 만들고

 

 

BP_EnemyFSM의 DieState 함수로 간다. DieAnimDone? 이름의 Bool 변수를 생성한다.

 

 

Branch 노드를 만들어서 중간에 연결한다.

 

 

BP_EnemyFSM의 EventGraph 아래 빈 부분에 커스텀 이벤트를 생성한다.

 

 

다시 ABP_Enemy로 돌아와서 EventGraph를 수정한다.

 

 

죽은 뒤에 내려가는 것을 볼 수 있다.

 

 


 

 

적 네비게이션 설정

아직 적이 장애물을 돌아오지 않는다. 이 부분에 대한 수정이 필요하다.

 

 

Nav Mesh Bounds Volume을 검색하여 Viewport에 드래그 앤 드랍 한다.

 

 

바닥을 모두 덮도록 스케일과 높이를 조절했다.

 

 

Project Settings - Navigation Mesh에서 관련 설정을 볼 수 있다.

 

 

Outliner의 RecastNavMesh에서도 설정을 수정할 수 있다.

 

 

BP_Enemy가 AIController의 영향을 받도록 하면 장애물을 피해서 이동할 수 있게 된다.

BP_EnemyFSM에서, AI 이름의 AIController 변수를 생성했다.

 

 

BP_EnemyFSM의 EventGraph의 Event Begin Play의 뒤에 Anim SET 이후의 노드를 연결하면,

 

 

GetAI가 잘 나온다.

 

 

BP_Enemy에서 Auto Possess AI를 아래와 같은 설정으로 바꾼다. 동적으로 받는 AI도 바로 possess 할 수 있도록 한다.

 

 

BP_EnemyFSM의 MoveState 함수로 간다.

이동 관련 부분을 잠깐 끊는다.

 

 

끊은 부분을 AI 변수와 Target 변수, Move to Location 노드를 이용하여 연결한다.

 

 

이렇게 잘 했으면 실행했을 때 적이 나를 잘 따라와야 하는데 잘 안되었다.

다행히 NavMeshBoundsVolume의 높이를 조금 낮추니까 영역 표시도 되고 잘 실행되었다.

 

 


 

 

특정 영역 안에 들어왔을 때만 AI Navigation을 실행하기 -Navigation Invoker

Project Settings - Navigation System에서 Navigation Invokers를 체크한다.

 

 

Navigation Mesh 설정에서는 Runtime Generation을 Dynamic으로 설정한다.

 

 

BP_Enemy에서 Navigation Invoker를 추가한다.

 

 

Details에서 감지 거리와 감지 하지 않을 거리를 설정한다.

 

 

Viewport에서 보면 적의 감지 거리를 볼 수 있다.

 

 

실행 중 ~ 표시를 누른 후 show navigation 입력을 하면 실행 중에도 범위를 볼 수 있다.

 

 

Invoker 범위는 다시 원복시킨다.

 

 


 

 

피격, 공격 등 상태가 변경될 때 Navigation을 잠깐 끄기

특정 상태에서 Navigation을 끄지 않으면 미끄러지면서 피격되면서 플레이어에게 계속 다가오게 된다.

 

 

BP_EnemyFSM의 MoveState 맨 뒤에 길찾기를 정지시키는 노드를 연결한다.

 

 

BP_EnemyFSM의 OnDamageProcess의 초반에도 똑같이 복사해서 연결했다.

 

 

미끄러지지 않고 애니메이션이 잘 실행된다.

 

 


 

 

여러 적 생성

Actor 블루프린트 생성, 이름은 BP_EnemyGOD로 지었다.

 

 

BP_EnemyGOD에 변수를 생성한다. Actor로 설정했고 이름은 SpawnPoints.

 

 

만든 변수를 선택한 후 Details 창에서 Actor 타입을 Array로 변경한다.

 

 

외부에서도 사용하기 위해 눈을 뜨도록 누른다.

 

 

BP_EnemyGOD를 Viewport에 끌어다 놓는다.

 

 

SpawnPoints를 위한 Actor 블루프린트 생성

 

 

BP_SpawnPoints를 눌러서 지도에 표시될 수 있도록 Sphere를 추가한다. 메테리얼도 변경했다.

 

 

충돌하지 않도록 NoCollision 설정했다.

 

 

게임 실행 시에는 보이지 않게 하기 위해 Hidden in Game 체크

 

 

BP_SpawnPoints를 맵에 배치한다.

 

 

Outliner 상의 BP_Enemy는 지우고 SpawnPoints 폴더를 만들어서 관리한다.

 

 

Outliner에서 BP_EnemyGOD를 누르고 Details에서 SpawnPoints에 + 버튼 눌러서 맵에 배치한 BP_SpawnPoints를 세팅했다.

 

 

BP_EnemyGOD의 EventGraph의 Event BeginPlay에서 노드를 구성한다.

랜덤 위치를 얻기 위해서 Spawn Points의 길이를 가져오는데 Random Integer in Range의 노드가 Min과 Max 값을 포함하므로 Max에 1을 뺀 크기만큼 가져와야 한다. 그 값을 Spawn Points의 인덱스로 Get 하여 그 Actor의 위치와 회전 값에 BP_Enemy를 Spawn 한다.

 

 

랜덤 시간도 설정한다. Float Random을 Time에 이었고 Min과 Max는 Promote to Variable하여 변수화 했다. Min은 1.0, Max는 5.0의 초기 값을 세팅했다.

 

 

랜덤 시간과 타이머 부분을 함수화 한다. EnemyTimer로 함수 생성

 

 

만든 EnemyTimer를 뒤에서도 연결시키면 계속해서 적이 생성된다.

 

 

적이 잘 생성된다.

 

 


 

 

편의를 위해서 Spawn Points를 하나씩 넣지 말고 Runtime에서 찾도록 해보자.

설정했던 부분을 다 지웠다.

 

 

BP_EnemyGOD에서 Get All Actors Of Class 노드를 통해서 동적으로 받아올 수 있다.

 

 

해당 노드를 Ctrl+X로 잘라내기 해서 Construction Script에 넣으면 굳이 실행하지 않아도 동적으로 들어가있다! 심지어 지우려고 해도 지워지지 않는다.

728x90
반응형