개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

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

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

 

리소스 - 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 아웃트로

스크립트

인트로

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

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

프로젝트 생성과 맵 세팅

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

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

그리고 프로젝트 세팅에서 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 모드로 들어가면 캐릭터가 마우스 클릭 지점을 바라보면서 회전하고 바라보는 방향과 관계없이 자유롭게 이동하는 탑다운 슈터 방식의 기본 컨트롤이 완성된 것을 확인할 수 있습니다.

아웃트로

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

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

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

 

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요!

 

베르의 게임 개발 유튜브

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다! 게임 개발에 도움이 되는 강좌들을 올리는 채널입니다! [투네이션 후원] https://toon.at/donate/637735212761460238 [유니티 어필리에이트

www.youtube.com

 

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

이번에는 전에 C++로 구현해보았던 마우스 클릭 이동 기능을 블루프린트로 만들어봅시다!

 

사용 엔진 버전 : 4.27

 

타임라인

0:00 인트로

0:11 프로젝트 생성과 리소스 임포트

0:47 맵 세팅

2:27 Player Controller로 마우스 입력 받기

4:50 클릭한 위치로 이동시키기

6:35 캐릭터 구현

9:41 게임 모드 설정과 테스트

10:43 아웃트로

스크립트

인트로

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

지난 강좌에서 C++로 구현했던 마우스 클릭을 이용한 캐릭터 이동 기능을 이번에는 블루프린트로 만들어 보겠습니다.

프로젝트 생성과 리소스 임포트

먼저 언리얼 엔진을 실행하고 새 프로젝트를 생성합니다.

이번에는 블루프린트로 기능을 만들 생각이므로 블루프린트 타입으로 프로젝트를 만듭니다.

프로젝트 생성이 완료된 이후에는 영상 하단의 링크에서 캐릭터 모델링과 애니메이션을 다운로드 받아서 압축을 풀어줍니다.

그리고 언리얼 에디터에서 콘텐츠 브라우저의 소스 패널을 열고 콘텐츠 폴더에 우클릭한 다음 [탐색기에서 표시] 항목을 선택해서 프로젝트의 폴더를 열어줍니다.

그 다음에는 방금 다운로드 받아서 압축 해제된 파일들을 이 폴더 안으로 옮겨줍니다.

맵 세팅

프로젝트 세팅이 끝난 다음에는 캐릭터가 움직일 맵을 구성해봅시다.

맵 세팅 작업에 들어가기 전에 맵에 배치할 기둥이나 벽을 대신할 간단한 박스 메시 하나를 영상 하단의 링크에서 다운로드 받은 뒤 압축을 해제합니다.

그리고 언리얼 에디터로 돌아가서 Props 폴더를 만든 뒤 빈 콘텐츠 브라우저 패널에 우클릭하고 [/Game/Props에 임포트]를 선택해서 다운로드 받은 Box.FBX 파일을 프로젝트에 임포트합니다.

그 다음 레벨을 살펴보면 빈 평면만 보입니다.

여기에 방금 임포트한 박스를 이용해서 캐릭터의 이동을 방해할 수 있게 적절하게 배치해줍니다.

이렇게 저처럼 배치해도 되고 여러분들이 원하는 대로 편하게 배치해도 됩니다.

장애물을 모두 배치한 다음에는 액터 배치 패널의 볼륨 탭에서 내비 메시 바운드 볼륨을 찾아서 레벨의 한가운데에 배치하고 맵의 오브젝트들을 전부 덮도록 만들어줍니다.

이 내비 메시 바운드 볼륨은 볼륨의 영역 안에 있는 오브젝트들을 찾아서 계산한 뒤에 이동 경로를 찾아줄 내비 메시를 만들어내는 역할을 합니다.

내비 메시 바운드 볼륨 설치를 마친 다음 단축키 [P]를 누르면 캐릭터가 이동할 수 있는 범위가 초록색으로 표시됩니다.

이렇게 맵 세팅을 마치면 콘텐츠 브라우저에서 Maps 폴더를 만들고 상단 메뉴 바에서 [파일 > 현재 레벨 저장] 항목을 선택해서 현재 레벨을 Maps 폴더 안에 ClickMoveTestMap이라는 이름으로 저장합니다.

