그냥 게임개발자

두번째 - Hello World 본문

Unreal스터디/Unreal압축판

두번째 - Hello World

sudoju 2024. 3. 12. 00:32

저번 글을보고 이걸 들어왔다면 그래도 각오는 다지고 온거겠네요.

좋아요!

한 번 해봅시다!

 

 

Hello, World

오늘은 우리가 할 것은 기본적으로 C나 유니티나 언어를 처음 배울 때 썼던 "Hello, World"를 출력해볼거다.

 

너무 어려운 것들은 나중에 차근차근 설명할테니 두려워하지 말고 따라해보자.

 

언리얼 엔진 프로젝트를 생성하려고 하면

이런 창이 뜬다.

 

이 창은 프로젝트를 생성하는 창이다.

 

우리는 C++ 기준으로 생성할 것이기에

 

이와 같이 설정해준다 프로젝트 명은 맘에 드는 것으로 경로는 SSD나 M.2에 설치하는 것을 권장한다.

그냥 외장하드나 하드면 많이 느리다.

 

 

짜잔 언리얼 엔진이 켜졌네요~

확실히 유니티랑은 다른 느낌이랄까.. 일단 간지

 

언리얼 엔진이 가려져있는 콘텐츠 브라우저를 이동시켜요.

저는 이렇게 사용해요.

 

마우스 클릭 드래그 클릭 드래그 클릭 드래그 클릭

 

이렇게 쓴다.

 

음 자질구레한 건 넘어가도록 하고 본론으로 넘어가도록 하자.

 

일단 아래와 같이 따라해본다.

 

 

 

저는 이미 MyGameInstance를 생성했기 때문에 MyGameInstance가 이미 있다고 저렇게 빨간색 에러가 뜹니다.

 

사실 GameInstance 이름은 MyGameInstance보다 이름을 제대로 정하는게 나은데 저는 그냥 귀찮아서 기본으로

 

생성이 잘 되었으면

이 창과 같이 MyGameInstance라는 헤더 파일과 cpp파일이 생겼다.

 

사실 GameInstance라는 클래스는 매우 중요한 함수가 있다.

Init함수인데, 언리얼은 구동하면서 게임을 시작하기 전에 GameInstance라는 클래스를 만들고 GameInstance안에 Init함수를 호출한다.

 

즉 게임시작하기전 어떠한 행동을 초기화 해주는 것이다.

 

사실 언리얼 엔진에서는 우리가 원하는 기능들은 대부분 만들어져 있다.

그것을 우리는 상속을 받아서 사용하는 경우가 많고 직접 만들어서 사용하는 경우도 있다.

 

있는 것을 활용하자.

 

여기서 C++의 지식이 없다면 어려울 수 있다.

 

그래도 최대한 이해할 수 있게 써보려고 한다.

 

 

우리는 MyGameInstance.h 파일에서 Init함수를 재정의 해줄 것이다.

 

 

무슨 말이냐면 GameInstance에 Init함수는 이미 정의되어 있다.

이 함수를 우리는 커스텀 해서 쓸 수 있는 방법은 재정의를 활용해 할 수 있다.

 

화살을 내 마음대로 커스텀 할 수 있다라는 이야기인듯 ㅇㅇ

 

 

 

이것을 더블 클릭하고 F12로 들어가서 정의를 확인해보면 알 것인데

 

?

 

 

 

내가 말했잖아요. 이미 다 만들어져있어 언리얼 엔진이란 것은...

 

 

Init을 검색하면 나온다.

 

ENGINE_API? UFUNCTION?

이런 거 아직 몰라도 되요.

내가 겪어봤어요.

지금은 그냥 제가 알려주는 것만 알면 됩니다.

 

virtual 즉 가상함수로 정의가 되어있다.

 

이 함수는 설명에 주석으로 잘 설명이 되어있다.

 

 

음 모르겠어.

 

그냥 위에 쓴 것처럼 언리얼을 구동하면서 게임을 시작하기 전 초기화 해주는 함수이다.

 

MyGameInstance.h

UCLASS()
class SUDOJUPROJECT_API UMyGameInstance : public UGameInstance
{
	GENERATED_BODY()
	
public:

	virtual void Init() override;

};

헤더파일에 함수를 재정의 해준다.

 

