销毁后重新生成的目标返回错误

时间:2013-12-28 22:40:48

标签: c# unity3d

我使用unity3d c#在特定位置销毁对象后重新生成对象。以下代码返回错误消息:

  

四分之一到矩阵转换失败,因为输入四元数无效

我得到预制件的多次产生几秒钟后出现错误信息,它们会在整个屏幕上产生。

我的代码如下。对于变量respawn,我从Unity本身拖放预制件。谢谢你的指导。

    Transform initialSpawn; 
    Transform respawn;
    public static bool dead = false;

    void Start()
    {
        initialSpawn = Instantiate(respawn, new Vector3(0,7,0), Quaternion.identity) as Transform;
        initialSpawn.parent = transform;
    }

void Update () {
        if (dead == true)
        {
            //The line below is the one giving the error
            initialSpawn = Instantiate(respawn, new Vector3(4, 7, 0), Quaternion.identity) as Transform; 


            initialSpawn.parent = transform;
            StartCoroutine(pauseBeforeReSpawn(2));
            dead = false;
            Debug.Log("test working");
        }

 void OnTriggerEnter(Collider c)
    {
       if(c.gameObject.name =="barrel" || c.gameObject.name == "ground") 
       {
         Destroy(initialSpawn); 
         dead = true;
       }
    }

    IEnumerator pauseBeforeReSpawn(int seconds)  
    {
        yield return new WaitForSeconds(seconds);
    }

这是一个杀死对象的单独类:

public class PlayerManager : MonoBehaviour {
    void Update () {
    }
    void OnTriggerEnter(Collider enter)
    {
        if (enter.collider.gameObject.CompareTag("fruit"))
        {
            ScoreCounter.counter += 10;
            Destroy(enter.gameObject);
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我注意到的一些问题:

  1. 协程放置错误,什么都不做。或者至少它不能做你想做的事。

  2. Destroy()不会破坏同一帧中的对象。因此,您的Update可能会被搞砸,因为对象即将被销毁,但您仍在尝试更改变量initialSpawn所引用的内容。

  3. public static bool dead = false;如果您拥有多个实例,这将导致此对象的所有实例死亡。您应该考虑删除static关键字。

  4. 我认为解决第一个问题也将解决第二个问题。以下是您可以尝试的内容:

    public float respawnTimeOut = 2F;
    public static bool dead = false;
    
    private float timeSinceDeath = 0F;
    private Transform initialSpawn;
    private Transform respawn;
    
    void Start()
    {
       initialSpawn = Instantiate(respawn, new Vector3(0,7,0), Quaternion.identity) as Transform;
       initialSpawn.parent = transform;
    }
    
    void Update () 
    {
        if (dead)
        {                
            if(timeSinceDeath >= respawnTimeOut)    
            {
               initialSpawn = Instantiate(respawn, new Vector3(4, 7, 0), Quaternion.identity) as Transform; 
               initialSpawn.parent = transform;                    
               dead = false;
               timeSinceDeath = 0F;
               Debug.Log("test working");
            }
            else
            {
                // Update death timer
                timeSinceDeath += Time.deltaTime;
            }
         }
    }
    
    void OnTriggerEnter(Collider c)
    {
         if(c.gameObject.name =="barrel" || c.gameObject.name == "ground") 
         {
             Destroy(initialSpawn); 
             dead = true;
         }
    }
    

答案 1 :(得分:1)

试试这个:

 void OnTriggerEnter(Collider c)
    {
       if(!dead && (c.gameObject.name =="barrel" || c.gameObject.name == "ground"))
       {
         Destroy(initialSpawn); 
         dead = true;
       }
    }

我将这与Alex的变化相结合,因为我不太喜欢那里的Coroutine的外观。