맵을 저장한 뒤에는 프로젝트 세팅 창을 열고 [맵 & 모드]에서 에디터 시작 맵을 방금 저장한 ClickMoveTestMap으로 설정해줍니다.

이렇게 해주면 다음에 프로젝트를 열었을 때, 설정해준 맵이 제일 먼저 열리게 됩니다.

Player Controller로 마우스 입력 받기

이 다음 작업으로는 플레이어 컨트롤러로 클릭 입력을 받아서 컨트롤러가 소유한 폰을 클릭한 위치로 이동시키는 블루프린트를 작성하겠습니다.

코드를 작성하기 전에 프로젝트 세팅 창에서 입력을 선택하고 입력 매핑을 세팅해줍니다.

이번 영상에서는 클릭한 지점으로 캐릭터를 이동시키는 기능만 목표로 하여 만들 생각입니다.

그러므로 LeftClick이라는 이름으로 왼쪽 마우스 버튼만 액션 매핑에 추가해줍니다.

입력 세팅을 마쳤다면, 콘텐츠 브라우저 패널에 Blueprints라는 이름으로 폴더를 만든 뒤, 우클릭하고 블루프린트 클래스 항목을 선택합니다.

그러면 부모 클래스 선택 창이 뜨는데 여기서 PlayController 클래스를 부모 클래스로 선택해줍니다.

블루프린트 클래스의 이름은 BP_ClickMovePlayerController로 해주겠습니다.

클래스가 생성되고 나면, 블루프린트 에셋을 더블 클릭해서 블루프린트 에디터를 열어줍니다.

블루프린트 에디터가 열리고 나면 컴포넌트 패널에서 최상위 오브젝트를 선택하고 디테일 패널에서 [Show Mouse Cursor] 프로퍼티를 찾아야 합니다.

이 강좌에서 우리는 마우스로 캐릭터를 이동시킬 계획이기 때문에 마우스 커서를 보이게 만들기 위해 이 프로퍼티를 true로 변경합니다.

이 다음에는 내 블루프린트 탭의 변수 카테고리에 있는 [+] 버튼을 눌러서 변수를 추가하고 bool타입으로 설정한 다음 이름은 bClickLeftMouse로 정합니다.

이 변수는 왼쪽 마우스 버튼을 누를 때 true가 되고 뗄 떼 false로 값이 바뀌도록 동작하게 만들 예정입니다.

그 다음에는 함수 카테고리의 [+] 버튼을 눌러 InputLeftMouseButtonPressed 함수를 추가하고 이 함수에서는 bClickLeftMouse 변수의 값을 true로 변경하도록 블루프린트를 작성합니다.

그리고 이번에는 InputLeftMouseButtonReleased 함수를 추가하고 bClickLeftMouse의 값을 false로 변경하도록 작성해줍니다.

이 함수들은 입력 매핑과 바인딩 되어서 입력을 받으면 bClickLeftMouse 변수의 값을 바꿔주게 될 겁니다.

그 다음은 이벤트그래프로 이동해서 빈 그래프 영역에 우클릭하고 앞에서 만든 LeftClick 입력에 대한 이벤트를 검색해서 추가해줍니다.

그리고 Pressed 진행 핀에 앞에서 만든 InputLeftMouseButtonPressed 함수를 연결해주고 Released 진행 핀에는 InputLeftMouseButtonReleased 함수를 연결해줍니다.

이제 왼쪽 마우스 버튼을 누를 때 InputLeftMouseButtonPressed 함수가 호출되서 bClickLeftMouse 변수가 true가 되고, 왼쪽 마우스 버튼을 떼면 InputLeftMouseButtonReleased 함수가 호출되서 bClickLeftMouse 변수가 false가 되도록 세팅되었습니다.

클릭한 위치로 이동시키기

이 다음 작업으로는 마우스를 클릭하면 클릭한 위치로 캐릭터를 이동시키는 블루프린트를 작성할 차례입니다.

먼저 함수 카테고리의 [+] 버튼을 눌러서 SetNewDestination 함수를 추가합니다.

이 함수는 새로운 목표 위치를 받아서 컨트롤러가 소유한 폰을 그 위치로 이동시키는 역할을 하도록 만들겠습니다.

