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

本文详细介绍了UnrealBuildTool(UBT)中关于插件管理的功能,包括静态类PluginInfoCache和PluginFileCache的使用,以及InvalidateCaches_SLOW、ToFilteredDictionary、FilterPlugins等方法的作用,如插件有效性验证、覆盖规则和按类型读取插件。此外,还讨论了如何读取引擎、项目及额外目录下的插件,并检查插件是否适用于特定目标平台和配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)

  • 功能介绍
    • 确定某个插件是否可以在目标平台和目标配置下被编译
      在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值