我正在尝试从另一个名为Magnum的脚本中的一个脚本中调用名为dieAnim()的函数。
这在Magnum脚本中的Fire功能中:
if (hit.collider.tag == "Alien1")
{
Alien.dieAnim();
}
在外来脚本中:
public void dieAnim()
{
Destroy(gameObject);
}
每次尝试运行此命令时,都会说“对象引用未设置为对象的实例”。
答案 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);
}