이 함수는 매개변수로 목적지로 지정할 위치를 받아야하기 때문에 디테일 패널의 입력 카테고리의 [+] 버튼을 눌러서 입력 매개변수를 만들고 Vector 타입으로 지정한 다음 이름을 NewDestination으로 변경해줍니다.

이 함수에서는 먼저 GetPawn 함수를 이용해서 컨트롤러가 소유하고 있는 폰을 가져오고 폰과 목적지 사이의 거리를 측정해서 그 거리가 120 언리얼 유닛보다 큰 지 검사합니다.

그리고 이 결과값이 true라면 SimpleMoveToLocation 함수를 사용해서 새로운 목적지로 이동하도록 만들어줍니다.

이 SimpleMoveToLocation 함수는 프로그래머가 목적지로 폰을 이동시키기 위한 코드를 일일이 작성하는 대신에 간단한 함수 호출로 그 모든 일을 할 수 있도록 도와줍니다.

그 다음에는 함수 카테고리의 [+] 버튼을 눌러서 MoveToMouseCursor 함수를 추가합니다.

이 함수에서는 PlayerController를 이용해서 찾은 Get Hit Result Under Cursor by Channel 함수로 마우스 커서 아래에 레이 트레이스를 쏴서 그 위치를 SetNewDestination 함수에 전달하는 역할을 합니다.

이제 MoveToMouseCursor 함수를 실시간으로 호출하기 위해서 이벤트그래프로 돌아가서 Tick 이벤트에 bClickLeftMouse 변수의 상태에 따라서 MoveToMouseCursor 함수를 호출하도록 블루프린트를 작성합니다.

컨트롤러 블루프린트 작성이 끝나면 컴파일 버튼을 누르고 블루프린트를 저장해줍니다.

캐릭터 구현

캐릭터가 움직일 맵과 캐릭터를 컨트롤할 플레이어 컨트롤러를 모두 만들었으니 이제 맵 위에서 움직일 캐릭터를 만들 차례입니다.

콘텐츠 브라우저 패널에 우클릭하고 블루프린트 클래스 항목을 선택합니다.

그리고 부모 클래스로는 Character 클래스를 선택하고 클래스의 이름은 BP_ClickMoveCharacter로 정해줍니다.

클래스 생성이 완료되고 나면 블루프린트 에셋을 더블 클릭해서 블루프린트 에디터를 엽니다.

블루프린트 에디터가 열리고 나면 먼저 컴포넌트 패널에서 Capsule Component를 선택하고 캡슐의 높이와 지름을 수정해줍니다. (96 42)

그리고 제일 상위 오브젝트를 선택하고 폰 카테고리에서 Use Controller Rotation Yaw를 false로 설정해서 캐릭터가 카메라의 회전을 따라서 회전하지 않도록 해줍니다.

그 다음에는 Character Movement 컴포넌트를 선택하고 캐릭터 무브먼트(회전 세팅) 카테고리에서 Orient Rotation to Movement를 체크하고 RotationRate를 (0, 0, 640)으로 변경해서 캐릭터를 이동시키기 전에 이동 방향과 현재 캐릭터가 바라보는 방향이 다르면 캐릭터를 이동 방향으로 초당 640도의 회전 속도로 회전시키도록 만들어줍니다.

플레이너 무브먼트 카테고리에서 Constrain To Plane을 true로 변경해서 캐릭터의 이동을 평면으로 제한하고, Snap To Plane At Start를 true로 변경해서 시작할 때 캐릭터의 위치가 평면을 벗어난 상태라면 가까운 평면으로 붙여서 시작되도록 만들어줍니다.

그 다음으로는 컴포넌트 패널에서 Capsule Component를 선택하고 컴포넌트 추가 버튼을 누른 뒤 스프링 암을 검색해서 Capsule Component 아래에 추가해줍니다.

그리고 카메라 세팅 카테고리에서 Inherit Pitch, Inherit Yaw, Inherit Roll을 체크 해제해줍니다.

이 프로퍼티를 해제함으로써 스프링 암의 회전이 루트 컴포넌트와 상위 컴포넌트를 따르지 않고 월드 좌표계의 회전을 따르도록 해줍니다.

