You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Unity的GameObject.FindObjectsOfTypeAll()获取正确的Il2Cpp类类型

问题解决方案

核心错误原因

  • 类型不匹配:原生C# typeof(Image)返回的是System.Type,Il2Cpp环境下的GameObject.FindObjectsOfTypeAll()要求传入Il2CppSystem.Type类型参数,二者不能直接隐式转换。
  • 反射类名不完整:调用Il2CppSystem.Type.GetType("Image")时仅传入短类名,没有携带命名空间和程序集信息,无法定位到正确的UnityEngine.UI.Image类,因此返回null触发空引用异常。
  • 遍历项类型错误:FindObjectsOfTypeAll传入组件类型时返回的是对应组件的实例集合,不是GameObject集合,直接用GameObject接收遍历项会导致类型转换失败,无法进入循环。

正确实现代码

方案1:使用Il2CppType.Of<T>()获取类型(最稳妥)

绝大多数Il2Cpp互操作框架(如BepInEx Il2Cpp版、MelonLoader)都提供了该方法直接获取泛型类型对应的Il2CppSystem.Type实例:

// 获取Image对应的Il2Cpp类型
var imageType = Il2CppType.Of<Image>();
// 调用查询方法后强转为Image类型集合遍历
foreach (Image image in GameObject.FindObjectsOfTypeAll(imageType).Cast<Image>())
{
    image.color = panelColor;
}

方案2:使用完整类名反射获取类型

如果你坚持用Il2CppSystem.Type.GetType()方法,需要传入全限定类名+所属程序集名:

// 注意补全命名空间和程序集信息,不同Unity版本程序集名可能有差异,按需调整
var imageType = Il2CppSystem.Type.GetType("UnityEngine.UI.Image, UnityEngine.UI");
foreach (Image image in GameObject.FindObjectsOfTypeAll(imageType).Cast<Image>())
{
    image.color = panelColor;
}

方案3:使用泛型重载(如果框架支持)

部分封装完善的框架会提供FindObjectsOfTypeAll的泛型重载,可以省略手动传类型的步骤:

foreach (Image image in GameObject.FindObjectsOfTypeAll<Image>())
{
    image.color = panelColor;
}

内容的提问来源于stack exchange,提问作者CatShark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 03:54:04