2016-04-09 137 views
0

我在实例化一个新对象,一旦它击中边界就销毁旧对象。该对象在正确的位置实例化并具有正确的行为,但是一个脚本不会更新对新对象的引用,即使我已将它写入脚本中。对象引用在新对象实例化后不会更新

碰撞事件:

void OnTriggerExit2D(Collider2D other) 
{ 
    if (other.GetComponent<Rigidbody2D>() == projectile) 
    { 
     Respawn(); 
     Ammo -= 1; 
     SetAmmoCount(); 
     Destroy(GO); 
     UpdateReferences(); 
    } 
} 

UpdateReferences方法:

void UpdateReferences() 
{ 
    projectile = GameObject.FindGameObjectWithTag("Damager").GetComponent<Rigidbody2D>(); 
    tran = GameObject.FindGameObjectWithTag("Damager").GetComponent<Transform>(); 
    GO = GameObject.FindGameObjectWithTag("Damager"); 
} 

每次我运行游戏它似乎并没有能够找到新对象。然而,我已经使用这种方法更新对象引用在其他脚本为同一个对象,它工作得很好。不知道我做错了什么。

重生方法:

void Respawn() 
{ 
    GameObject.Instantiate(player, Vector3.zero, Quaternion.identity); 

    projectile.isKinematic = true; 
    isSpawned = true; 
} 

它编译我用一些不好的名字来引用的对象和事情。是的,我正在实例化的对象是预制件。所以读成Destroy()多一点,我突然想到一个问题我之前具有

void Respawn() 
{ 
    GameObject obj = GameObject.Instantiate(player, Vector3.zero, Quaternion.identity) as GameObject; 
    obj.tag = "Damager"; 
    projectile.isKinematic = true; 
    isSpawned = true; 
} 
+0

Post your Respawn();函数代码 – Programmer

+0

'GameObject.Instantiate(Object,Vector3.zero,Quaternion.identity);'?该代码不应该编译。我想知道你在实例化什么以及如何声明这个对象。这是预制吗?再次更新您的代码。 – Programmer

+0

我使用一个公共的GameObject播放器来引用统一的预制 – geolaw

回答

0

+0

我想过这个,但我不知道GO是什么。伟大的事情你自己想出来。 – Programmer

+0

是的,命名的东西是我不擅长的。感谢您的帮助。 – geolaw

0

替换为你的重生功能。当使用Destroy()时,实际上也会销毁对该对象的引用。因此,在尝试创建新副本并将引用移至该副本时会产生问题。你应该使用的是GameObject.SetActive(),然后引用将全部更新到具有实例化的新对象以及上述问题中的引用更新。

+0

仍然是同样的问题,引用没有更新 – geolaw