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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343