Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity3D:GetComponent(字符串)和GetComponent(类型)之间的结果差异?_C#_Unity3d - Fatal编程技术网

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>();