그리고 TargetArmLength를 800으로 설정해서 카메라와 캐릭터의 거리를 띄워주고 트랜스폼의 회전 값을 수정해서 스프링 암을 회전시켜 위에서 캐릭터를 내려다보도록 설정합니다.

그리고 Do Collision Test 프로퍼티는 카메라가 벽에 닿으면 충돌 계산을 통해 카메라와 캐릭터의 거리를 좁혀 카메라가 벽을 뚫지 않게 만들어주는 프로퍼티지만, RPG 게임처럼 위에서 내려다보는 시점에는 사용하지 않기 때문에 false로 설정합니다.

그 다음에는 스프링 암 컴포넌트 아래에 카메라 컴포넌트를 생성하고 Use Pawn Control Rotation을 false로 변경해서 카메라의 회전이 폰의 회전에 영향을 주지 않도록 설정합니다.

이제 캐릭터의 모델을 추가할 차례입니다.

컴포넌트 패널에서 Mesh 컴포넌트를 선택합니다.

그리고 디테일 패널의 메시 섹션에서 Skeletal Mesh를 SK_Mannequin으로 설정하고 애니메이션 섹션에서 Anim Class를 ThirdPerson_AnimBP로 설정해줍니다.

이 작업을 끝내고 나서 블루프린트 에디터의 뷰포트 패널을 보면 캐릭터의 메시가 캡슐 콜라이더를 벗어나고 캐릭터의 방향 역시 캡슐 콜라이더에 표시된 화살표와 다른 방향을 바라보고 있는 것을 알 수 있습니다.

위치와 방향을 맞춰주기 위해서 메시 컴포넌트의 위치를 {0, 0, -90}으로 수정하고, 회전을 {0, 0, -90}으로 수정해줍니다.

작업이 끝나면 블루프린트를 컴파일하고 저장한 뒤 블루프린트 에디터를 닫아줍니다.

게임 모드 설정

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

콘텐츠 브라우저 패널에서 우클릭한 뒤 블루프린트 클래스 선택하고 부모 클래스로 GameModeBase를 선택해서 블루프린트 클래스를 생성해줍니다.

게임 모드 블루프린트가 생성되면 더블클릭해서 블루프린트 에디터를 열고 디테일 패널에서 Player Controller Class와 Default Pawn Class를 우리가 만든 것으로 교체해줍니다.

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

그 다음에는 툴바에서 [세팅 > 월드 세팅] 항목을 선택해서 월드 세팅 패널을 엽니다.

월드 세팅에서는 게임 모드 오버라이드를 방금 만든 게임 모드 블루프린트로 변경합니다.

모든 과정을 마친 뒤 플레이 버튼을 눌러서 PIE 모드로 들어가면 캐릭터가 마우스 클릭 지점으로 이동하고, 그 과정에서 적절하게 장애물을 회피하는 모습을 볼 수 있습니다.

아웃트로

이번에는 지난 강좌 중 하나에서 C++로 구현했던 마우스 클릭 이동 방식을 블루프린트로 구현해보았습니다.

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

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

 

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

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

이번 영상에서는 언리얼 엔진의 뷰포트에 바로 로그를 띄우는 방법을 알아봅시다.

 

사용 엔진 버전 : 4.26

 

타임라인

0:00 인트로

0:35 블루프린트에서 뷰포트에 로그 출력하기

2:22 C++ 클래스에 뷰포트에 로그 출력하기

3:35 블루프린트 로그 기능을 C++ 클래스에서 사용하기

4:49 아웃트로

 

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

4.26 버전이 업데이트 되면서 안보이는 새 C++ 클래스 생성 기능을 찾아봅시다!

 

사용 엔진 버전 : 4.26

 

타임라인

0:00 인트로

0:24 4.25 버전 이전의 C++ 클래스 생성

0:37 4.26 버전 이후의 C++ 클래스 생성

2:02 아웃트로

 

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

언리얼 C++ 클래스에서 함수를 만드는 방법과 UFUNCTION 매크로에 대해서 알아봅시다.

 

타임라인

0:00 개요

0:10 함수란?

2:18 새 프로젝트 생성

2:26 C++ 클래스 생성과 프로퍼티 선언

3:17 C++ 함수 만들기

