개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요! https://www.youtube.com/channel/UC9j37A2ACL9ooSbsT4mtGww/join

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 언리얼 엔진으로 탑다운 슈팅 게임 컨트롤 기능을 구현해봅시다.

 

리소스 - https://drive.google.com/file/d/1EUdtP7LeL5yfyRPmKG6WGiLCXBMVkmeC/view?usp=sharing

예제 - https://drive.google.com/file/d/1A9vkBRMp2YbmrA7HoGnAxWvRvZQfDG7H/view?usp=sharing

 

사용 엔진 버전 : 4.27

 

타임라인

0:00 인트로

0:11 프로젝트 생성과 맵 세팅

1:18 이동 입력 매핑과 Player Controller 생성

2:24 이동 기능 구현

3:24 캐릭터가 마우스 커서 바라보게 하기

4:40 캐릭터 구현

7:33 캐릭터 세팅

8:27 게임 모드 설정

9:41 아웃트로

 

[투네이션 후원]

https://toon.at/donate/637735212761460238

 

[디스코드 채널]

https://discord.gg/tqmRTy4pgk

 

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번에는 언리얼 엔진으로 탑다운 슈팅 게임의 컨트롤 방식을 구현하는 방법을 알아보도록 하겠습니다.

프로젝트 생성과 맵 세팅

먼저 프로젝트를 생성하겠습니다.

게임 카테고리에서 아무것도 포함되지 않은 기본 템플릿을 선택합니다.

그리고 프로젝트 세팅에서 C++프로젝트를 선택하고 시작용 콘텐츠를 없음으로 하여 프로젝트를 생성합니다.

프로젝트 생성이 완료되고 나면 먼저 영상 하단의 링크에서 리소스를 다운로드 받아서 압축을 해제합니다.

그리고 에디터의 콘텐츠 브라우저에 우클릭하고 [/Game에 임포트] 항목을 선택한 다음 방금 다운로드 받아서 압축해제한 파일을 찾아서 임포트해줍니다.

그 다음에는 레벨의 바닥이 되는 오브젝트의 면적을 늘려준 뒤 플레이어의 이동에 방해가 될 오브젝트들을 몇 개 배치해줍니다.

맵 세팅이 끝나고 나면 상단 메뉴 바에서 [파일 > 현재 레벨 저장] 항목을 선택하고 Maps 폴더를 만든 뒤 레벨의 이름을 정해서 저장해줍니다.

그 다음에는 프로젝트 세팅 창을 열고 맵 & 모드에서 에디터 시작 맵과 게임 기본 맵을 우리가 방금 만들어서 저장해준 맵으로 설정합니다.

이동 입력 매핑과 PlayerController 생성

그 다음에는 캐릭터 조작에 필요한 입력 매핑을 만들 차례입니다.

프로젝트 세팅 창에서 [엔진 > 입력] 항목을 찾아서 선택합니다.

그리고 MoveForward라는 이름으로 W와 S를 매핑하고 MoveRight라는 이름으로 A와 D를 매핑해줍니다.

입력 매핑이 끝나면 PlayerController를 이용해서 캐릭터 조작 기능을 구현할 차례입니다.

상단 메뉴 바에서 [파일 > 새로운 C++ 클래스] 항목을 선택해서 C++ 클래스 추가 창을 띄워줍니다.

그리고 PlayerController 클래스를 부모 클래스로 선택하고 TopdownPlayerController라는 이름으로 클래스를 생성합니다.

클래스 생성이 완료된 다음에는 TopdownPlayerController의 헤더 파일로 이동해서 생성자를 선언해줍니다.

생성자 선언을 작성하고 나면 소스 파일로 이동해서 생성자를 구현하고 bShowMouseCursor 프로퍼티를 true로 선언해서 게임 플레이 중에 마우스 커서가 보이도록 만들어줍니다.

이동 기능 구현

그 다음에는 다시 헤더 파일로 이동해서 캐릭터를 이동시키기 위한 MoveForward 함수와 MoveRight 함수를 생성하고 UFUNCTION 매크로를 붙여줍니다.

이렇게 함수 선언을 마친 다음에는 TopDownCharacter 클래스의 소스 파일로 이동해서 각 함수들을 구현해줍니다.

