ue4 plugin的编译加载
插件Plugin:
本来应该是指一种纯以接口与外界打交道的程序模块,在同一接口背后可以有多种实现,更换实现完全不影响客户端代码(不用重编)。
但是在ue4的世界里,插件似乎不是这个意思,仅仅是一种可以在构建时选择是否启用的模块,在客户端代码里充斥着对插件内部函数的调用
只不过这些调用一般要被封装在简单的#if WITH_PLUGINXXX之类的宏里
在构建时,若检测到插件未启用或不存在,就不会定义相应的宏,于是插件本身不被编译,调用它的代码也被清除,各自都相安无事。
插件描述符,在ubt里对应类PluginDescriptor,也就是每个插件目录里的*.uplugin文件
在其中定义了适用的平台、包含的模块、加载的时机等重要信息,一个插件可以包含多个模块,每个模块又可用于不同的目的
如ScriptPlugin这个插件,有3个模块,一个用于runtime,一个用于editor,还有一个用于unrealheadertool(没错,unrealheadertool也支持插件。。可以通过它生成更多的自定义代码)
{
"FileVersion" : 3,
"Version" : 1,
"VersionName" : "1.0",
"FriendlyName" : "Script Plugin",
"Description" : "An example of a script plugin. This can be used as a starting point when creating your own plugin.",
"Category" : "Examples",
"CreatedBy" : "Epic Games, Inc.",
"CreatedByURL" : "http://epicgames.com",
"DocsURL" : "",
"MarketplaceURL" : "",
"SupportURL" : "",
"EnabledByDefault" : false,
"CanContainContent" : false,
"IsBetaVersion" : false,
"Installed" : false,
"CanBeUsedWithUnrealHeaderTool" : true, "Modules" :
[
{
"Name" : "ScriptGeneratorPlugin",
"Type" : "Program",
"LoadingPhase" : "PostConfigInit"
},
{
"Name" : "ScriptPlugin",
"Type" : "Runtime",
"LoadingPhase" : "PreDefault",
"BlacklistPlatforms" :
[
"Linux"
]
},
{
"Name" : "ScriptEditorPlugin",
"Type" : "Editor",
"LoadingPhase" : "Default",
"BlacklistPlatforms" :
[
"Linux"
]
}
]
}
另外,在这里也定义该插件是否默认启用【PluginDescriptor.bEnabledByDefault】,如启用的话就会自动包含在任何项目构建中。
而每个项目也可以明确定义了自己需要或屏蔽的插件【ProjectDescriptor.Plugins】,优先级高于前者。
再有就是项目里的每个Target还可以强制指定包含所有插件【TargetRules.bBuildAllPlugins】,优先级又高于前者。比如UE4Editor就强制启用了所有插件。
一旦一个插件决定参与构建,在后续的过程中(包括在运行时),它就跟一般的模块没什么区别了。
那插件和模块到底有什么不同呢?我觉得,就是插件可以方便的配置要不要编进来,而一般模块的依赖性是固定的,要了模块A就必须要模块B,不可能把A配置成可以动态的选择要不要B,因为如果可以的话,那B其实就是个插件了。
ue4 plugin的编译加载的更多相关文章
- 爱之初体验---编译加载内核模块hello
1. hello.c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h ...
- Ubuntu16.04下的modules模块编译加载
一.首先编写对应的驱动程序的相关内容:(最简单的hello.c程序) #include<linux/init.h> #include<linux/module.h> MODUL ...
- [UE4]C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>() 及 静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()
转自:http://aigo.iteye.com/blog/2281558 动态加载UObject和动态加载UClass分别用LoadObject<T>(),和LoadClass<T ...
- [UE4]C++实现动态加载UObject:StaticLoadObject();以Texture和Material为例
相关内容: C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>() http://aigo.iteye.com/blog/2281558C++静 ...
- [UE4]C++实现动态加载的问题:LoadClass()和LoadObject()
http://aigo.iteye.com/blog/2281558 原文作者:@玄冬Wong 相关内容:C++静态加载问题:ConstructorHelpers::FClassFinder()和FO ...
- Qt 5.2中编译加载MySQL数据库驱动问题的总结
背景: 本科毕业设计涉及图形界面与数据库查询.选择使用Qt实现图形界面编程,使用MySQL构建数据库.之前安装了Qt 5.2,后来又安装了MySQL Server 5.6 (FULL完全安装).接着就 ...
- 解决Notepad++ Plugin Manager无法加载插件的方法
今天正好安装了Notepad++,结果发现Plugin Manager里插件一个也没有,网上对应的方法都没有,最后无意间看到Plugin Manager Settings 里的提示,试了一下居然成功了 ...
- openwrt编译加载龙尚U9300模组上网
硬件平台:MT7628A openwrt版本:MTK_SDK 1.添加模组信息 /build_dir/target-mipsel_24kc_musl/linux-ramips_mt76x8/linux ...
- linux下设备驱动的结构&编译&加载
构造和运行模块 insmod modprobe rmmod 用来装载模块到正运行的内核和移除模块的用户空间工具. #include<linux/init.h> module_init(in ...
随机推荐
- PowerDesigner 逆向中 Name和Comment互换
在使用PowerDesigner对数据库进行概念模型和物理模型设计时,一般在NAME或Comment中写中文,在Code中写英文.Name用来显 示,Code在代码中使用,但Comment中的文字会保 ...
- UNIX网络编程——getsockname和getpeername函数
UNIX网络编程--getsockname和getpeername函数 来源:网络转载 http://www.educity.cn/linux/1241293.html 这两个函数或者 ...
- 《SSM框架搭建》一.构建maven web项目
一.创建maven工程File-New-other-Maven Project 二.设置项目工作空间,取消默认勾选,手动设置 三.选择internal,输入web,选择maven.archetypes ...
- Python全栈开发day9
一.面向对象进阶 1.利用python反射查看面向对象成员 对于对象:反射既可以找对象,类的成员 对于类:反射只能找类中的成员 2.利用反射操作模块(查找类,创建对象,查找对象中字段) 1 2 3 4 ...
- ES5 的 forEach, map, filter, some, every 方法
1: forEacharray.forEach(callback,[ thisObject]) // 遍历数组里面的所有数字// item 是值, i 是序号, array 是整个数组 [1, 2 ...
- Servlet学习三——传输文件
最先在考虑传输文件时,想通过java写一个文件上传案例,传给Servlet,Servlet再保存至数据库中,但苦于一直没找到实例,听说Flex有实际的例子,就直接用Flex例子来测试了.本文的顺序为: ...
- 水果姐逛水果街Ⅱ codevs 3305
3305 水果姐逛水果街Ⅱ 时间限制: 2 s 空间限制: 256000 KB 题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔 ...
- loadrunner ---模拟多IP登录
1.打开HP LoadRunner ->Tools ->IP Wizard
- 调用KEditor批量上传图片
调用KEditor批量上传图片: <script charset="utf-8" src="/Keditor/kindeditor.js">< ...
- c++ 二维数组传递
c++ 二维数组传递 我们在传递二维数组时,对于新手来说,可能会存在某些问题,下面讲解几种传递方法 在讲解如何传递二维数组时,先看看如何动态new 二维数组 // 二维数组动态申请 int row , ...