正常调用Type.GetType取不到组件,因为会先创建实例在获取,而Unity组件无法通过new来创建。
第二种创建方式是通过程序集,具体如下
Assembly.GetExecutingAssembly().GetType(typeName);
但是Unity分为两种程序集,运行时和编辑器时,这两种程序集的名字分别是:
Assembly-CSharp
Assembly-CSharp-Editor
所以取指定程序集,更好的方法是这么取:
var assembly = Assembly.Load(assemblyName); assembly.GetType(typeFullName);
Unity后续版本的API中,新增加了一个Types类,通过Types.GetType可以很方便的获取:
Types.GetType(item.ComponentName, "Assembly-CSharp");
注意,上面的方式只能取到自定义组件,Unity的官方组件在UnityEngine程序集中,但不能通过Types来获取
可以用第二种方法来取,亲测可用
var assembly = Assembly.Load("UnityEngine"); Debug.Log("assembly: " + assembly); Debug.Log(assembly.GetType("UnityEngine.GameObject")); //assembly: UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null //UnityEngine.GameObject