적을 생성하고 총알과 상호작용할 수 있도록 만들어 본다.

적은 Character를 상속하여 구현하고 리소스는 언리얼엔진의 다른 샘플에서 가져다 쓰기로 한다.

 

플레이어를 만들 때처럼 콜라이더 크기와 메시의 위치를 조절하고 정면을 방향을 맞춘다.


그리고 BP_Enemy는 플레이어와 동일한 스켈레탈 메시를 사용하고 구분하기 위해서 머티리얼은 복사하여 새로 생성하고 색만 바꾸어서 적용했다.

 

애니메이션은 언리얼에서 제공하는 3인칭 시점 게임 샘플에서 Idle과  RunForward만 가져다 사용했다.


가지고 온 애니메이션을 적용하니 메시가 이상하게 변형되었다. 아마도 리깅이 달라서 생긴 문제로 보인다. 

 

Unreal Engine - Enemy Mesh

 

이 상태로 작업해도 크게 문제는 없을 것 같아 그대로 진행한다.

 

애니메이션 에셋을 더블클릭하여 에셋의 디테일창을 연다. Idle과 Run 모두 Loop는 체크해 준다.

 

RunForward의 경우 애니메이션이 위치를 수정하는 게 포함되어 있어서 Root Motion > Force Root Lock을 체크해 준다.

 

Unreal Engine - Root Motion

 

보통 Enable Root Motion이 체크된 경우 애니메이션 동작이 위치 변형이 반영되는데 이 애니메이션은 RootMotion은 비활성화되어 있어도 위치가 변형되어 Force Root Lock을 체크했더니 해결되었다.

 

BP_EnemyAnimation

플레이어와 마찬가지로 Speed 변수를 만들어서 에너미의 Velocity의 크기를 가져다 상태를 전환하는 값으로 사용했다.

 

BP_Enemy의 Anim Class에 BP_EnemyAnimation을 적용시킨다.

Unreal Engine - Anim Graph
Unreal Engine - Anim State
Unreal Engine - Run to Idle
Unreal Engine - Idle to Run

 

적의 인공지능

적은 플레이어를 추적해서 공격하는 기능이 필요한데 우선 플레이어를 타깃으로 추적하는 부분까지만 구현하기로 한다.

 

AIController 블루프린트를 상속한 BP_EnemyAIController를 생성한다.

 

먼저 BP_Player 타입의 Target 변수를 만들고 시작할 때 GetPlayerCharacter를 캐스트 해서 변수를 저장한다.

 

Unreal Engine - BP_EnemyAIController > BeginePlay

 

타겟을 향해 이동하는 함수는 Move to Location을 사용한다.

 

타겟을 향해 이동할 때 타겟의 방향으로 회전하면서 이동하기 때문에 따로 회전하는 기능은 추가할 필요가 없다.

 

Unreal Engine - Event Tick > MovetoLocation

 

저장해 놓은 Target에서 위치를 가져와서 Move to Location의 Dest, 목표로 설정해 준다.

 

이렇게 만들어 놓은 AI 컨트롤러는 BP_Enemy > Details > Pawn > AI Controller Class에 할당한다.

 

적 스폰

이제 만들어 놓은 Enemy를 스폰해 본다.

 

스폰을 어디서 처리할지가 애매했는데 일단 게임의 전반적인 기능을 담당하는 BP_MyGameMode에서 스폰 기능을 구현하기로 한다.

 

BP_MyGameMode에 Spawn Enemy 함수를 추가한다.

 

적은 플레이어 위치를 기준으로 일정한 범위 내에서 랜덤 한 위치에 생성되도록 한다.

 

먼저 플레이어 위치 벡터를 가지고 와서 일정 범위 안에서 랜덤 한 값만큼을 오프셋으로 사용해서 생성될 위치를 정한다.

 

Unreal Engine - BP_MyGameMode > Spawn Enemy Func

 

