c# - Unity - 如何在销毁后重生游戏对象

标签 c# unity-game-engine

我正在使用 unity 来开发我的游戏。我创建了一个简单的游戏,就像足球一样,进球后球应该被摧毁,然后重新出现在原来的位置。

我已将此脚本附加到我的目标对象。

public GameObject ball;
Vector3 ballPosition = new Vector3 (4.51f,0.10f,-3.78f);

void OnTriggerEnter(Collider other)  
    {

        StartCoroutine ("RespwanBall");

    }

IEnumerator RespwanBall() {

    GameObject clone = (GameObject)Instantiate (ball, ballPosition, Quaternion.identity) as GameObject;

    Destroy (ball.gameObject);

    yield return null;

}

但它仅在第一次有效。然后在第二次销毁之后,它会给出一个错误,指出该对象已被删除,并且您正在尝试访问已删除的对象或类似的内容。如果我在 OntriggerEnter 函数中使用 destroy 函数,它会在第一次碰撞期间给出相同的错误。

我该怎么做?请帮忙。

谢谢。

最佳答案

您正在尝试访问已删除的对象,因为您将脚本附加到球门,并且您始终删除球,并且您的克隆永远不会成为球(因此它始终是同一个球)。

如果脚本附加到球上,它就会起作用,因为在这种情况下,球将是其本身,因此销毁方法将始终在事件球中激活。

如果您想将其附加到球门,请确保将您的克隆更新为事件球:

IEnumerator RespwanBall() {
    Destroy (ball.gameObject);
    ball = (GameObject)Instantiate (ball, ballPosition, Quaternion.identity);
    yield return null;
}

此外,BlueRaja 的注释非常重要,您可以使用它们来改进代码:

  1. ball.GameObject 可能只是 ball,因为 ball 一个 GameObject >;
  2. 您正在两次实例化结果,请检查 this question to know more关于它;
  3. 至少在这段代码中,RespwanBall 没有理由成为协程;
  4. 您拼错了“Respawn”。

关于c# - Unity - 如何在销毁后重生游戏对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21504466/

相关文章:

c# - 如何更改点光源内 'Draw Halo'的值-Unity3D

c# - 如何在 Entity Framework 投影中有效地获取远距离关系

c# - 那么 C#4.0 代码契约真的可以做任何事吗?

c# - 使用来自 Unity C# 的参数运行 .exe 文件

unity-game-engine - Unity3D 如何在不需要 PhysX 运行时的情况下使用 PhysX?

c# - 访问 Easy Movie Texture 的文件路径

c# - Java 中的 Lambda 表达式?

c# - 如何在运行时替换 HTML 的占位符值并使用 iTextSharp 生成 PDF?

c# - WebAPI 多个冲突路由 - 基于身份验证

unity-game-engine - 统一网络: concurrent users