Unreal4源码拆解-UnrealBuildTool功能流程解析-Plugin

知乎专栏:UBT源码解析

4.2x功能不会差太多

主要功能

  • 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.ModPluginType.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 以外的所有插件
  • 这里就是把 ReadEnginePluginsReadProjectPlugins ,还有执行了多次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功能流程解析相关推荐

  1. UBT是如何处理Target.cs和Build.cs的?-Unreal4源码拆解-UnrealBuildTool功能流程解析

    UBT是如何处理Target.cs和Build.cs-Unreal4源码拆解-UnrealBuildTool功能流程解析 专栏链接 知乎专栏:UBT源码解析 功能漫谈 我们项目和引擎里面的每个模块都有 ...

  2. UnrealBuildTool的RulesScope-Unreal4源码拆解-UnrealBuildTool功能流程解析

    Unreal4源码拆解-UnrealBuildTool功能流程解析-UnrealBuildTool的RulesScope 知乎专栏:UBT源码解析 RulesScope类介绍 功能漫谈 RulesSc ...

  3. java递归生成树结构_突破CRUD | 万能树Java工具类封装(源码)

    0.学完本文你或许可以收获 感受一个树工具从初始逐步优化完善的过程 树工具封装的设计思考与实现思路 最后收获一款拿来即用的树工具源代码 对于前端树组件有一定了解和使用过的同学可直接跳跃到第3章节开始. ...

  4. Java 常用工具类 Collections 源码分析

    文章出处 文章出自:安卓进阶学习指南 作者:shixinzhang 完稿日期:2017.10.25 Collections 和 Arrays 是 JDK 为我们提供的常用工具类,方便我们操作集合和数组 ...

  5. Android开发之Android5.1.1(CM12.1)源码中短信发送流程解析

    首先我要从SmsManager开始一步步深入了解,相信大家在学习Android基础的时候接触过这个类.它在/frameworks/opt/telephony/src/java/android/tele ...

  6. hibernate 并发获取session失败 空指针_高并发之|通过ThreadPoolExecutor类的源码深度解析线程池执行任务的核心流程...

    核心逻辑概述 ThreadPoolExecutor是Java线程池中最核心的类之一,它能够保证线程池按照正常的业务逻辑执行任务,并通过原子方式更新线程池每个阶段的状态. ThreadPoolExecu ...

  7. 微信小程序:升级版手机检测微信工具小程序源码

    这是一款升级版检测工具 自动检测手机真伪,序列号等等 另外还可以给手机检测各项功能是否正常 由于能检测的项目太多,所以大家到时候自行研究吧 小编就不多做介绍 另外支持多做流量主模式,比如激励视频,ba ...

  8. 在线教育专业建站工具 EduWind ,源码下载,源码分享网整理

    在线教育专业建站工具 EduWind ,源码下载, Eduwind是由北京水木信步网络科技有限公司开发的网校服务,公司位于清华科技园.目前,EduWind的产品系列包括以下两大版本: EduWind网 ...

  9. 24 UsageEnvironment使用环境抽象基类——Live555源码阅读(三)UsageEnvironment

    24 UsageEnvironment使用环境抽象基类--Live555源码阅读(三)UsageEnvironment 24 UsageEnvironment使用环境抽象基类--Live555源码阅读 ...

最新文章

  1. 【青少年编程】【Scratch】10 画笔模块
  2. python【蓝桥杯vip练习题库】ALGO-236大小写转换
  3. 何李石:七牛直播云技术详解
  4. Fully Convolutional Networks for Semantic Segmentation (FCN)论文翻译和理解
  5. 牛客多校3 - Sort the Strings Revision(笛卡尔树+分治)
  6. 前端学习(2384):element介绍
  7. POJ-2773 欧几里得 + 二分 + 容斥
  8. c++primer 3.2,3.3练习题
  9. 未来的语音世界——中国智能语音市场分析
  10. 超过马云!中国第二大富豪诞生:年仅40岁,财富已达3200亿
  11. 关于CentOS 7(Linux)下 软件|脚本 的自启动
  12. mysq;多表查询 总结
  13. 金特会谈:有骨气的人,才会被人尊重
  14. mongodb oplog java_MongoDB oplog 深入剖析
  15. iperf3使用方法 linux,iperf3命令使用
  16. fcm基本原理_fcm聚类算法原理及应用
  17. ArcGIS API For Javascript之地图基本加载与显示,地图切换、缩放、定位、比例尺、鹰眼图、坐标显示、查询搜索功能实现
  18. java选取最大数字_用Java程序找最大的数字(4.1)
  19. 君莫笑系列视频学习(3)
  20. 【图像处理】漫水填充函数的使用(flags的用法)

热门文章

  1. 编程珠玑--粗略估算
  2. NPDP第三章:新产品流程
  3. PTA 1003 我要通过! (20 分)
  4. 嵌入式开发语言-C语言编程
  5. FileLock——Java文件锁
  6. ssis trainning
  7. 后台如何清理软Raid
  8. 刻意练习这本书。。。。。。。
  9. LINUX IIO子系统分析之七 虚拟iio device驱动实现
  10. Flutter开发环境配置