UE集成第三方库开发技巧、自定义第三方库输出路径

1、Unreal Engine的插件或模块开发时,ModuleRules的部分属性说明

官方文档地址:https://docs.unrealengine.com/4.26/zh-CN/ProductionPipelines/BuildTools/UnrealBuildTool/ModuleFiles/

(1) Type (ModuleType)

ModuleType有两个枚举值:External和CPlusPlus
External:
当将 Type 属性设置为 “external” 时,这意味着该模块是外部的,通常是指与 Unreal Engine 引擎外部的第三方模块或库。这种模块通常不是由 Unreal Engine 自身管理和构建的,而是由外部工具或构建系统管理。“external” 模块可能需要额外的配置和设置,以便正确地与 Unreal Engine 集成。
CPlusPlus:
当将 Type 属性设置为 “cplusplus” 时,这意味着该模块是一个标准的 Unreal Engine C++ 模块。这种模块是由 Unreal Engine 自身构建和管理的,通常包含游戏或应用程序的自定义功能。“cplusplus” 模块可以受益于 Unreal Engine 的构建系统和工具,并能够利用 Unreal Engine 的各种功能。
看起来没什么区别,但是更推荐external。

(2) PublicIncludePathModuleNames (List)

包含头文件的模块名称列表(不需要路径),我们模块的公共头文件需要访问这些头文件,但是不需要"导入"或链接它们

public class MyModule : ModuleRules
{
    public MyModule(ReadOnlyTargetRules Target) : base(Target)
    {
        // ...

        PublicIncludePathModuleNames.AddRange(new string[] { "ModuleA", "ModuleB" });

        // ...
    }
}
(3) PublicDependencyModuleNames (List)

公共依赖性模块名称的列表(不需要路径)(自动执行私有/公共包含)。这些是我们的公共源文件所需要的模块。

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Sound" });
(4) PrivateIncludePathModuleNames (List)

包含头文件的模块名称列表(不需要路径),我们模块的私有代码文件需要访问这些头文件,但是不需要"导入"或链接它们。

(5) PrivateDependencyModuleNames (List)

私有依赖性模块名称列表。 我们的私有代码依赖这些模块,但我们的公共包含文件的内容均不依赖这些模块。

(6) PublicSystemIncludePaths (List)

系统/库包含路径列表——通常用于外部(第三方)模块。 这些是公共的稳定头文件目录,在解析头文件依赖性时不会受到检查。

(7) PublicSystemLibraryPaths (List)

系统库路径列表( .lib 文件的目录),对于外部(第三方)模块,请改用PublicAdditionalLibaries。

(8) PublicIncludePaths (List)

(当前不需要此设置,因为我们会在‘Public’文件夹中发现所有文件)公开给其他模块的包含文件所有路径的列表。

(9) PrivateIncludePaths (List)

此模块内部包含文件的所有路径的列表,不向其他模块公开(至少有一个包含到‘Private’路径,如果要避免相对路径,则会更多)

(10) PrivateRuntimeLibraryPaths (List)

运行时各个库的搜索路径列表(例如 .so 文件)。

(11) PublicRuntimeLibraryPaths (List)

运行时各个库的搜索路径列表(例如 .so 文件)

(12) PublicAdditionalLibraries (List)

附加库的列表(.lib文件的名称,包括扩展名)——通常用于外部(第三方)模块。

(13) PublicSystemLibraries (List)

要使用的系统库的列表——这些库一般通过名称引用并通过系统路径查找。如果你需要引用 .lib 文件,请改用PublicAdditionalLibraries。

(14) PublicDelayLoadDLLs (List)

用于指定需要在程序运行时延迟加载的DLL文件。延迟加载是指在程序运行时才加载DLL文件,而不是在程序启动时就加载。这可以提高程序启动速度,因为不需要加载所有的DLL文件。不在这个list中的dll会在程序启动时就加载。

(15) DynamicallyLoadedModuleNames (List)

用于指定需要在程序运行时动态加载的模块,包括DLL文件和插件。动态加载是指在程序运行时才加载模块,而不是在程序启动时就加载。这可以使程序更加灵活,因为可以根据需要加载不同的模块。

