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 ...
随机推荐
- sql2000添加表注释,列注释 及修改 删除 注释
--创建表--create table 表(a1 varchar(10),a2 char(2)) --为表添加描述信息EXECUTE sp_addextendedproperty 'MS_Descri ...
- Programming Entity Framework 翻译(1)-目录
1. Introducing the ADO.NET Entity Framework ado.net entity framework 介绍 1 The Entity Relationship Mo ...
- Centos下安装Redis
转自:http://nnzhp.cn/article/9/ 遇到问题,安装后并启动,redis-cli报错:Could not connect to Redis at 127.0.0.1:6379: ...
- 发现大量的TIME_WAIT解决办法
存在一定的TIME_WAIT是正常的,个人认为如果超过了连接数的比例就不是很正常 服务器端与客户端建立TCP/IP连接后关闭SOCKET后,服务器端连接的端口状态变为TIME_WAIT.主动关闭的一方 ...
- SQL Server 数据库的维护(三)__事务(transaction)和锁
--维护数据库-- --事务(transaction)和锁-- --事务(transaction)-- --概述: 事务是指封装了一组T-SQL语句的单个逻辑单元.单元中的所有语句作为一个整体,在满足 ...
- C# 导入EXCEL 报错外部表不是预期的格式错误 .
错误经过:在读取Excel时,出现外部表不是预期的格式 错误原因1: 由于Excel 97-2003的连接格式与Excel 2010 的 不同造成. 以下是从网上摘抄原文 Excel “Externa ...
- RapidXML 试用
近半年来断断续续的封装一些SDK,在兼顾跨平台.易用性和高效率上还要顾及到对外dll的大小问题.由于之前解析SVG文件的用到了一个XML解析库xercesc,这个DLL实在巨大近4M,于是尝试用新的X ...
- 驱动学习---PAE--virtual address to physics address
PAE是Physical Address Extension的缩写,即物理地址扩展.简单来说,就是把IA-32处理器的寻址能力从原来的4GB扩展到64GB.寻址4GB空间,要求物理地址的宽度为32位. ...
- python实现监控URL的一个值小于规定的值--邮件报警
监控URL的一个值小于规定的值--邮件报警 #!/usr/bin/env python #-*- coding:utf-8 -*- __author__ = 'liudong' import urll ...
- 循序渐进Python3(十)-- 0 -- RabbitMQ
RabbitMQ RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现.AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息 ...