在FindingObject

时间:2018-04-30 14:03:16

标签: c# unity3d

我目前有两个场景。第一个包含一个" PowerUp"宾语。所以脚本:

myPowerUp = GameObject.FindObjectWithTag("Fuel").GetComponent<AddFuel>();

找到对象。

我很难看到如何封装这个,以便在第二个场景中,我不会因为对象WithTag(&#34; Fuel&#34;)而没有引发错误#&# 39;存在吗?

如果我像这样使用bool:

 if (!PowerUpExists){ 
    Return;
 } else {
 myPowerUp = GameObject.FindObjectWithTag("Fuel").GetComponent<AddFuel>() 
 }

这样的事情会起作用吗?我无法理解这种逻辑是怎样的,因为如果你理解了我的意思,怎么能检查是否存在某种东西,而不检查是否存在某种东西?

请帮助,我对此很新,学习,但并没有很好的进展。

1 个答案:

答案 0 :(得分:1)

只需检查gameObject是否存在:

GameObject powerUpGo = GameObject.FindObjectWithTag("Fuel");
if( powerUpGo != null )
{
    myPowerUp = powerUpGo .GetComponent<AddFuel>() ;
}

然后,在使用myPowerUp之前添加条件时:

if( myPowerUp != null )
{
    // Do something with myPowerUp
}

否则,我只是建议您在检查器中对您的对象进行直接序列化引用,这样您就可以在需要加电时进行空检查(并且您不再需要再调用Find

[SerializeField]
private AddFuel myPowerUp ; // Drag & drop the object in the inspector

// ...

if( myPowerUp != null )
{
    // Do something with myPowerUp
}

我可以考虑的最后一种可能性,但需要更多“手动”工作,添加一个布尔值,您将根据您当前所在的场景检查检查器。

[SerializeField]
private bool powerUpExists; // Check / uncheck it in the inspector according to the scene you are working in

// ...

if (!powerUpExists)
{ 
    return;
}
else
{
    myPowerUp = GameObject.FindObjectWithTag("Fuel").GetComponent<AddFuel>() 
}