Random Float in Range를 사용해서 Min ~ Max 범위 안의 값을 오프셋으로 사용한다.

 

Spawn Actor BP Enemy의 Spawn Transform에 생성한 무작위 위치를 할당하고 class는 BP_Enemy로 설정해 준다.

 

이제 이 함수를 호출해서 적을 생성하면 된다.

 

방식은 일정 시간 간격으로 생성되도록 할 것이다.

 

BP_MyGameMode의 Event Begin Play에서 Set Timer by Event를 호출하고 Custom Event인 EnemySpawnEvent를 만든다. EnemySpawnEvent는 SpawnEnemy를 호출하는 기능만 하며 Set Timer by Event의 Event 파라미터에 등록한다.

 

Time에 적을 생성할 주기를 정해주는데 일단 3초 간격으로 적이 생성되도록 한다.

 

그리고 3초마다 계속 생성되도록 Looping은 True로 체크해 준다.

 

Unreal Engine - BP_MyGameMode > EventGraph

 

여기까지 진행하고 테스트를 해보는데 적이 플레이어 주변 랜덤한 위치에 생성은 되지만 움직이지 않는다.

 

Auto Possess AI

BP_Enemy의 디테일 창으로 다시 돌아가서 Pawn 탭의 Auto Possess AI 옵션을 확인한다.

 

Unreal Engine - Auto Possess AI

 

해당 옵션은 기본 값으로 Placed in World로 되어있는데 이 옵션은 미리 맵에 생성된 액터에게만 해당하며 플레이 도중에 생성된 액터는 동작하지 않는다.

 

각 옵션의 사용법을 알아둔다.

 

Disabled

AI 컨트롤러가 캐릭터를 자동으로 제어하지 않는다. AI 컨트롤러를 수동으로 할당해한다.

 

Placed in World

맵에 배치된 AI 캐릭터가 게임 시작 시 AI 컨트롤러에 의해 자동으로 제어된다. 주로 에디터에서 맵에 직접 배치된 AI 캐릭터에 사용된다.

 

Spawned

게임 도중 스폰된 AI 캐릭터가 AI 컨트롤러에 의해 자동으로 제어된다. 런타임 중에 생성된 AI 캐릭터에 사용된다.

 

Placed in World or Spawned

맵에 배치된 AI 캐릭터와 게임 도중 스폰된 AI 캐릭터 모두 AI 컨트롤러에 의해 자동으로 제어된다. 모든 상황에서 AI 캐릭터를 자동으로 제어할 때 사용한다.

 

이 옵션을 적의 배치 방식에 맞는 Spawned로 설정한다.

 

이제 다시 플레이해 보면 여전히 동작하지 않는다.

 

NavMeshBoundsVolume

만들어놓은 지형에 AI가 돌아다닐 수 있는 범위를 정해주어야 한다.

 

해당 범위만큼 내비게이션의 길 찾기 연산에 포함되기 때문에 복잡하고 넓을수록 많은 연산을 차지하게 된다.

 

Place Actor에서 NavMeshBoundsVolume을 찾아서 레벨에 생성한다. 그리고 AI가 돌아다닐 수 있는 범위만큼 크기와 높이를 조절한다.

 

범위가 원하는 대로 지정됐는지 확인하려면 플레이하지 않고 뷰포트에서 키보드 'P'를 누르면 지정된 범위만큼 녹색으로 표시가 된다.

Unreal Engine - NavMeshBoundsVolume

 

이제 진짜로 테스트 플레이를 해본다.

 

Unreal Engine - Test Play

 

랜덤 한 위치에서 적이 생성되고 생성된 적은 플레이어를 추적하기 시작한다.

 

추적하는 동안 이동하는 애니메이션이 재생되고 목적지에 도착하면 일반 상태의 애니메이션이 재생된다.

 

플레이어가 이동하면 변경된 위치를 계속해서 따라가게 된다. 여기까지 원하는 대로 잘 동작하게 되었다.

 

 

728x90
반응형

+ Recent posts