이 함수를 우리는 정의해주어야 하기에 여기서 편하게 Alt + EnterCtrl + .(점) + .(점) 으로 cpp 파일에 작성할 수 있다.

 

 

저는 Alt + Enter를 더 많이 써요.

 

여기서 언리얼 엔진이 제공하는 부모 클래스(UGameInstance)를 우리가 상속 받아서 모든 가상 함수들은 오버라이드 해서 재구현하는 경우에는, 거의 대부분 언리얼이 미리 작업해둔 코드를 실행해줘야 한다.

 

Super라는 키워드를 사용해 부모의 함수를 실행시킨다.

 

유니티로 비유하자면 base.Init()함수를 사용하는 것과 같다.

 

Super = base

 

이것을 무시하면 어마어마한 상황이 나올수도 있으니 주의 바란다.

초기화하는 순간 어떤 문제가 발생할지 모르기 때문에, 항상 재정의해서 사용하는 함수는 부모함수를 호출해줘야 한다.

 

이제 유니티처럼 Debug.Log를 사용해 Hello,World를 출력하는 것처럼 언리얼 도 UE_LOG라는 매크로를 사용해 Hello, World를 출력하자.

 

매크로는 다음에 알아보자.

 

 

UE_LOG의 파라미터 값들을 확인해보면 뭐가 많다.

 

CategoryName, Verbosity, Format, __VA_ARGS__

 

설명하자면 이렇다

 

CategoryName

카테고리 같은 경우는 여러가지 로그를 다른 카테고리로 설정할 수 있다.

Verbosity

로그의 수준을 설정할 수 있다.
Log, Warning, Error

Format

로그 출력할 곳을 여기다가 넣는다.
기본 string으로 사용하는 것이 아닌 언리얼에서는 특수하게 TEXT라는 매크로를 사용하여 넣게 된다.

TEXT 매크로는 간단하게 설명하자면 크기는 2Byte 아시아의 국가들의 문자들이 알파벳과 다르게 많은 문자들이 있는 즉, 유니코드를 사용한다.

 

그렇다고 한다.

 

본격적으로 Hello, World를 출력해보자!!

 

MyGameInstance.cpp

void UMyGameInstance::Init()
{
	// 부모의 함수를 호출
	Super::Init();

	// CategoryName : 기본적으로 언리얼에서 제공하는 LogTemp
	// Verbosity : Log (Log, Warning, Error) 수준 설정
	// Format : TEXT("%s") 문자열 형태로 출력
	UE_LOG(LogTemp, Log, TEXT("%s"), TEXT("Hello, World"));
}

 

주석으로 간단하게 설명해보았다.

파라미터 끝 부분을 보면 TEXT("%s"), TEXT("Hello, World") 이렇게 파라미터를 두개를 이용해 사용하는데

출력할 포맷은 문자열이고 실제로 출력할 것은 TEXT("Hello, World")라는 소리다.

 

 

왜 이렇게 귀찮게 쓰는지 저도 몰라요.

언리얼이 그렇게 만들었어.

 

 

 

 

 

 

여기서 다 쓰면 이제 빌드를 해줘야 하는데 혹시 라이브 코딩이 켜져있으신 분들은 끄는것을 추천

라이브 코딩은 언리얼에서 편리하게 빌드하도록 만들어진 기능인데

저는 오히려 불편해요.

 

혹시 사용하고 싶으시면 사용하셔도 되는데 저는 사용 안할 거라서 하하..

 

끄는 법 알려드림

 

 

이제 빌드를 해보아요.

 

 

빌드 다 되면 삐리릭 소리 날 것이다.

 

 

 

여기서 또 하나 중요한 점은 우리가 GameInstance라는 클래스를 만들고 적용을 안했어요.

 

그래서 바로 실행해도 아마 Hello, World라는 로그는 뜨지 않을 거에요.

 

그러면 우리는 이 프로젝트에 적용되어있는 GameInstance를 우리가 만든 MyGameInstance로 바꾸어야 한다.

 

 

이제 실행해서 로그를 확인해보자.

 

 

로그가 너무 많다 지워주자.

 

 

그 다음 우리가 LogTemp라는 카테고리로 설정한 Log이기 때문에 보기 편하게 필터를 적용해주자.

 

 

 

이제 실행해보면