您如何正确解决另一个脚本功能?

时间:2019-02-19 23:14:35

标签: c# unity3d

我正在尝试从另一个名为Magnum的脚本中的一个脚本中调用名为dieAnim()的函数。

这在Magnum脚本中的Fire功能中:

if (hit.collider.tag == "Alien1")
{
    Alien.dieAnim();
}

在外来脚本中:

public void dieAnim()
{
    Destroy(gameObject);
}

每次尝试运行此命令时,都会说“对象引用未设置为对象的实例”。

3 个答案:

答案 0 :(得分:1)

要更有效地运行它,

if(hit.collider.CompareTag("Alien1")){
    //either
    Destroy(hit.gameObject);
    //or if there is logic in dieAnim()
    hit.collider.GetComponent<Alien>().dieAnim();
}

您的代码无法正常运行的原因是因为您调用dieAnim()函数就像在静态组件上一样。这意味着您试图基本上在所有脚本上调用它。您必须参考您击中的那个外星人的实例。 CompareTag只是一个特殊功能,它使您可以比字符串==字符串比较更快,更有效地比较游戏对象的标签。

答案 1 :(得分:0)

在上面,您似乎正在尝试从外星人的类名调用dieAnim()

您将要使用

hit.collider.gameobject.GetComponent<desiredcomponent>().dieAnim();

在这种情况下,您将作为组件访问Alien类的实例。

为清楚起见进行编辑。

在编辑器中,当您添加脚本时,您正在添加新的单行为。这些作为组件附加到游戏对象。因此,当您要访问一个对象时,就可以访问游戏对象的组件。

因此,要获取其他脚本,您需要在colliider命中的游戏对象上调用get组件。标签还附加在游戏对象本身上

答案 2 :(得分:0)

只需将您的代码重写为以下内容

if (hit.collider.tag == "Alien1")
{
    hit.collider.GetComponent<Alien>().dieAnim();
}

但是,如果dieAnim所做的 only 事情正在销毁被击中的外星人,则无需为此在另一个脚本中调用函数-这就是 overkill < / em>。

只需这样做

if (hit.collider.tag == "Alien1")
{
     Destroy(hit.gameObject);
}