Make Unreal REAL.
article thumbnail
이득우의 언리얼 C++ 게임 개발의 정석

 

C++ 코드가 있는 폴더에서 Public 폴더를 생성 후 모든 헤더 파일을 옮긴다.

 

 

Private 폴더를 생성 후 모든 소스 코드 파일을 옮긴다.

 

 

C++ 코드가 있던 폴더에는 {프로젝트명}.Build.cs 파일만 남게 된다.

 

 

VS 파일을 재생성해 준다.

 

 

솔루션을 열면 구조가 변경된 것을 확인할 수 있다.

 

컴파일 후 언리얼 에디터를 켜면 이 곳에서도 구조가 변경된 것을 볼 수 있다.

  • Public 폴더만 보이는 이유는 Private 폴더에는 헤더 파일이 없기 때문이다.
  • 언리얼 에디터는 헤더 파일을 기준으로 C++ 클래스를 표시한다.

 

 

Public, Private 폴더를 나눈 후부터는 새로운 C++ 클래스를 생성할 때 언리얼 에디터가 알아서 두 폴더에 헤더 파일과 소스 코드 파일을 생성한다.

 

언리얼 엔진은 다음 폴더를 알아서 헤더 경로에 포함시킨다.

  • Source/{프로젝트명}
  • Source/{프로젝트명}/Public
  • Source/{프로젝트명}/Private
  • Source/{프로젝트명}/Classes (Deprecated)

 

 

언리얼 엔진은 프로젝트명으로 된 주 게임 모듈(Primary Game Module)을 사용해 게임 프로젝트의 로직을 관리한다.

  • 현재는 ArenaBattle이 주 게임 모듈로 설정되어 있다.

 

언리얼 에디터는 C++ 프로젝트 생성 시 주 게임 모듈을 자동으로 생성해주지만, 추가 모듈 생성은 수동으로 직접 해야한다.

 

모듈은 다음의 필수 파일을 포함해야 한다.

{모듈명} 폴더
    ㄴ {모듈명}.Build.cs
    ㄴ {모듈명}.cpp

 

보통은 다음의 구조를 갖는다.

{모듈명} 폴더
    ㄴ Public 폴더
        ㄴ {모듈명}.h
    ㄴ Private 폴더
        ㄴ {모듈명}.cpp
    ㄴ {모듈명}.Build.cs

 

 

{모듈명}.h

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

 

{모듈명}.cpp

// Fill out your copyright notice in the Description page of Project Settings.

#include "{모듈명}.h"
#include "Modules/ModuleManager.h"

IMPLEMENT_MODULE( FDefaultModuleImpl, ArenaBattleSetting );

 

{모듈명}.Build.cs

// Fill out your copyright notice in the Description page of Project Settings.

using UnrealBuildTool;

public class {모듈명} : ModuleRules
{
    public {모듈명}(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

        PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine" });

        PrivateDependencyModuleNames.AddRange(new string[] {  });

        // Uncomment if you are using Slate UI
        // PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore" });
		
        // Uncomment if you are using online features
        // PrivateDependencyModuleNames.Add("OnlineSubsystem");

        // To include OnlineSubsystemSteam, add it to the plugins section in your uproject file with the Enabled attribute set to true
    }
}

 

이는 주 게임 모듈도 마찬가지다.

 

 

예제 폴더의 Resources > Chapter13 > ArenaBattleSetting 폴더를 복사해 프로젝트의 Source 폴더에 붙여넣는다.

 

 

새로운 모듈을 추가했으니 새로운 로그 카테고리와 디버깅용 매크로를 정의해준다.

 

 

모듈을 추가하고 나서는 VS 파일들을 재생성해 줘야 한다.

 

 

솔루션을 열면 새로운 모듈이 추가된 것을 확인할 수 있다.

 

 

프로젝트가 이 모듈을 빌드하도록 Target.cs 파일들을 수정해줘야 한다.

  • {프로젝트명}.Target.cs는 게임 빌드 설정이다.
  • {프로젝트명}Editor.Target.cs는 에디터 빌드 설정이다.

 

 

이제 F7 키를 눌러 빌드하면 Binaries\Win64 폴더에 새로운 모듈도 함께 빌드된다.

 

 

이제 언리얼 에디터가 이 DLL 모듈을 로딩하도록 하기만 하면 된다.

 

uproject 파일을 열어 새로운 모듈을 로딩하도록 추가한다.

  • Loading Phase를 PreDefault로 설정하면 Default 모듈보다 먼저 로딩된다.
  • 주 게임 모듈인 ArenaBattle 모듈이 ArenaBattleSetting 모듈에 의존성을 가지도록 한다.
  • 이렇게 설정하면 ArenaBattleSetting 모듈은 항상 ArenaBattle 모듈보다 먼저 언리얼 에디터 프로세스에 올라간다.

 

 

그런데 에디터를 실행시키면 ArenaBattleSetting 모듈이 보이지 않는다.

  • 이는 실제로 모듈이 로딩되기는 했지만, 단지 모듈 파일 이외에 언리얼 오브젝트가 하나도 없기 때문에 보이지 않을 뿐이다.

 

 

ABCharacterSetting이라는 언리얼 오브젝트를 ArenaBattleSetting 모듈에 추가해준다.

 

 

이미 ArenaBattleSetting 모듈에서 Public, Private 폴더를 나눠 놓았으므로 알아서 두 폴더에 생성해준다.

  • 만약 ArenaBattleSetting 모듈에 오브젝트 추가 후 VS 프로젝트가 꼬이는 문제가 발생하면, 에디터를 종료하고 VS 파일들을 재생성해 준다.

 

 

언리얼 오브젝트를 추가하면 에디터에 모듈이 표시된다.

  • C++ 클래스에 마우스를 올리면 어느 모듈에 포함되어 있는지 확인할 수 있다.

 

profile

Make Unreal REAL.

@diesuki4

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그