Unreal 插件

UE中的插件,重点在.Build.cs文件和.uplugin文件,如果在这两者中,再分主次的话,那我选.Build.cs文件,即为这篇文章画一个侧重点。

在Unreal中,插件是开发者可在编辑器中逐项目启用或禁用的代码和数据集合。
插件可添加运行时,gameplay功能,修改内置引擎功能或添加新功能,新建文件类型,及使用新菜单、工具栏命令和子模式扩展编辑器的功能。使用插件可拓展许多现有Unreal子系统。

1. 插件编辑器与插件文件

  • Unreal插件编辑器界面中的插件对应了UE4安装目录下的Plugins文件下的插件。
Unreal插件编辑器
Plugin文件

2. 插件目录

插件目录结构.png

Binaries:编译后的dll文件存放位置
Content:游戏资源Asset文件存放位置
Intermediate:编译的中间文件存放位置
Resources:一般为图标的存放位置
Source:代码存放位置
.uplugin:插件模块配置文件,JSON格式
.Build.cs:每个.Build.cs文件声明派生自ModuleRules基类的类,并设置属性控制器从构造函数进行编译的方式。由虚幻编译工具编译,并被构造来确定整体编译环境。使用C#语法。

(1) 插件描述文件 .uplugin

插件描述文件.uplugin,此文件可在插件编辑器中进行修改。

插插件编辑器.png
{
    "FileVersion": 3,
    "Version": 1,
    "VersionName": "1.0",
    "FriendlyName": "PluginName",
    "Description": "",
    "Category": "Other",
    "CreatedBy": "",
    "CreatedByURL": "",
    "DocsURL": "",
    "MarketplaceURL": "",
    "SupportURL": "",
    "CanContainContent": false,
    "IsBetaVersion": false,
    "Installed": false,
    "Modules": [
        {
            "Name": "PluginName",
            "Type": "Editor",
            "LoadingPhase": "Default"
        }
    ],
    "Plugins": [
        {
            "Name": "AssetManagerEditor",
            "Enabled": true
        }
    ]
}
  • Category:类目名即在插件编辑器中所属的类目
模块描述符Modules

必须有Name和Type字段。

  • Name:是插件模块的唯一命名,将随着插件而加载。在运行时,插件的Binaries文件夹中需存在正确的插件二进制文件,并带有指定模块命名。
  • Type:是模块的类型,决定了该插件适合于那种类型的应用程序加载。有效的几项是:Runtime、RuntimeNoCommandlet、Developer、Editor;其中Runtime 的模块在无论何时都会被加载,哪怕是在最终发行的游戏版本中也会。Developer 的模块只会在 Development 运行时或者编辑器版本中才会被加载,并不在在最终发行版本中加载。Editor 模块只会随着 Editor 的启动被加载。插件也可以使用几种不同类型的组合来达到所需要的目的
  • LoadingPhase:控制插件在引擎启动的何时被加载

LoadingPhase 参考文章
https://docs.unrealengine.com/en-US/API/Runtime/Projects/ELoadingPhase__Type/index.html

  • WhitelistPlatforms:开放的平台
  • BlacklistPlatforms:关闭的平台
插件描述符Modules

此插件依赖于另一个插件,所以在插件描述符Modules中的LoadingPhase的属性,如果和另一个插件是依赖关系,则应该编译此插件之前就编译了依赖的那个插件。

(2) 插件编译配置文件 .Build.cs 描述模块编译方法

①示例代码
using UnrealBuildTool;


public class PluginName : ModuleRules
{
    public PluginName(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;
        
        PublicIncludePaths.AddRange(
            new string[] {
                // ... add public include paths required here ...
            }
            );
                
        
        PrivateIncludePaths.AddRange(
            new string[] {
                // ... add other private include paths required here ...
            }
            );
            
        
        PublicDependencyModuleNames.AddRange(
            new string[]
            {
                "Core",
                // ... add other public dependencies that you statically link with here ...
            }
            );
            
        
        PrivateDependencyModuleNames.AddRange(
            new string[]
            {
                "CoreUObject",
                "Engine",
                "Slate",
                "SlateCore",
                // ... add private dependencies that you statically link with here ...  
            }
            );
        
        
        DynamicallyLoadedModuleNames.AddRange(
            new string[]
            {
                // ... add any modules that your module loads dynamically here ...
            }
            );
    }
}
②.Build.cs与VS的关系

该插件模块编译配置,与配置VS中的项目属性类似,包含进了依赖库等 。例如 第三方库lib的引用

③各代码块描述

路径Private:
路径Public:
****若此模块依赖某个模块,则就引入哪个模块,则表示此模块.Build.cs同级目录下的Public文件夹下的头文件可引用,若欲引用的头文件其上一级还有文件夹,应该在#include 显式 写出*****
模块Private:C包含B,B包含A, C是否需要重新包含A。 是
模块Public: 否
模块Dynamically:

④头文件包含

注意:依赖进某个某个模块,表示,跟此模块.Build.cs文件同级目录下的Public文件夹下的.h可包含进,但是如果欲包含的头文件,上一级还有文件夹,但是这个文件夹不是Public文件,包含进头文件的时候,就需要显式写出文件夹名字。还有,一定要注意 是Public文件夹,因为只有在此文件夹下才可以自动检测到。

⑤模块名_API 宏

模块名_API与Public / Private 文件夹之间的关系

⑥错误展示
.Build.cs未包含模块名错误复现.png

(3) 插件头文件 .h

插件的头文件中,一般只有一个类,而且以F开头,Module结尾。比如:FPluginNameModule。
还有两个函数

virtual void StartupModule() override;//插件加载
virtual void ShutdownModule() override;//插件卸载

错误经验:
(1)当创建“编辑器工具栏按钮”的插件,编辑代码结束后,需重新打开编辑器才可生效。

3. 使用引擎插件

直接包含插件头文件是不行的。打开插件的Build.cs文件,在DependencyModuleNames中,填入使用的插件名称。

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

4. 新建插件

5. 如何使在源码目录下新建的插件 生效

(1)运行UE4在Editor模式下启用插件

(2)插件启动先后顺序和依赖关系有直接关系

6. 个人心得

插件(模块集合形成)--->多个模块(.Build.cs)--->多个文件夹(一个文件夹对应一个.Build.cs)
在.Build.cs文件,进行依赖声明工作,以包含所需头文件。

参考文章
https://gameinstitute.qq.com/community/detail/121747
https://docs.unrealengine.com/zh-CN/Programming/Plugins/index.html
https://blog.csdn.net/jxyb2012/article/details/88839224
https://www.jianshu.com/p/36706303943a
https://zhuanlan.zhihu.com/p/49558324

你可能感兴趣的:(Unreal 插件)