7:19 C++ 함수 블루프린트에서 호출하기

10:16 블루프린트에서 구현한 기능을 C++에서 호출하기 1

11:58 블루프린트에서 구현한 기능을 C++에서 호출하기 2

13:55 블루프린트에서 구현한 기능을 C++에서 호출하기 3

14:53 마무리

 

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

언리얼 C++ 클래스에서 변수를 만드는 방법과 UPROPERTY 매크로에 대해서 알아봅시다.

 

타임라인

0:00 개요

0:50 새 프로젝트 생성/C++ 클래스 생성

1:21 기본 변수 선언 방법

2:18 언리얼 프로그래밍의 기본 변수 타입

7:40 접근지정자를 이용한 변수 공개 범위 설정

9:10 UPROPERTY를 이용해서 변수를 언리얼 에디터 디테일 패널에 공개하기

12:27 생성자에서 변수의 기본 값 설정하기

 

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

언리얼 엔진 4 프로그래밍에 입문해봅시다! 그리고 언리얼 C++ 클래스를 생성하는 방법과 클래스를 처음 생성했을 때 볼 수 있는 생성자와 BeginPlay, Tick과 같은 이벤트 함수에 대해서 알아봅시다.

 

타임라인

0:00 개요

0:09 언리얼 엔진 4 강좌를 만드는 이유

1:59 C++ 클래스와 블루프린트 클래스

3:03 새 프로젝트 만들기

4:02 C++ 클래스 생성하기

4:46 새로 생성한 C++ 클래스의 기본 형태

6:59 언리얼 C++ 클래스의 생성자, BeginPlay, Tick의 실행 테스트

8:40 마무리

 

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

C++ 코드 생성자에서 콘텐츠 브라우저의 클래스와 리소스 불러오기

 

작성 기준 버전 :: 4.21.1

 

게임을 제작하는 과정에서 객체를 초기화할 때, 프로젝트에 포함된 다른 클래스나 오브젝트, 리소스를 가져와야하는 경우가 종종 생긴다.

 

 

그런 경우 블루프린트의 이벤트 그래프에서 작업하는 경우라면 위의 이미지와 같이 콘텐츠 브라우저에 있는 리소스나 블루프린트 클래스 등을 곧바로 선택할 수 있지만, C++ 코드에서는 직접 경로를 지정해서 코드를 작성해야 한다.

 

단, C++ 코드에서 직접 경로를 지정해서 리소스나 블루프린트 클래스를 가져올 때, 주의할 점은 리소스나 블루프린트 클래스의 경로나 파일명이 자주 바뀌는 상황을 피하는 게 좋다. 경로를 지정한 이후에 경로가 바뀌지 않을 것이 확실하다면 C++ 코드로 경로를 지정해서 가져오는게 낫겠지만 자주 바뀌는 상황이라면 바뀐 리소스를 불러오는 모든 코드를 일일이 찾아서 수정하고 컴파일하는 문제가 발생한다.

 

그렇기 때문에, 경로나 리소스의 파일명이 자주 바뀔 상황이라면 위의 이미지처럼 블루프린트를 이용해서 초기화를 진행하거나, 별도의 기능을 만들어서 일일이 경로를 지정하고 바꾸는 작업을 자동화시키는 것이 좋다.

 

우선 C++ 코드에서 콘텐츠 브라우저의 리소스나 블루프린트 클래스를 가져오기 위해서는 다음의 헤더를 전처리기로 포함시켜주어야 한다.

 

#include "UObject/ConstructorHelpers.h"

 

ConstructorHelpers는 생성자에 도움을 주는 클래스로 생성자에서 콘텐츠 브라우저의 리소스나 블루프린트 클래스를 불러오는 작업을 도와주는 기능들을 가지고 있다. ConstructorHelpers는 생성자에서 사용되는 기능이기 때문에 생성자 이외의 장소에서 ConstructorHelpers를 사용하려고 시도하면 컴파일 에러가 발생하게 된다.

 

 

C++ 코드에서 블루프린트 클래스 가져오기

 