(16) RuntimeDependencies (RuntimeDependencyList)

用于指定模块在运行时所依赖的文件列表。这些文件会在构建目标时被一同打包,并在运行时加载,以确保模块的正确运行。

//添加运行时依赖项列表的文件路径
RuntimeDependencies.Add("Path/To/My.dll");//这将把My.dll添加到运行时依赖项中
//第一个参数为要添加的文件的目标路径,第二个参数是原始文件的路径。告诉引擎将原始文件复制到指定的目标路径,以确保运行时可用。
RuntimeDependencies.Add("TargetPath/release.dll","SourcePath/release.dll");

2、Unreal C++开发时的常用路径获取

    FString ProjectPath = FPaths::ProjectDir();//"项目的根路径:F:/CVE/learn/UE5/TestCustomPlugin/"
    FString ProjectConfigPath = FPaths::ProjectConfigDir();//项目配置文件路径:"F:/CVE/learn/UE5/TestCustomPlugin/Config/"
    FString ProjectContentPath = FPaths::ProjectContentDir();//项目的Content路径:"F:/CVE/learn/UE5/TestCustomPlugin/Content/"
    FString ProjectPluginPath = FPaths::ProjectPluginsDir();//项目插件路径:"F:/CVE/learn/UE5/TestCustomPlugin/Plugins/"
    FString ProjectFile = FPaths::GetProjectFilePath();//项目文件的完整路径:"F:/CVE/learn/UE5/TestCustomPlugin/TestCustomPlugin.uproject"

    FString EngineDir = FPaths::EngineDir();//引擎的根目录路径:"../../../Engine/"
    FString EngineContentDir = FPaths::EngineContentDir();//引擎Content文件夹路径:"../../../Engine/Content/"

    FString BinaryOutputDir = FPaths::ConvertRelativePathToFull(FPaths::Combine(FPaths::ProjectSavedDir(), TEXT("Binaries")));//二进制输出目录路径: "F:/CVE/learn/UE5/TestCustomPlugin/Saved/Binaries"
    FString IntermediateDir = FPaths::ProjectIntermediateDir();//中间文件目录路径: "F:/CVE/learn/UE5/TestCustomPlugin/Intermediate/"
    FString ProjectSavedDir = FPaths::ProjectSavedDir();//项目保存数据的目录路径: "F:/CVE/learn/UE5/TestCustomPlugin/Saved/"

M o d u l e D i r 、 {ModuleDir}、 ModuleDir{PluginDir}、 E n g i n e D i r 、 {EngineDir}、 EngineDir{ProjectDir}、 T a r g e t O u t p t D i r 和 {TargetOutptDir}和 TargetOutptDir{BinaryOutputDir}占位符说明:https://blog.csdn.net/u010385624/article/details/97797461

3、链接动态库并打包到自定义路径

using System;
using System.IO;
using UnrealBuildTool;

public class GDAL : ModuleRules
{
    public GDAL(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
        bEnableUndefinedIdentifierWarnings = false;

        Type = ModuleType.External;

        if (Target.Platform == UnrealTargetPlatform.Win64)
        {
            // 添加头文件所在目录,并暴露给外部模块
            PublicIncludePaths.Add(Path.Combine(ModuleDirectory, "include"));

            //添加导入文件
            string importedLibraryPath = Path.Combine(ModuleDirectory, "lib");
            string[] importedLibraries = Directory.GetFiles(importedLibraryPath, "*.lib");
            foreach (string item in importedLibraries)
            {
                //指定导入库的全路径名这样就不需要指定PublicRuntimeLibraryPaths的值了。
                //这步也可以指定导入库的文件名,但是就需要指定PublicRuntimeLibraryPaths的值了
                PublicAdditionalLibraries.Add(Path.Combine(importedLibraryPath, item));
            }

            //添加动态库文件
            string dynamicLibraryPath = Path.Combine(ModuleDirectory, "bin");
            string[] dynamicLibraries = Directory.GetFiles(dynamicLibraryPath, "*.dll");
            //PublicRuntimeLibraryPaths.Add(importedLibraryPath);//如果PublicAdditionalLibraries中指定的是导入库文件名,则这里需要指定导入库路径。

            foreach (string item in dynamicLibraries)
            {

                string dynamicLibraryName = Path.GetFileName(item);
                //程序启动后,按需加载dll,没有这段话则在程序一启动时就加载dll文件。同时如果将dll文件输出到指定自定义路径的话,则必须使用按需加载的方式。
                PublicDelayLoadDLLs.Add(dynamicLibraryName);
                //将第三方dll库输出到自定义目录下,这样设置时ue会对使用到第三方库的代码进行检查,如果语法存在问题或隐患,可以运行,但是不能打包,打包会报错。比如删除一个指针的时候没有判断指针是否为空,这种潜在问题就会导致打包失败。
                RuntimeDependencies.Add(Path.Combine("$(PluginDir)/Binaries/Win64/ThirdParty/GDAL/", dynamicLibraryName), item);
            }
        }
        else
        {
            Console.Error.WriteLine("Only support Win64 Platform");
        }
    }
}

