C# Unity3D:GetComponent(字符串)和GetComponent(类型)之间的结果差异?
我在C# Unity3D:GetComponent(字符串)和GetComponent(类型)之间的结果差异?,c#,unity3d,C#,Unity3d,我在Start() 我换了一些东西,但大部分都没变。此函数中的Debug.Log也会返回一个null,即使我可以在inspector中看到连接了Terrain组件的组件,我在文档中也看不到GameObject.GetComponent(string组件)。我猜它已经过时了。 我建议你改用反射 标题“有什么不同”的实际答案是: newTerrain.GetComponent("Terrain") 返回组件引用,同时 newTerrain.GetComponent<Terrain>()
Start()
我换了一些东西,但大部分都没变。此函数中的
Debug.Log
也会返回一个null
,即使我可以在inspector中看到连接了Terrain
组件的组件,我在文档中也看不到GameObject.GetComponent(string组件)。我猜它已经过时了。
我建议你改用反射 标题“有什么不同”的实际答案是:
newTerrain.GetComponent("Terrain")
返回组件
引用,同时
newTerrain.GetComponent<Terrain>()
但是,两者都有操作符
bool
(因为地形
继承自行为
,该行为继承自组件
,该组件继承自对象
),所以仅为了检查是否存在,两者的行为应该完全相同。。。除了字符串
版本较慢之外
因此,使用string
的重载行为不符合预期,这仍然很奇怪
作为替代方案,您也可以使用带有
类型的重载作为参数,如
public GameObject GetPooledObject(Type type)
{
... GetComponent(type)
}
和使用
GameObject newTerrain = ObjectPool.Instance.GetPooledObject(typeof(Terrain));
GameObject newTerrain = ObjectPool.Instance.GetPooledObject<Terrain>();
或者让整个对象池方法再次通用,就像
public GameObject GetPooledObject<T>() where T : Component
{
... GetCompoment<T>()
}
public GameObject GetPooledObject(),其中T:Component
{
…GetComponent()
}
和使用
GameObject newTerrain = ObjectPool.Instance.GetPooledObject(typeof(Terrain));
GameObject newTerrain = ObjectPool.Instance.GetPooledObject<Terrain>();
GameObject newTerrain=ObjectPool.Instance.getPooleObject();
newTerrain.GetComponent(“地形”)作为地形
只是一个建议,但请尝试一下,因为我只真正见过与cast attache一起使用的GetComponent(string className)
,您知道您也可以制作Terrain TerrainRefab
而不是使用Terrain nwTerrain=实例化(TerrainRefab)代码>所以你根本不需要调用GetComponent
?测试很好。请发布您的所有测试代码。@Gibbon它应该返回一个组件
,因此如果只是检查是否存在,它应该在没有类型转换的情况下工作。这就是区别的答案:一个返回一个组件
,第一个返回一个地形
。您是否尝试明确使用!=null
?建议对如此简单的事情使用反射是不好的。你应该使用使用类型的方法。是的,反射的性能很差。但它是有效的,糟糕的答案总比没有答案好,就像我回答它时一样。当使用newTerrain.GetComponent()时,它会从类型“Terran”返回一个组件。调用其他方法/重载时,您必须自己将其强制转换为targettype。还要记住,string重载是获取组件最慢的重载,因为反射用于从给定字符串获取类型和实例,并向目标类型进行额外的强制转换/装箱,但为什么它们的行为方式不同,其中一条语句返回true,另一条语句返回true,false?所以我只是尝试了GetPooledObject(Type)
但是GameObject newTerrain=ObjectPool.Instance.GetPooledObject(Terrain)
告诉我你必须使用typeof(Terrain)
GameObject newTerrain = ObjectPool.Instance.GetPooledObject<Terrain>();