Unreal4源码拆解-UnrealBuildTool功能流程解析-Plugin工具类 ...
Unreal4源码拆解-UnrealBuildTool功能流程解析-Plugin4.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, &#34;Plugins&#34;, 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, &#34;Plugins&#34;, 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, &#34;Plugins&#34;, PluginType.Project));
Plugins.AddRange(ReadPluginsFromDirectory(ProjectDirectory, &#34;Mods&#34;, 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, &#34;&#34;);
if (!DirectoryReference.Exists(FullPath))
{
Log.TraceWarning(&#34;AdditionalPluginDirectory {0} not found. Path should be relative to the project&#34;, FullPath);
}
return ReadPluginsFromDirectory(AdditionalDirectory, &#34;&#34;, 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]