일인칭 슈터나 일반적인 삼인칭 슈터 게임이라면 캐릭터의 방향을 구해서 이동하도록 구현하겠지만, 지금 만드는 탑다운 방식의 삼인칭 슈터는 위에서 내려다보는 방식으로 카메라를 고정하고 진행되는 플레이 방식이므로 이 Move 함수들은 월드의 정면과 오른쪽을 구해서 캐릭터를 이동하도록 만들면 됩니다.

Move 계열 함수 선언과 구현을 마친 뒤에는 다시 헤더 파일로 이동해서 SetupInputComponent 함수를 override 선언해줍니다.

그리고 다시 소스 파일로 돌아가서 SetupInputComponent 함수를 구현하고 앞에서 구현한 MoveForward 함수와 MoveRight 함수를 각 입력 매핑과 바인딩시켜 줍니다.

캐릭터가 마우스 커서 바라보게 하기

캐릭터 이동 기능을 완성했으니 이제 캐릭터가 마우스 커서를 바라보게 하기 위한 LookMouseCursor 함수를 만들 차례입니다.

헤더 파일로 돌아가서 LookMouseCursor 함수를 선언합니다.

그리고 소스 파일로 이동하고 소스 파일 상단에 <Engine/Classes/Kismet/KismetMathLibrary.h>를 include 선언해줍니다.

그리고 LookMouseCursor 함수에서는 플레이어 컨트롤러가 소유한 폰이 앞에서 선언한 KismetMathLibrary에 들어있는 FindLookAtRotation 함수를 이용해서 마우스 커서 방향을 바라보도록 만들어줍니다.

함수 구현이 끝나면 헤더 파일로 돌아가서 LookMouseCursor 함수를 매 틱마다 호출해줄 PlayerTick 함수를 override 선언해줍니다.

그리고 소스 파일로 이동해서 PlayerTick 함수를 구현하고 LookMouseCursor 함수를 호출하도록 코드를 작성합니다.

코드 작성이 끝나면 작성한 코드를 저장하고 에디터로 돌아가서 컴파일 버튼을 눌러줍니다.

캐릭터 구현

캐릭터 컨트롤 구현을 마친 다음에는 캐릭터를 구현할 차례입니다.

상단 메뉴 바에서 [파일 > 새로운 C++ 클래스] 항목을 선택해서 C++ 클래스 추가 창을 띄워줍니다.

그리고 Character 클래스를 부모 클래스로 선택하고 TopDownCharacter라는 이름으로 클래스를 생성합니다.

클래스 생성이 완료되면 TopdownCharacter 클래스의 헤더 파일로 이동해서 UCameraComponent* 타입의 CameraComponent와 USpringArmComponent* 타입의 SpringArmComponent를 멤버 변수로 선언해줍니다.

이 변수들로 카메라의 위치를 탑다운 슈터 방식의 게임에 알맞은 위치로 맞춰주도록 하겠습니다.

변수 선언이 끝나면 소스 파일로 이동해서 소스 파일의 상단에 필요한 헤더들을 include 선언해줍니다.

선언할 헤더들은 다음과 같습니다.

<Engine/Classes/Components/CapsuleComponent.h>

<Engine/Classes/Camera/CameraComponent.h>

<Engine/Classes/GameFramework/CharacterMovementComponent.h>

<Engine/Classes/GameFramework/SpringArmComponent.h>

헤더 선언이 끝난 다음에는 생성자 함수로 가서 캐릭터에 필요한 것들을 차례대로 초기화해줍니다.

먼저 GetCapsuleComponent로 캐릭터의 콜라이더를 가져와서 크기를 설정해줍니다.

두 번째로는 bUseControllerRotation 프로퍼티의 각 요소들을 모두 false로 변경해서 캐릭터가 카메라의 회전을 따라서 회전하지 않도록 해줍니다.

세 번째로는 GetCharacterMovement로 캐릭터의 무브먼트를 가져오고 bOrientRotationMovement를 false로 변경해서 캐릭터의 이동 방향과 현재 캐릭터의 방향이 달라도 바로 이동하도록 만들어줍니다.

네 번째로는 SpringArmComponent를 생성해서 붙여주고 캐릭터와의 거리와 각도를 조절해줍니다.

