Plugin工具类-Unreal4源码拆解-UnrealBuildTool功能流程解析
Unreal4源码拆解-UnrealBuildTool功能流程解析-Plugin
知乎专栏:UBT源码解析
主要功能
- Plugin静态类,功能上大致是一个工具类,根据文件夹保存了每个加载过的插件信息和.uplugin引用。
- 笔者大胆猜测,其实Unreal官方自己很多插件是没有开源的,所以在UBT中空有大量的完整的流程,但是没有文件。
静态成员数据
static Dictionary<DirectoryReference, List> PluginInfoCache
- 按照根文件夹记录加载过的插件信息列表
static Dictionary<DirectoryReference, List> PluginFileCache
- 按照根文件夹记录加载过的插件
.uplugin
文件和文件夹信息
静态成员函数
public static void InvalidateCaches_SLOW()
- 功能介绍:丢弃所有缓存,以便下次加载时候直接重新加载,不是从缓存里面找。
public static Dictionary<string, PluginInfo> ToFilteredDictionary(IEnumerable Plugins)
- 功能介绍:验证插件的有效性,
返回一个由插件名称和插件信息的索引。 - 工作内容:
- 挨个把输入的插件把名称作为Key和插件信息作为 Value 插入要返回的 Dictionary 字典中。
- 在挨个插入时碰到已插入的 PluginType 小于要插入的插件的 PluginType 时,用要插入的替换已插入的。
- 其他情况看到重复的直接报错。
public static IEnumerable FilterPlugins(IEnumerable Plugins)
- 功能介绍:保证同名项目插件可以覆盖引擎插件
- 工作内容:
- 调用 ToFilteredDictionary,
- 再通过插件信息的Name,
- 确保查询到的插件信息是根据 PluginType 覆盖过的,去重的插件。
public static IReadOnlyList ReadEnginePlugins(DirectoryReference EngineDirectory)
- 功能介绍:
- 找到引擎的
UnrealEngine-4.27.1-release\Engine
目录下,又找了其下 Plugins 目录。 - 把所有的找到的插件信息的 PluginType 设置为 PluginType.Engine 。
- 找到引擎的
public static IReadOnlyList<PluginInfo> ReadEnginePlugins(DirectoryReference EngineDirectory){return ReadPluginsFromDirectory(EngineDirectory, "Plugins", PluginType.Engine);}
public static IReadOnlyList ReadEnterprisePlugins(DirectoryReference EnterpriseDirectory)
- 功能介绍:
- 找到引擎的
UnrealEngine-4.27.1-release\Enterprise
目录下, - 又找了其下的 Plugins 目录,
- 把所有的找到的插件信息的 PluginType 设置为 PluginType.Enterprise
- 找到引擎的
- 注意 : 我们可以发现其实我们没有这个目录,在 UBT 里面可是有整套关于Enterprise处理的流程的。
public static IReadOnlyList<PluginInfo> ReadEnterprisePlugins(DirectoryReference EnterpriseDirectory){return ReadPluginsFromDirectory(EnterpriseDirectory, "Plugins", PluginType.Enterprise);}
public static IReadOnlyList ReadProjectPlugins(DirectoryReference ProjectDirectory)
- 功能介绍:
- 找到我们项目的根目录下,
- 又找了其下的 Mods 目录和 Plugins 目录,
- 把所有的找到的插件信息的PluginType设置为PluginType.Mod和PluginType.PluginType.Project
public static IReadOnlyList<PluginInfo> ReadProjectPlugins(DirectoryReference ProjectDirectory){List<PluginInfo> Plugins = new List<PluginInfo>();Plugins.AddRange(ReadPluginsFromDirectory(ProjectDirectory, "Plugins", PluginType.Project));Plugins.AddRange(ReadPluginsFromDirectory(ProjectDirectory, "Mods", PluginType.Mod));return Plugins.AsReadOnly();}
public static IReadOnlyList ReadAdditionalPlugins(DirectoryReference AdditionalDirectory)
- 功能介绍:
- 找到给定目录,把所有的找到的插件信息的PluginType设置为PluginType.External
public static IReadOnlyList<PluginInfo> ReadAdditionalPlugins(DirectoryReference AdditionalDirectory){DirectoryReference FullPath = DirectoryReference.Combine(AdditionalDirectory, "");if (!DirectoryReference.Exists(FullPath)){Log.TraceWarning("AdditionalPluginDirectory {0} not found. Path should be relative to the project", FullPath);}return ReadPluginsFromDirectory(AdditionalDirectory, "", PluginType.External);}
public static IReadOnlyList ReadAdditionalPlugins(DirectoryReference AdditionalDirectory)
- 功能介绍:
- 加载了除 Enterprise 以外的所有插件
- 这里就是把 ReadEnginePlugins 和 ReadProjectPlugins ,还有执行了多次ReadAdditionalPlugins
private static void TryMergeWithParent(PluginInfo Child, FileReference Filename)
- 功能介绍:
- 尝试把子插件的
.uplugin
的信息读取到的 PluginDescriptor 合并到主插件的中 PluginDescriptor
- 尝试把子插件的
- 合并内容有
Descriptor.SupportedTargetPlatforms
Descriptor.Modules
Descriptor.Module.WhitelistPlatforms
Descriptor.Module.BlacklistPlatforms
Descriptor.Plugins.WhitelistPlatforms
Descriptor.Plugins.BlacklistPlatforms
public static IReadOnlyList ReadPluginsFromDirectory(DirectoryReference RootDirectory, string Subdirectory, PluginType Type)
- 功能介绍:
- 读取给定目录下的所有插件
- 这个函数比较特殊,会读取子插件描述信息
- 调用TryMergeWithParent
- 尝试把子插件的.uplugin的信息合并到主插件中
public static IEnumerable EnumeratePlugins(DirectoryReference ParentDirectory)
- 功能介绍:
- 找到某个文件夹下(包括子文件夹)的所有的.uplugin文件引用
- 先会找PluginFileCache
- 找不到会开一个新线程搜索文件夹
- 更新PluginFileCache
- 但是没有更新PluginInfoCache
public static static void EnumeratePluginsInternal(DirectoryItem ParentDirectory, List FileNames, ThreadPoolWorkQueue Queue)
- 功能介绍:
- 搜索第一个参数文件夹及其子文件夹,找到所有的.uplugin文件引用,加到第二个参数中
public static bool IsPluginEnabledForTarget(PluginInfo Plugin, ProjectDescriptor Project, UnrealTargetPlatform Platform, UnrealTargetConfiguration Configuration, TargetType TargetType)
- 功能介绍:
- 确定某个插件是否被启用
- 确定某个插件是否被启用
public static bool IsPluginCompiledForTarget(PluginInfo Plugin, ProjectDescriptor Project, UnrealTargetPlatform Platform, UnrealTargetConfiguration Configuration, TargetType TargetType, bool bRequiresCookedData)
- 功能介绍:
- 确定某个插件是否可以在目标平台和目标配置下被编译
- 确定某个插件是否可以在目标平台和目标配置下被编译
Plugin工具类-Unreal4源码拆解-UnrealBuildTool功能流程解析相关推荐
- UBT是如何处理Target.cs和Build.cs的?-Unreal4源码拆解-UnrealBuildTool功能流程解析
UBT是如何处理Target.cs和Build.cs-Unreal4源码拆解-UnrealBuildTool功能流程解析 专栏链接 知乎专栏:UBT源码解析 功能漫谈 我们项目和引擎里面的每个模块都有 ...
- UnrealBuildTool的RulesScope-Unreal4源码拆解-UnrealBuildTool功能流程解析
Unreal4源码拆解-UnrealBuildTool功能流程解析-UnrealBuildTool的RulesScope 知乎专栏:UBT源码解析 RulesScope类介绍 功能漫谈 RulesSc ...
- java递归生成树结构_突破CRUD | 万能树Java工具类封装(源码)
0.学完本文你或许可以收获 感受一个树工具从初始逐步优化完善的过程 树工具封装的设计思考与实现思路 最后收获一款拿来即用的树工具源代码 对于前端树组件有一定了解和使用过的同学可直接跳跃到第3章节开始. ...
- Java 常用工具类 Collections 源码分析
文章出处 文章出自:安卓进阶学习指南 作者:shixinzhang 完稿日期:2017.10.25 Collections 和 Arrays 是 JDK 为我们提供的常用工具类,方便我们操作集合和数组 ...
- Android开发之Android5.1.1(CM12.1)源码中短信发送流程解析
首先我要从SmsManager开始一步步深入了解,相信大家在学习Android基础的时候接触过这个类.它在/frameworks/opt/telephony/src/java/android/tele ...
- hibernate 并发获取session失败 空指针_高并发之|通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程...
核心逻辑概述 ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态. ThreadPoolExecu ...
- 微信小程序:升级版手机检测微信工具小程序源码
这是一款升级版检测工具 自动检测手机真伪,序列号等等 另外还可以给手机检测各项功能是否正常 由于能检测的项目太多,所以大家到时候自行研究吧 小编就不多做介绍 另外支持多做流量主模式,比如激励视频,ba ...
- 在线教育专业建站工具 EduWind ,源码下载,源码分享网整理
在线教育专业建站工具 EduWind ,源码下载, Eduwind是由北京水木信步网络科技有限公司开发的网校服务,公司位于清华科技园.目前,EduWind的产品系列包括以下两大版本: EduWind网 ...
- 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment
24 UsageEnvironment使用环境抽象基类--Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类--Live555源码阅读 ...
最新文章
- 【青少年编程】【Scratch】10 画笔模块
- python【蓝桥杯vip练习题库】ALGO-236大小写转换
- 何李石:七牛直播云技术详解
- Fully Convolutional Networks for Semantic Segmentation (FCN)论文翻译和理解
- 牛客多校3 - Sort the Strings Revision(笛卡尔树+分治)
- 前端学习(2384):element介绍
- POJ-2773 欧几里得 + 二分 + 容斥
- c++primer 3.2,3.3练习题
- 未来的语音世界——中国智能语音市场分析
- 超过马云!中国第二大富豪诞生:年仅40岁,财富已达3200亿
- 关于CentOS 7(Linux)下 软件|脚本 的自启动
- mysq;多表查询 总结
- 金特会谈:有骨气的人,才会被人尊重
- mongodb oplog java_MongoDB oplog 深入剖析
- iperf3使用方法 linux,iperf3命令使用
- fcm基本原理_fcm聚类算法原理及应用
- ArcGIS API For Javascript之地图基本加载与显示,地图切换、缩放、定位、比例尺、鹰眼图、坐标显示、查询搜索功能实现
- java选取最大数字_用Java程序找最大的数字(4.1)
- 君莫笑系列视频学习(3)
- 【图像处理】漫水填充函数的使用(flags的用法)