4、添加PublicDelayLoadDLLs的搜索路径

上个步骤中,动态链接库被拷贝到插件目录下(“$(PluginDir)/Binaries/Win64/ThirdParty/GDAL/”),但是PublicDelayLoadDLLs默认的加载路径并不包含这个路径,因此要添加该路径到加载路径中,在使用该第三方库插件的插件的StartupModule方法中调用PushDllDirectory方法新增加载路径,例如:

void FCustomGDALModule::StartupModule()
{
	// This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module

	// Get the base directory of this plugin
	FString BaseDir = IPluginManager::Get().FindPlugin("CustomGDAL")->GetBaseDir();
    //增加第三方库dll的路径以便PublicDelayLoadDLLs中的dll被加载
	FPlatformProcess::PushDllDirectory(*(BaseDir + "/Binaries/Win64/ThirdParty/GDAL/"));
	FString dllPath = FPaths::Combine(BaseDir, "/Binaries/Win64/ThirdParty/GDAL/gdal.dll");
    //判断dll文件是否被正确加载,加载了才能成功调用第三方库的方法
	void* dllHandle = FPlatformProcess::GetDllHandle(*dllPath);
	if (dllHandle) {
		CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
		CPLSetConfigOption("SHAPE_ENCODING", "");
		GDALAllRegister();
	}
	else {
		FMessageDialog::Open(EAppMsgType::Ok, LOCTEXT("ThirdPartyLibraryError", "Failed to load example third party library"));
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UE4 是一款强大的游戏开发引擎,其第三方库插件的功能是扩展引擎的核心功能,为开发者提供更多丰富且高效的工具和功能,以便更好地满足开发需求。UE4的第三方库插件可以通过官方插件市场或其他第三方渠道进行获取和安装。 UE4的第三方库插件可以实现各种功能,比如增加特定平台的功能支持、优化性能、提供高级的图形渲染功能、添加动画系统、提供多人联机功能、增加物理效果等等。通过使用这些插件,开发者可以在自己的项目中轻松地使用这些功能,而无需从头开始编写和调试代码。 UE4第三方库插件的优势有几个方面: 1. 提高开发效率:第三方库插件已经经过开发者的验证和测试,在适应UE4引擎后可以直接使用,不需要进行二次开发和调试,可以大大缩短项目的开发周期。 2. 功能丰富:第三方库插件可以为UE4引擎增加各种功能和特性,开发者可以根据项目需求选择和使用不同的插件,以满足项目的具体需求。 3. 生态繁荣:UE4的第三方库插件生态系统非常繁荣,有许多开发者和团队贡献了各种各样的插件,可以满足不同开发者的需求。同时,UE4开发者社区也积极交流和分享插件的使用经验和技巧。 需要注意的是,选择和使用第三方库插件时,开发者需要根据项目的实际需求进行评估和选择,确保插件的稳定性和兼容性,并了解插件的文档和支持情况,以便在开发过程中能够及时解决遇到的问题。此外,使用第三方库插件也需要注意未来引擎版本的兼容性,以免由于引擎升级导致插件无法使用或出现其他问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值