当玩家到达某个航路点时,我正试图让我的游戏产生敌人。
现在,我正在使用此功能。当我的玩家进入第一道时,敌人会产生。一旦他杀死了屏幕上的所有敌人,他只会继续前行。然而,当他到达第二个路时,没有敌人产生。
现在,在我的碰撞类中,我调用以下代码行:
Destroy(gameObject)
虽然这是第一种方式的工作,但是第二种方法不会产生任何东西,因为我的碰撞类附加的游戏对象已被破坏。然而,我的所有敌人都是预制件,我认为破坏功能只能破坏预制件的那个实例。无论何时调用实例化方法,它都只会破坏该实例。
我用以下方法产生我的敌人:
public GameObject SpawnEnemies()
{
Vector3 _position = new Vector3(transform.position.x, transform.position.y, transform.position.z);
// instantiate particel system
Instantiate(_particle, _position, Quaternion.identity);
_clone = (GameObject)Instantiate(_enemy, _position, transform.rotation);
_ai = _clone.GetComponent<HV_BaseAI>();
_ai._waypoints = _wayPoints;
return _clone;
}
然后我在碰撞方法中发现以下代码中有多少敌人还活着:
GameObject g, f; // enemies I want to spawn
g = GameObject.FindGameObjectWithTag("SectionController");
f = GameObject.FindGameObjectWithTag("SectionController");
HV_SectionController tempSectionControllerGroundEnemies, tempSectionControllerFlyingEnemies;
tempSectionControllerGroundEnemies = g.GetComponent<HV_SectionController>();
tempSectionControllerFlyingEnemies = f.GetComponent<HV_SectionController>();
tempSectionControllerGroundEnemies._numberOfGroundEnemies.Remove(gameObject); // remove enemies from list
tempSectionControllerFlyingEnemies._numberOfFlyingEnemies.Remove(gameObject);
//Destroy(gameObject);
_numberOfGroundEnemies = tempSectionControllerGroundEnemies._numberOfGroundEnemies.Count;
_numberOfFlyingEnemies = tempSectionControllerFlyingEnemies._numberOfFlyingEnemies.Count;
然后当我想继续前进时,我会做以下检查:
if (_groundEnemiesRemaining == 0)
{
MoveToNextSection();
_sectionStartTime = Time.time;
}
我知道上面的线路目前只检查一种类型的敌人,但它是我现在遇到问题的地面敌人。
有没有人知道如何删除我从第一部分中产生的敌人预制件,一旦它们被击中,然后在下一部分重新生成没有错误:
'GameObject'类型的对象已被破坏,但你仍然存在 试图访问它。
答案 0 :(得分:0)
我的猜测是游戏对象被两个不同的碰撞事件“摧毁”。第一个摧毁它,第二个抛出错误。
我在类似情况下所做的是将Destroy代码放在对象中。然后在碰撞类中,使用gameObject.SendMessage(string)
向实际对象发送消息,然后销毁它。
如果没有看到更多代码,我无法推测错误的来源,但以上是我最好的猜测。 SendMessage也可以使用DontRequireReceiver参数,因此如果两个碰撞事件试图向其发送消息,它将不会弹出错误。
答案 1 :(得分:0)
您可以disable
使用gameObject.SetActive()
而不是销毁它们!