示例:GameObject A附加有一个名为MakeItRain的脚本。该脚本中包含一个公共无效的Drizzle();

GameObject B也有一个脚本,想告诉MakeItRain做Drizzle();

在GameObject B的脚本中,我可以这样做:

public GameObject makeitrain;


然后我必须使用GetComponent到达Drizzle();在我的代码中。
在检查器中,将GameObject A放到makeitrain的插槽中,然后完成。

但是,我也可以在GameObject B的脚本中执行此操作:

public MakeItRain makeitrain;


然后仅在我的GameObject B脚本代码中调用makeitrain.Drizzle();,而无需GetComponent。

在这两种情况下,我都必须在Inspector中将GameObject A拖放到GameObject B的插槽中。

为什么我绝对不应该做最后一个选择,有其他区别或原因吗?我知道第一种方法为我提供了更大的灵活性,因为我还可以调用GameObject A的其他组件,而不仅仅是脚本的东西。只是想知道是否还有其他理由不使用第二种方法。

最佳答案

答案取决于您是否需要调用任何函数或使用MakeItRain脚本中的变量。

如果不需要在MakeItRain脚本中调用任何函数或从中访问任何变量,则最好使用GameObject作为参考。另外,如果您需要做的是激活,去激活,旋转GameObject,然后将GameObject用作参考。

另一方面,如果需要能够从多个位置调用Drizzle之类的函数或从MakeItRain脚本访问变量,则需要使用MakeItRain引用。目前,使用GameObject引用是没有意义的,因为通过使用它,每次需要调用函数或从附加到它的GetComponent脚本中访问变量时,都必须使用MakeItRain

最后,当使用MakeItRain脚本引用对象时,无需使用makeitrain.gameObject就可以直接轻松地访问其所附的GameObject。这不需要使用GetComponent函数。


  只是想知道是否还有其他理由不这样做
  第二种方法。


原因是由于必须使用GetComponent函数而导致的性能问题。在StartAwake函数中使用一次并初始化MakeItRain变量会更好。

例如,这更好:

public MakeItRain makeitrain;

void Start()
{
    makeitrain = GetComponent<MakeItRain>();
}

void Update()
{
    makeitrain.Drizzle();
}


比这个:

public GameObject makeitrain;

void Update()
{
    makeitrain.GetComponent<MakeItRain>().Drizzle();
}


并且应避免在每帧都必须在本机端搜索组件。

关于c# - 哪个更好:链接到GameObject或Unity中的类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53111289/

10-12 21:07