여기서 bInheritPitch, bInheritRoll, bInheritYaw를 모두 false로 변경해서 스프링 암이 루트 컴포넌트와 상위 컴포넌트를 따라서 회전하지 않도록 해줍니다.

그리고 TargetArmLength로 캐릭터와 카메라 간의 거리를 조절하고 SetRelativeRotation으로 카메라가 캐릭터를 내려다보게 각도를 조절합니다.

그리고 bDoCollisionTest를 false로 변경해줍니다.

이 프로프티는 카메라가 벽에 닿으면 충돌 계산을 통해 카메라와 캐릭터의 거리를 좁혀 카메라가 벽을 뚫지 않게 만들어주는 프로퍼티이지만, 탑다운 슈터 게임에서는 사용되지 않아도 됩니다.

다섯 번째로 카메라를 생성해서 스프링 암 컴포넌트에 붙여줍니다.

그리고 마지막으로 bStartWithTickEnabled를 true로 변경해줍니다.

모든 코드 작업이 끝나면 저장하고 에디터로 이동해서 컴파일 버튼을 눌러줍니다.

캐릭터 세팅

컴파일이 완료되면 콘텐츠 브라우저 패널에서 Bluprints 폴더를 생성한 뒤, TopdownCharacter 클래스를 찾아서 우클릭하고 [TopdownCharacter 기반 블루프린트 클래스 생성]을 선택합니다.

그리고 Blueprints 폴더에 블루프린트 클래스를 생성해줍니다.

블루프린트가 생성되면, 생성된 블루프린트 클래스를 더블클릭해서 블루프린트 에디터를 열고 컴포넌트 패널에서 Mesh 컴포넌트를 선택합니다.

그리고 디테일 패널에서 Mesh 카테고리를 찾아 스켈레탈 메시에 앞에서 임포트한 박스맨으로 설정해줍니다.

스켈레탈 메시를 설정한 다음 블루프린트 에디터의 뷰포트 패널을 보면 캐릭터의 메시가 캡슐 콜라이도를 벗어나고 방향도 다르게 되어있습니다.

이를 일치시키기 위해서 메시 컴포넌트의 위치 Z 값을 -90.0으로 수정하고 회전 Z 값을 -90.0으로 수정합니다.

세팅이 모두 끝났다면 블루프린트 클래스를 컴파일하고 저장합니다.

게임 모드 설정

플레이어 컨트롤러와 캐릭터의 설정이 모두 끝났으니, 이제 게임이 우리가 만든 플레이어 컨트롤러와 캐릭터를 사용하도록 할 차례입니다.

콘텐츠 브라우저 패널에서 TopdownShooterGameModeBase 클래스를 찾아서 우클릭하고 [TopdownShooterGameModeBase 기반 블루프린트 클래스 생성] 항목을 선택합니다.

그리고 Blueprints 폴더 안에 게임 모드 블루프린트를 생성해줍니다.

게임 모드 블루프린트가 생성되면 더블클릭하여 블루프린트 에디터를 열고, 디테일 패널에서 Player Controller Class를 TopdownPlayerController로, Default Pawn Class를 BP_TopdownCharacter로 설정해줍니다.

그리고 블루프린트를 컴파일하고 저장한 뒤 블루프린트 에디터를 닫아줍니다.

이제 이 월드에서 방금 만든 게임 모드를 사용하기 위해서 레벨 에디터의 툴바에서 [세팅>월드 세팅]을 선택하고 월드 세팅 창을 열어줍니다.

월드 세팅 패널에서 게임 모드 오버라이드를 방금 만든 BP_TopdownShooterGameModeBase로 설정합니다.

모든 작업을 마친 다음에 플레이 버튼을 눌러서 PIE 모드로 들어가면 캐릭터가 마우스 클릭 지점을 바라보면서 회전하고 바라보는 방향과 관계없이 자유롭게 이동하는 탑다운 슈터 방식의 기본 컨트롤이 완성된 것을 확인할 수 있습니다.

아웃트로

이번 영상에서는 키보드로 캐릭터를 이동하고 캐릭터가 마우스 커서 방향을 바라보는 기본적인 탑다운 슈팅 방식의 조작 방법을 구현해 보았습니다.

이 강좌는 구독자 여러분들의 시청과 후원으로 제작되었습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

반응형

+ Recent posts