生成敌人问题

本文关键字:问题 敌人 | 更新日期: 2023-09-27 18:04:58

我试图让我的游戏在玩家到达一个路径点时生成敌人。

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

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

Destroy(gameObject)

虽然这工作的第一个方式点,第二个不会产生任何东西作为游戏对象,我的碰撞类已被附加到已被破坏。然而,我所有的敌人都是预制物,我认为destroy函数只会破坏预制物的实例。无论何时调用instantiate方法,它都只会销毁该实例。

我用以下方法生成敌人:

  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"的对象已被销毁,但你仍然正在访问

生成敌人问题

我的猜测是游戏对象被两个不同的碰撞事件"摧毁"了。第一个程序销毁它,第二个程序抛出错误。

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

如果没有看到进一步的代码,我无法推测错误的起源,但以上是我最好的猜测。SendMessage也可以接受一个dontrequirerreceiver参数,所以当两个冲突事件试图向它发送消息时,它不会弹出一个错误。

与其摧毁它们,不如用gameObject.SetActive()disable它们!