|
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, &#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)
- 功能介绍:
- 确定某个插件是否可以在目标平台和目标配置下被编译
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|