Unity构建类继承树失败:脚本无控制台输出问题排查
问题分析与修复
关键错误
- IsSubclassOf 逻辑颠倒:你写的
baseType.IsSubclassOf(t)是判断baseType是否继承自t,但你要找的是继承自baseType的子类,正确写法应为t.IsSubclassOf(baseType)。 - 程序集覆盖范围不足:
Assembly.GetExecutingAssembly()只能获取当前项目编译的代码程序集,Unity内置的Object子类(比如MonoBehaviour、Texture)都在官方程序集里,必须加载这些程序集才能遍历到完整的继承树。
修复后的代码
using System; using System.Collections.Generic; using System.Reflection; using UnityEngine; public class FindAll : MonoBehaviour { void Start() { // 收集需要扫描的程序集,包含项目自身和Unity核心程序集 var targetAssemblies = new List<Assembly> { Assembly.GetExecutingAssembly(), Assembly.Load("UnityEngine"), Assembly.Load("UnityEngine.CoreModule") }; foreach (var assembly in targetAssemblies) { FindAllDerivedTypes(assembly, typeof(UnityEngine.Object)); } } void FindAllDerivedTypes(Assembly assembly, Type baseType) { foreach (Type t in assembly.GetTypes()) { // 过滤抽象类,只输出具体可实例化的子类(可选,按需移除) if (!t.IsAbstract && t.IsSubclassOf(baseType)) { Debug.Log($"{t.Name} 是 {baseType.Name} 的子类"); // 递归查找当前子类的下一级子类 FindAllDerivedTypes(assembly, t); } } } }
补充说明
- 如果需要扫描其他Unity扩展程序集(比如UGUI),可以在
targetAssemblies里添加Assembly.Load("UnityEngine.UI")。 - 若要包含抽象子类,删除
!t.IsAbstract判断即可。
内容的提问来源于stack exchange,提问作者Marcello
相关产品推荐
相关产品推荐

