插件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的编译加载的更多相关文章

  1. 爱之初体验---编译加载内核模块hello

    1. hello.c #include <linux/module.h> #include <linux/kernel.h> #include <linux/init.h ...

  2. Ubuntu16.04下的modules模块编译加载

    一.首先编写对应的驱动程序的相关内容:(最简单的hello.c程序) #include<linux/init.h> #include<linux/module.h> MODUL ...

  3. [UE4]C++实现动态加载的问题:LoadClass&lt;T&gt;()和LoadObject&lt;T&gt;() 及 静态加载问题:ConstructorHelpers::FClassFinder()和FObjectFinder()

    转自:http://aigo.iteye.com/blog/2281558 动态加载UObject和动态加载UClass分别用LoadObject<T>(),和LoadClass<T ...

  4. [UE4]C++实现动态加载UObject:StaticLoadObject();以Texture和Material为例

    相关内容: C++实现动态加载的问题:LoadClass<T>()和LoadObject<T>() http://aigo.iteye.com/blog/2281558C++静 ...

  5. [UE4]C++实现动态加载的问题:LoadClass()和LoadObject()

    http://aigo.iteye.com/blog/2281558 原文作者:@玄冬Wong 相关内容:C++静态加载问题:ConstructorHelpers::FClassFinder()和FO ...

  6. 解决Notepad++ Plugin Manager无法加载插件的方法

    今天正好安装了Notepad++,结果发现Plugin Manager里插件一个也没有,网上对应的方法都没有,最后无意间看到Plugin Manager Settings 里的提示,试了一下居然成功了 ...

  7. easyui源码翻译1.32--EasyLoader(简单加载)

    前言 扩展自$.fn.datebox.defaults,使用$.fn.datetimebox.defaults重写默认值对象.下载该插件翻译源码 源码 /** * jQuery EasyUI 1.3. ...

  8. IOS使用pods初次加载出现Pods-resources.sh: Permission denied错误的解决方案

    在使用了pods之后首次编译加载时会出现错误 你的Pods存放目录/Pods/Target Support Files/Pods/Pods-resources.sh: Permission denie ...

  9. [转][osg]关于PagedLOD 加载卸载机制

    你的PagedLOD 为什么没有卸载 转自:http://bbs.osgchina.org/forum.php?mod=viewthread&tid=7612&highlight=Pa ...

随机推荐

  1. winFrom 常用控件属性及方法介绍

    目录 1.窗体(Form) 2.Label (标签)控件 3.TextBox(文本框)控件 4.RichTextBox控件 5.NumericUpDown控件 6.Button(按钮)控件 7.Gro ...

  2. WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: Dat ...

  3. 导入maven工程遇见的问题【问题】

    原工程是一个基于websocket的maven工程(源工程:http://www.cnblogs.com/xdp-gacl/p/5193279.html),把工程导入eclipse后报错.

  4. data structure

    转载请注明出处: 我所遇见的世界会更美好 我曾经逢人就说总是遇到这样那样错误无法解决,但是这些问题只要静下心来仔细思考根本没有解决不了的问题. 其实明明,超级超级简单,然而被老师讲的天花乱坠, 栈: ...

  5. DesignPatterns

    1.设计模式,说明工厂模式.  总共23种,分为三大类:创建型,结构型,行为型 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Bui ...

  6. CSS代码语法

    css 样式由选择符和声明组成,而声明又由属性和值组成,如下图所示: 选择符:又称选择器,指明网页中要应用样式规则的元素,如本例中是网页中所有的段(p)的文字将变成蓝色,而其他的元素(如ol)不会受到 ...

  7. DropBox与Box的区别,包括直接的投资人的评价(本地Sync可能还是挺重要的)

    作者:曲凯链接:http://www.zhihu.com/question/22207220/answer/20642357来源:知乎著作权归作者所有,转载请联系作者获得授权. Box和Dropbox ...

  8. Ubuntu安装Anaconda

    安装Anaconda的最简单方法是下载最新的Anaconda安装程序bash脚本,然后运行它. 在Anaconda Downloads页面找到最新版本的Anaconda for Python 3 .当 ...

  9. Node.js基础学习一之Get请求

    本人从事的是前端开发,这段时间公司开发项目比较少所以就想着学点东西,然后就想到了Node.js ,跟着菜鸟教程学了点,不过我觉得最好的学习方法是带着需求来学习. 其实和服务端打交道无非就是能有一个可以 ...

  10. DELETE语句总结

    一.基本语句 1.SQL DELETE 语法 DELETE FROM table_name WHERE condition; 请注意 删除表格中的记录时要小心!注意SQL DELETE 语句中的 WH ...