1

当玩家到达一个路点时,我试图让我的游戏产生敌人。

现在,我有这个功能工作。当我的玩家到达第一条路时,敌人会生成。只有在他杀死了屏幕上的所有敌人后,他才会继续前进。然而,当他到达第二个路点时,没有敌人产生。

现在,在我的碰撞类中,我调用以下代码行:

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”类型的对象已被销毁,但您仍在尝试访问它。

4

2 回答 2

0

我的猜测是游戏对象正在被两个不同的碰撞事件“摧毁”。第一个破坏它,第二个抛出错误。

我在类似情况下所做的是将销毁代码放在被销毁的对象中。然后从您的碰撞类中,使用gameObject.SendMessage(string)向实际对象发送消息,该对象会破坏它。

在没有看到更多代码的情况下,我无法推测错误的根源,但以上是我最好的猜测。SendMessage 也可以采用 DontRequireReceiver 参数,因此如果两个碰撞事件尝试向它发送消息,它不会弹出错误。

于 2013-03-27T11:23:59.170 回答
0

而不是摧毁它们,你可以只disable使用它们gameObject.SetActive()

于 2017-01-09T03:19:02.630 回答