unityloverz 发表于 2021-12-6 20:38

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

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.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)


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

http://pic1.zhimg.com/v2-62560dba1fe7be0b66ecf1747b8e09e4_r.jpg
页: [1]
查看完整版本: Unreal4源码拆解-UnrealBuildTool功能流程解析-Plugin工具类 ...