找回密码
 立即注册
查看: 593|回复: 0

Unreal4源码拆解-UnrealBuildTool功能流程解析-Plugin工具类 ...

[复制链接]
发表于 2021-12-6 20:38 | 显示全部楼层 |阅读模式
Unreal4源码拆解-UnrealBuildTool功能流程解析-Plugin

4.2x功能不会差太多
主要功能


  • Plugin静态类,功能上大致是一个工具类,根据文件夹保存了每个加载过的插件信息和.uplugin引用
  • 笔者大胆猜测,其实Unreal官方自己很多插件是没有开源的,所以在UBT中空有大量的完整的流程,但是没有文件。
静态成员数据

static Dictionary> PluginInfoCache


  • 按照根文件夹记录加载过的插件信息列表
static Dictionary> PluginFileCache


  • 按照根文件夹记录加载过的插件.uplugin文件和文件夹信息
静态成员函数

public static void InvalidateCaches_SLOW()


  • 功能介绍:丢弃所有缓存,以便下次加载时候直接重新加载,不是从缓存里面找。
public static Dictionary 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)


  • 功能介绍
  • 确定某个插件是否可以在目标平台和目标配置下被编译

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-22 23:02 , Processed in 0.113705 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表