![Thumbnail: ue4](/imgs/icon.png)
UE Add Module
3 minute read
项目在实现可视化的时候用到了添加模块,这里顺便记录下。
1. 编辑 uproject 文件
{
"FileVersion": 3,
"EngineAssociation": "4.26",
"Category": "",
"Description": "",
"Modules": [
{
"Name": "UnLuaTest",
"Type": "Runtime",
"LoadingPhase": "Default",
"AdditionalDependencies": [
"Engine",
"CoreUObject"
]
},
// 这一段是新加的
///////////////
{
"Name": "UnLuaTestEditor", // module 名称
"Type": "Editor",
"LoadingPhase": "PostEngineInit", // 加载阶段
"AdditionalDependencies": [
"CoreUObject",
"Engine"
]
}
/////////////////
]
}
需要注意的是加载阶段不仅影响引擎性能,还影响到一些写在模块内功能的运行,加载的太早会导致功能需求的部分没有加载,导致不能正常运行
2. 编辑 xxxxEditor.Target.cs
// Copyright Epic Games, Inc. All Rights Reserved.
using UnrealBuildTool;
using System.Collections.Generic;
public class UnLuaTestEditorTarget : TargetRules
{
public UnLuaTestEditorTarget( TargetInfo Target) : base(Target)
{
Type = TargetType.Editor;
DefaultBuildSettings = BuildSettingsVersion.V2;
ExtraModuleNames.AddRange( new string[] { "UnLuaTest", "UnLuaTestEditor" } );
// 加上模块名 "UnLuaTestEditor"
}
}
3. 模块 .h .cpp .Build.cs
首先是在项目的 source 文件夹下创建新的模块,文件夹名为模块名,(模块文件夹下建议再新建一个 Public 文件夹和一个 Private 文件夹),目录下再建一个 Modulename.Build.cs 文件。在 Public 文件夹下面添加 ModuleName.h 文件,Private 文件夹下添加 ModuleName.cpp 文件。
.h
#pragma once
#include "Modules/ModuleInterface.h"
#include "Modules/ModuleManager.h"
class FUnLuaTestEditorModule : public IModuleInterface
{
public:
virtual void StartupModule() override;
virtual void ShutdownModule() override;
};
.cpp
#include "UnLuaTestEditor.h"
#include "UnrealEd.h"
#include "LineVisualizer.h"
#include "UnLuaTest/LineDraw.h"
// Actually registers the module
IMPLEMENT_GAME_MODULE(FUnLuaTestEditorModule, UnLuaTestEditor);
void FUnLuaTestEditorModule::StartupModule()
{
/*
UE_LOG(LogTemp, Warning, TEXT("StartupModule"));
if (GUnrealEd)
{
UE_LOG(LogTemp, Warning, TEXT("OnRegeister"));
TSharedPtr<FComponentVisualizer> Viz = MakeShareable(new LineVisualizer());
GUnrealEd->RegisterComponentVisualizer(ULineDraw::StaticClass()->GetFName(), Viz);
Viz->OnRegister();
}
else
{
UE_LOG(LogTemp, Warning, TEXT("Regeister failed"));
}
*/
}
void FUnLuaTestEditorModule::ShutdownModule()
{
/*
if (GUnrealEd)
{
GUnrealEd->UnregisterComponentVisualizer(ULineDraw::StaticClass()->GetFName());
}
*/
}
.Build.cs
using UnrealBuildTool;
public class UnLuaTestEditor : ModuleRules
{
public UnLuaTestEditor(ReadOnlyTargetRules Target) : base(Target)
{
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
// ComponentViz needed for the objects we're visualizing
PublicDependencyModuleNames.AddRange(new string[] { "Core", "Engine", "CoreUObject", "UnluaTest" });
// Needed for our editor logic
PrivateDependencyModuleNames.AddRange(new string[] { "UnrealEd" });
}
}
最后再右键 uproject 文件选择 generate ,在重新打开编译项目文件就行了,编辑器内新建 C++ 类时记得手动选择所属模块