UE4 모듈 추가 절차에 대한 메모 쓰기
15809 단어 위 4UnrealEngine4C#
개요
UnrealEngine 모듈 추가에 대한 메모 쓰기입니다.
편집기 모듈의 추가 단계를 기록하고 있습니다.
업데이트 내역
날짜
내용
2020/09/14
플러그인에 대해 추가.
2020/10/13
모듈의 외부 참조에 대한 비고 추가.
환경
Windows10
Visual Studio 2017
UnrealEngine 4.22
참고
다음을 참고로 해 주셔서 감사합니다.
모듈 정보
【UE4】 모듈 추가
htps : // 코 m / 카누라 포이 소 / ms / 에 4b551 아 1f22b85162c70
htps : // 이 m / go _ st r / ms / 5d001 a 9c에서 182488f9f3
모듈 추가 절차
파일 추가 및 설정 파일 재작성이 필요합니다.
모듈 소스 작성
모듈명을 정해 폴더를 작성해, 그것을 프로젝트의 [Source] 폴더 이하에 배치한다. 폴더에는 [***.Build.cs][.h][.cpp]의 파일을 둔다.
이하 [TestModuleEd]라는 모듈을 작성하는 경우는 다음과 같이 됩니다.
TestModuleEd.Build.csnamespace UnrealBuildTool.Rules
{
public class TestModuleEd : ModuleRules
{
public TestModuleEd(ReadOnlyTargetRules Target) : base(Target)
{
PublicIncludePaths.AddRange(
new string[] {
"TestModuleEd",
// ... add public include paths required here ...
}
);
PrivateIncludePaths.AddRange(
new string[] {
"TestModuleEd",
// ... add other private include paths required here ...
}
);
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
"CoreUObject",
"Engine",
// ... add other public dependencies that you statically link with here ...
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
// ... add private dependencies that you statically link with here ...
}
);
DynamicallyLoadedModuleNames.AddRange(
new string[]
{
// ... add any modules that your module loads dynamically here ...
}
);
}
}
}
TestModule.h#pragma once
#include "CoreMinimal.h"
#include "Modules/ModuleInterface.h"
#include "Modules/ModuleManager.h"
/**
* The public interface to this module
*/
class ITestModuleEd : public IModuleInterface
{
public:
/**
* Singleton-like access to this module's interface. This is just for convenience
* Beware of calling this during the shutdown phase, though. Your module might have been unloaded already.
*
* @return Returns singleton instance, loading the module on demand if needed
*/
static inline ITestModuleEd& Get()
{
return FModuleManager::LoadModuleChecked< ITestModuleEd >( "TestModuleEd" );
}
/**
* Checks to see if this module is loaded and ready. It is only valid to call Get() if IsAvailable() returns true.
*
* @return True if the module is loaded and ready to use
*/
static inline bool IsAvailable()
{
return FModuleManager::Get().IsModuleLoaded( "TestModuleEd" );
}
};
TestModule.cpp#include "TestModuleEd/TestModuleEd.h"
class FTestModuleEd : public ITestModuleEd
{
/** IModuleInterface implementation */
virtual void StartupModule() override;
virtual void ShutdownModule() override;
};
IMPLEMENT_MODULE( FTestModuleEd, TestModuleEd )
void FTestModuleEd::StartupModule()
{
// This code will execute after your module is loaded into memory (but after global variables are initialized, of course.)
}
void FTestModuleEd::ShutdownModule()
{
// This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
// we call this function before unloading the module.
}
파일 내용 수정
추가한 모듈의 정보를 반영하기 위해 설정 파일에 추가합니다.
수정하는 파일은 에디터용 모듈을 상정해, [MyProject.uproject][MyProject.Build.cs][MyProjectEditor.Target.cs]의 3 파일입니다.
Modules에 추가합니다.
MyProject.uproject{
"FileVersion": 3,
"EngineAssociation": "4.22",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "MyProject",
"Type": "Runtime",
"LoadingPhase": "Default",
"AdditionalDependencies": [
"Engine"
]
}
## ここから追加↓、(カンマに注意)
,{
"Name": "TestModuleEd",
"Type": "Editor",
"LoadingPhase": "PostEngineInit"
}
## ここまで↑
],
"Plugins": [
{
"Name": "EditorTests",
"Enabled": true
},
]
}
PublicDependencyModuleNames에 추가합니다.
MyProject/MyProject.Build.cs
using UnrealBuildTool;
public class MyProject : ModuleRules
{
public MyProject(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PublicDependencyModuleNames.AddRange(new string[] { "TestModuleEd"}); // ←ここを追加
PrivateDependencyModuleNames.AddRange(
new string[]
{
"Slate",
"SlateCore",
}
);
}
}
ExtraModuleName에 추가합니다.
MyProjectEditor.Target.cs
using UnrealBuildTool;
using System.Collections.Generic;
public class MyProjectEditorTarget : TargetRules
{
public MyProjectEditorTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
ExtraModuleNames.AddRange( new string[] { "MyProject" } );
ExtraModuleNames.AddRange( new string[] { "TestModuleEd" } ); // ←ここを追加
}
}
모듈 파일을 솔루션에 추가
MyProject.uproject의 오른쪽 클릭 메뉴에서 Generate VisualStudio project files를 실행하여 솔루션을 검토하고 빌드합니다.
오류가 발생하면 설정을 확인하십시오.
UE 편집기에서
창 -> 개발자 도구 -> 모듈에 추가한 모듈이 표시됩니다.
비고
플러그인 지원
모듈 추가를 지원하는 플러그인도있는 것 같습니다.
New C++ Module tool
설치하고 플러그인을 활성화합니다.
메뉴에 추가됩니다.
외부 공개 정보
외부 모듈에의 참조는 .Build.cs
파일의 PublicDependencyModuleNames
에 추기하는 것으로 가능합니다만, 외부 공개를 위해서는 그 클래스나 스트럭트에 MYPROJECT_API
(MyProject는 모듈명)라고 하는 매크로를 붙일 필요가 있습니다 있습니다.
이것이 없는 경우 헤더에만 쓰여진 getter
와 같은 메소드는 액세스 할 수 있습니다만, 그 이외는 참조 에러가 됩니다.
요약
기능별로 모듈 분할을 하도록(듯이) 추천되고 있는 것 같습니다만, 의존관계는 설계 단계에서 고려하지 않으면 힘들게 됩니다.
EditorUtilityWidget 등 에디터 전용의 기능을 C++로부터 사용하는 경우는 에디터 전용 모듈을 작성은 필수가 됩니다.
Reference
이 문제에 관하여(UE4 모듈 추가 절차에 대한 메모 쓰기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/unknown_ds/items/0e271b947cf05d281480
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
파일 추가 및 설정 파일 재작성이 필요합니다.
모듈 소스 작성
모듈명을 정해 폴더를 작성해, 그것을 프로젝트의 [Source] 폴더 이하에 배치한다. 폴더에는 [***.Build.cs][.h][.cpp]의 파일을 둔다.
이하 [TestModuleEd]라는 모듈을 작성하는 경우는 다음과 같이 됩니다.
TestModuleEd.Build.cs
namespace UnrealBuildTool.Rules
{
public class TestModuleEd : ModuleRules
{
public TestModuleEd(ReadOnlyTargetRules Target) : base(Target)
{
PublicIncludePaths.AddRange(
new string[] {
"TestModuleEd",
// ... add public include paths required here ...
}
);
PrivateIncludePaths.AddRange(
new string[] {
"TestModuleEd",
// ... add other private include paths required here ...
}
);
PublicDependencyModuleNames.AddRange(
new string[]
{
"Core",
"CoreUObject",
"Engine",
// ... add other public dependencies that you statically link with here ...
}
);
PrivateDependencyModuleNames.AddRange(
new string[]
{
// ... add private dependencies that you statically link with here ...
}
);
DynamicallyLoadedModuleNames.AddRange(
new string[]
{
// ... add any modules that your module loads dynamically here ...
}
);
}
}
}
TestModule.h
#pragma once
#include "CoreMinimal.h"
#include "Modules/ModuleInterface.h"
#include "Modules/ModuleManager.h"
/**
* The public interface to this module
*/
class ITestModuleEd : public IModuleInterface
{
public:
/**
* Singleton-like access to this module's interface. This is just for convenience
* Beware of calling this during the shutdown phase, though. Your module might have been unloaded already.
*
* @return Returns singleton instance, loading the module on demand if needed
*/
static inline ITestModuleEd& Get()
{
return FModuleManager::LoadModuleChecked< ITestModuleEd >( "TestModuleEd" );
}
/**
* Checks to see if this module is loaded and ready. It is only valid to call Get() if IsAvailable() returns true.
*
* @return True if the module is loaded and ready to use
*/
static inline bool IsAvailable()
{
return FModuleManager::Get().IsModuleLoaded( "TestModuleEd" );
}
};
TestModule.cpp
#include "TestModuleEd/TestModuleEd.h"
class FTestModuleEd : public ITestModuleEd
{
/** IModuleInterface implementation */
virtual void StartupModule() override;
virtual void ShutdownModule() override;
};
IMPLEMENT_MODULE( FTestModuleEd, TestModuleEd )
void FTestModuleEd::StartupModule()
{
// This code will execute after your module is loaded into memory (but after global variables are initialized, of course.)
}
void FTestModuleEd::ShutdownModule()
{
// This function may be called during shutdown to clean up your module. For modules that support dynamic reloading,
// we call this function before unloading the module.
}
파일 내용 수정
추가한 모듈의 정보를 반영하기 위해 설정 파일에 추가합니다.
수정하는 파일은 에디터용 모듈을 상정해, [MyProject.uproject][MyProject.Build.cs][MyProjectEditor.Target.cs]의 3 파일입니다.
Modules에 추가합니다.
MyProject.uproject
{
"FileVersion": 3,
"EngineAssociation": "4.22",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "MyProject",
"Type": "Runtime",
"LoadingPhase": "Default",
"AdditionalDependencies": [
"Engine"
]
}
## ここから追加↓、(カンマに注意)
,{
"Name": "TestModuleEd",
"Type": "Editor",
"LoadingPhase": "PostEngineInit"
}
## ここまで↑
],
"Plugins": [
{
"Name": "EditorTests",
"Enabled": true
},
]
}
PublicDependencyModuleNames에 추가합니다.
MyProject/MyProject.Build.cs
using UnrealBuildTool;
public class MyProject : ModuleRules
{
public MyProject(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" });
PublicDependencyModuleNames.AddRange(new string[] { "TestModuleEd"}); // ←ここを追加
PrivateDependencyModuleNames.AddRange(
new string[]
{
"Slate",
"SlateCore",
}
);
}
}
ExtraModuleName에 추가합니다.
MyProjectEditor.Target.cs
using UnrealBuildTool;
using System.Collections.Generic;
public class MyProjectEditorTarget : TargetRules
{
public MyProjectEditorTarget(TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
ExtraModuleNames.AddRange( new string[] { "MyProject" } );
ExtraModuleNames.AddRange( new string[] { "TestModuleEd" } ); // ←ここを追加
}
}
모듈 파일을 솔루션에 추가
MyProject.uproject의 오른쪽 클릭 메뉴에서 Generate VisualStudio project files를 실행하여 솔루션을 검토하고 빌드합니다.
오류가 발생하면 설정을 확인하십시오.
UE 편집기에서
창 -> 개발자 도구 -> 모듈에 추가한 모듈이 표시됩니다.
비고
플러그인 지원
모듈 추가를 지원하는 플러그인도있는 것 같습니다.
New C++ Module tool
설치하고 플러그인을 활성화합니다.
메뉴에 추가됩니다.
외부 공개 정보
외부 모듈에의 참조는 .Build.cs
파일의 PublicDependencyModuleNames
에 추기하는 것으로 가능합니다만, 외부 공개를 위해서는 그 클래스나 스트럭트에 MYPROJECT_API
(MyProject는 모듈명)라고 하는 매크로를 붙일 필요가 있습니다 있습니다.
이것이 없는 경우 헤더에만 쓰여진 getter
와 같은 메소드는 액세스 할 수 있습니다만, 그 이외는 참조 에러가 됩니다.
요약
기능별로 모듈 분할을 하도록(듯이) 추천되고 있는 것 같습니다만, 의존관계는 설계 단계에서 고려하지 않으면 힘들게 됩니다.
EditorUtilityWidget 등 에디터 전용의 기능을 C++로부터 사용하는 경우는 에디터 전용 모듈을 작성은 필수가 됩니다.
Reference
이 문제에 관하여(UE4 모듈 추가 절차에 대한 메모 쓰기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/unknown_ds/items/0e271b947cf05d281480
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
기능별로 모듈 분할을 하도록(듯이) 추천되고 있는 것 같습니다만, 의존관계는 설계 단계에서 고려하지 않으면 힘들게 됩니다.
EditorUtilityWidget 등 에디터 전용의 기능을 C++로부터 사용하는 경우는 에디터 전용 모듈을 작성은 필수가 됩니다.
Reference
이 문제에 관하여(UE4 모듈 추가 절차에 대한 메모 쓰기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/unknown_ds/items/0e271b947cf05d281480텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)