[C++] 프로젝트 생성 / 클래스 추가 및 삭제 / Root Component 추가
지금까지 언리얼엔진 블루프린트를 사용했고, 이번에는 C++로 사용해볼 것이다.
Tip!!
* 언리얼 프로젝트 압축할 때, Config, Content, Source, UE4 실행파일 4가지만 압축하면 된다.
언리얼 C++ 프로젝트 살펴보기
먼저 새 프로젝트 생성한다. 지난번과 다른 점은 C++ 프로젝트로 생성하는 것이다.
* 프로젝트 경로 생성 시, 한글이 포함되지 않도록 주의하는 것이 좋다.
※ 프로젝트 생성 오류 발생
만약 프로젝트 생성 시 아래와 같이 오류 발생 메세지가 뜨면서 .NET Framework SDK 설치를 하라고 한다면
dotnet.microsoft 페이지로 가서 .Net Framework에서 4.6.0 이상의 버전 아무거나 설치해주면 된다.
Visual Studio 버전 설정하기
이어서 프로젝트가 생성됬다면 VisualStudio와 언리얼 에디터 2개가 같이 실행된 것을 볼 수 있다.
만약 프로젝트 실행 시, 실행되는 VS(VisualStudio)의 버전을 바꿔주고 싶다면 언리얼 에디터 편집 - 에디터 개인설정 -
일반 / 소스 코드 탭에서 소스 코드 에디터를 원하는 VS 버전으로 선택하고 재시작해주면 된다.
언리얼 에디터에서 VS를 열고싶다면, 파일 - Visual Studio 2019 열기 탭을 통해서 열 수 있다.
* 만약 이미 만들어진 VS 프로젝트의 버전을 바꿔주고 싶다면, 솔루편 파일을 원하는 VS버전 연결프로그램으로 실행한다.
그 후, 프로젝트(UE4, GPC_CPP_12) 우클릭 - 프로젝트 대상 변경 - 확인을 눌러주면 된다.
VS의 솔루션 탐색기를 보면, UE4와 GPC_CPP_12 프로젝트 두 개가 만들어져 있는 것을 볼 수 있다.
UE4 프로젝트는 언리얼 엔진 자체가 들어가있다.
우리는 Games 폴더 안의 GPC_CPP_12(생성한 프로젝트 이름)에서 코드를 작성하며 사용하게 될 곳이다.
언리얼 에디터에서 C++ 클래스 만들기
언리얼 에디터에서 필터를 보면 C++ 클래스 폴더 안에 GPC_CPP_12 클래스가 생성되어 있는 것을 볼 수 있다.
* 만약 필터에 폴더가 안보이면 뷰 옵션에서 C++ 클래스 표시를 체크하면 된다.
해당 경로의 폴더에 새로운 클래스를 하나 만들어보자.
우클릭 - 새 C++ 클래스를 선택하면 부모 클래스 선택 화면이 뜬다.
여기서 Actor 선택 후, Cube라는 이름으로 클래스를 하나 추가했다.
언리얼 에디터에서 생성되고 나면, VS에서 자동으로 파일 수정 감지가 뜨는데, 다시 로드를 해주면 Source에 Cube.h / Cube.cpp가 추가된 것을 볼 수 있다.
언리얼 에디터에서 클래스를 생성해주는 이유는, VS에서 클래스를 만들 때와 다르게 자동으로 코드가 입력되어 있기 때문이다.
VS에서 클래스 코드 살펴보기
만들어진 Cube.h 파일을 보면 자동완성으로 코드가 적혀있는 것을 볼 수 있다.
Class 안에는 ACube(), BeginPlay(), Tick()이 기본으로 있다.
- ACube() 생성자 : 이 actor의 속성들에 대해서 기본값을 설정
- BeginPlay() : 게임이 시작되거나 대상이 spawn 시, 호출
- Tick() : 매 프레임마다 호출
코드 맨 윗줄에 있는 // Fill out your copyright notice in the Description page of Project Settings. 주석은, 새 클래스를 만들 때마다 자동으로 자적권 고지가 입력되는 것이다.
이는 언리얼 에디터에서 프로젝트 세팅 - 프로젝트 / 설명 - 법률 / 저작권 고지에 입력된 내용이다.
- CoreMinimal.h : 최소한의 코어들이 들어있는 내용이다. 항상 헤더파일에 포함하는 것이 권장됨
- GameFramework/Actor.h : Actor를 상속받아 만든 클래스이므로 Actor.h를 포함
- Cube.generated.h : 언리얼에서 자동으로 완성시켜준 코드
우리가 클래스 이름을 Cube라고 했지만 VS에서 보면 ACube처럼 접두어가 붙어있는 것을 볼 수 있다.
이는 언리얼에서 사용하는 접두어들 중 하나이다.
- F : 구조체, 델리게이트 등등
- U : Object를 상속받은 형식
- A : Actor를 상속받은 형식(똑같이 Object 상속이긴 하지만 Actor부터는 따로 A라고 표기함)
- T : Template(템플릿)
언리얼 에디터에서 생성한 클래스 삭제 및 수정하기
언리얼 에디터에서 클래스를 생성 후, 삭제 및 수정이 되지 않는 것을 볼 수 있다.
그래서 VS에서 먼저 지워줄 것이다.
1. VS의 솔루션 탐색기에서 지우고자 하는 클래스를 지움
2. 실제 디렉터리 경로에 가서 남아있는 클래스를 지움
이제 프로젝트를 한번 빌드를 해주어야 언리얼 에디터에 삭제된 내용이 반영이 된다.
두가지의 프로젝트 빌드 방법이 있다. (만약 빌드해도 삭제한 내용이 반영이 안됬다면 프로젝트 재부팅하기)
1. VS에서 Ctrl + B / Ctrl + Shift + B를 통해 빌드(빌드 중단을 원하면 Ctrl + Break)
2. 언리얼 에디터에서 컴파일(큐브모양) 누르기
이번에는 클래스 이름을 바꿔볼 것이다.
먼저 GPC_CPP_12GameModeBase.h로 와서 AGPC_CPP_12GameModeBase 클래스 이름을 AGPCGameModeBase로 줄여준다.
그리고 위의 #include "GPC_CPP_12GameModeBase.generated.h" 부분도 #include "GPCGameModeBase.generated.h"
으로 같이 수정해주었다.
마찬가지로 GPC_CPP_12GameModeBase.cpp로 넘어와 #include 헤더파일의 이름을 똑같이 바꿔준다.
그리고 솔루션 탐색기에서 GPC_CPP_12GameModeBase 헤더와 CPP 파일의 이름도 GPCGameModeBase으로 바꿨다.
그 후 VS 또는 언리얼 에디터에서 빌드해주면 GPCGameModeBase 클래스로 바뀐 것을 볼 수 있다.
* 그 전에 있던 클래스 파일이 남아있다면 다시 에디터 재시작 해주면 됨
클래스 다뤄보기
원래 블루프린트에서 Actor를 만든다면 기본으로 DefaultSceenRoot 컴포넌트를 가지고 있는 것을 볼 수 있다.
이는 Actor가 Transform, Scale, Rotation을 Root 컴포넌트가 가지고 있어야 하기 때문이다.
하지만 C++ 클래스로 생성한 Actor를 레벨로 올려보면 SceenRoot가 존재하지 않아 볼 수가 없다.
따라서 VS에서 따로 추가해주어야만 한다.
ACube 클래스 안에 StaticMesh 컴포넌트를 추가해줄 것이다.
UStaticMeshComponent* Mesh;를 추가해준다.
대부분 다 앞에 U 접두어를 붙여주면 되고, *를 통해 포인터로 만들어주어야 한다.
이후 빌드하여도 아직 컴포넌트가 만들어지지 않는다. 아직 주소를 주지 않았기 때문이다.
따라서 ACube() 생성자에서 Mesh에 UStaticMeshComponent를 넣어준다. 이어서 빌드를 해주면 된다.
이제 언리얼 에디터에서 Cube를 보면 Cube라는 Static Mesh Component가 만들어진 것을 볼 수 있다.