Unity3d 统一-如何在摧毁后重生一个游戏对象

Unity3d 统一-如何在摧毁后重生一个游戏对象,unity3d,unityscript,Unity3d,Unityscript,我用unity开发我的游戏。我创造了一个简单的游戏,就像足球一样。进球后,球应该被摧毁,然后重新出现在原来的位置 我已将此脚本附加到我的目标对象 public GameObject ball; Vector3 ballPosition = new Vector3 (4.51f,0.10f,-3.78f); void OnTriggerEnter(Collider other) { StartCoroutine ("RespwanBall"); } IE

我用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函数,它在第一次碰撞时会给出相同的错误

我怎么做?请帮忙


谢谢。

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

如果脚本附加到球上,那么它就可以工作,因为在这种情况下,
ball
将是它自己,因此销毁方法将始终在活动球中激活

如果要将其附加到球门,请确保将克隆更新为活动球:

IEnumerator RespwanBall() {
    Destroy (ball.gameObject);
    ball = (GameObject)Instantiate (ball, ballPosition, Quaternion.identity);
    yield return null;
}
此外,BlueRaja的评论是可以用来改进代码的重要内容:

  • ball.GameObject
    可以是
    ball
    ,因为
    ball
    是一个
    GameObject
  • 您要从实例化中强制转换两次结果,请检查它
  • 至少有了这段代码,RespwanBall没有理由成为一个协同程序
  • 你错叫“重生”
  • 您可以使用此脚本尝试重新启用对象-
    使用UnityEngine;
    使用系统集合;
    公共类副本:MonoBehavior
    {
    [序列化字段]
    private GameObject prefable=null;//在编辑器中将多维数据集预制分配给此
    void Start()
    {
    //不需要本地预置变量,也不需要调用Resources.Load();
    对于(int i=0;i<4;++i)
    {
    实例化(预置,新向量3(0,i*10,0),四元数.identity);//您可以在实例化中直接分配位置
    }
    }
    }
    
    这有很多问题。。。1. <代码>球。游戏对象应该是
    ball
    2。您正在从
    Instantiate
    两次3中强制转换结果。
    respanball
    没有理由成为协同程序4。您从未将
    ball
    设置为
    clone
    5。你错贴了“重生”:@BlueRaja DannyPflughoeft Thanx,因为你指出了所有这些错误。我真的应该努力。Thanx很多。@BlueRaja DannyPflughoeft你能详细说明第四步的修正吗。ThankYou@BlueRaja谢谢你的编辑,我只是复制了他的代码,没有注意到!我已经用BlueRaja建议的更正尝试了你的代码。现在它甚至没有破坏这个物体。很抱歉之前的评论。我已经试过你的代码,现在它给我第一次重生后相同的错误。将其连接到目标对象。当我将其连接到球时,它起作用。谢谢,但仍然想知道它是否附加到目标的方法。@AshishBeuwria如果要将其附加到目标,请确保通过执行ball=(GameObject)实例化将克隆更新为活动球。。。
    You can try respawning the object by using this script -
    
    
    
    
    using UnityEngine;
    using System.Collections;
    
    public class copy : MonoBehaviour
    {
    
    
    
    
         [SerializeField]
        private GameObject prefab = null; // assign Cube prefab to this in Editor
        void Start()
        {
            // no need for a local prefab variable, nor a call to Resources.Load();
            for (int i = 0; i < 4; ++i)
            {
                Instantiate(prefab, new Vector3(0, i * 10, 0), Quaternion.identity); // you can directly assign position in Instantiate
            }
        }
    
    }