콘텐츠 브라우저 패널에 Blueprints 폴더 안에 TestBlueprintClass라는 이름의 APawn 클래스를 상속받은 블루프린트 클래스가 있다고 가정할 때, 그것을 C++ 코드에 가져오기 위해서는 다음 예시와 같이 코드를 작성하면 된다.

 

static ConstructorHelpers::FClassFinder<APawn> BPClass(TEXT("/Game/Blueprints/TestBlueprintClass"));
if (BPClass.Succeeded() && BPClass.Class != NULL)
{
    // 가져온 BPClass.Class를 통한 작업
}

 

FString 경로를 통해서 불러오는 것이니 만큼, 오타나 변경된 경로나 파일명으로 인해서, 클래스가 제대로 불러와지지 않는 경우가 발생할 수 있기 때문에, Succeeded() 함수와 Class의 NULL 체크를 통해서 성공적으로 클래스가 불러와졌는지 체크하고 사용해야 한다.

 

클래스 탐색자(Class Finder)는 성공적으로 블루프린트 클래스를 가져온 경우, Class 멤버 변수 안에 TSubclassOf<T> 타입으로 해당 클래스를 가지고 있게 된다. 이것을 이용해서 필요한 작업을 진행하면 된다.

 

 

C++ 코드에서 리소스 가져오기

 

이번에 알아볼 것은 C++ 코드에서 콘텐츠 브라우저 패널의 리소스를 가져오는 과정이다. 리소스의 종류는 여러가지가 될 수 있는데 대표적인 것으로는 스태틱 메시나 텍스처를 예로 들 수 있다.

 

아래의 예시코드는 드롭된 아이템의 메시가 아이템의 종류에 따라서 달라진다는 가정하에 만들어졌다. 콘텐츠 브라우저의 Item/StaticMesh 폴더 안에 SM_Helmet 이라는 이름을 가진 헬멧 모양의 스태틱 메시가 있을 때, FObjectFinder를 통해서 가져올 수 있다.

 

DropItemStaticMeshComponent = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("DropItemMesh"));
RootComponent = DropItemStaticMeshComponent;

 

static ConstructorHelpers::FObjectFinder<UStaticMesh> HelmetStaticMesh(TEXT("/Game/Item/StaticMesh/SM_Helmet"));
if (HelmetStaticMesh.Succeeded() && HelmetStaticMesh.Object != nullptr)
{
    DropItemStaticMeshComponent->SetStaticMesh(HelmetStaticMesh.Object);
}

 

FObjectFinder를 통해서 가져온 오브젝트 역시 Succeeded() 함수와 Object 변수의 null 체크를 통해서 리소스가 제대로 불러와졌는지 체크를 한 뒤 사용해야 한다.

 

 

 

 

 

C++ 코드에서 C++ 클래스 가져오기

 

C++ 코드에서 블루프린트 클래스가 아닌 직접 작성한 C++ 클래스를 가져와서 사용하고 싶을 수도 있다. 예를 들어 게임 모드 클래스에서 기본 폰이나 기본 플레이어 컨트롤러를 설정하려고 할 때, C++로 작성한 폰 클래스나 플레이어 컨트롤러 클래스를 기반으로 블루프린트 클래스를 생성해서 넣어주는게 아니라 C++ 클래스를 곧바로 코드에서 넣어주고자 한다면 다음 예시 코드와 같이 작성하면 된다.

 

AYourProjectGameMode::AYourProjectGameMode()
{
    PlayerControllerClass = AYourCustomPlayerController::StaticClass();
}

 

StaticClass() 함수를 이용하면 런타임 중에 해당 클래스를 나타내는 UClass를 얻어낼 수 있다.

 

[투네이션]

 

-

 

toon.at

[Patreon]

 

WER's GAME DEVELOP CHANNEL님이 Game making class videos 창작 중 | Patreon

WER's GAME DEVELOP CHANNEL의 후원자가 되어보세요. 아티스트와 크리에이터를 위한 세계 최대의 멤버십 플랫폼에서 멤버십 전용 콘텐츠와 체험을 즐길 수 있습니다.

www.patreon.com

[디스코드 채널]

 

Join the 베르의 게임 개발 채널 Discord Server!

Check out the 베르의 게임 개발 채널 community on Discord - hang out with 399 other members and enjoy free voice and text chat.

discord.com

 

반응형

+ Recent posts