Unity - 避免对同一对象进行多次光线投射以 运行 多次运行

Unity - avoid multiple raycasts on same object to run function multiple times

我正在为我的武器使用光线投射来检测敌人是否被击中,然后我 运行 有一个功能可以杀死敌人并让玩家在减少敌人数量的同时杀死敌人。这适用于单发子弹武器,但如果我使用的是会发出多个射线投射的霰弹枪,它将为每次子弹击中调用该函数,因此如果所有子弹击中并且敌人数量减去 6,玩家将获得 6 次击杀.

下面是杀敌函数

public void MonsterDeath()
{

    EnemiesRemaining -= 1;
    Player.GetComponent<PlayerStats>().PlayerGetsKill();
    UIManager.SetEnemiesText(EnemiesRemaining + "");
    if (EnemiesRemaining <= 0)
    {
        WaveOver();
    }

}

我尝试在函数的顶部添加以下代码,但没有任何区别。我在想可能是因为在同一个框架中被调用了。

if(EnemiesRemaining <= 0)
{
    return;
}

有办法解决这个问题吗?

我确实使用游戏对象列表解决了这个问题,我在其中添加了最近死亡的怪物的游戏对象。

public void MonsterDeath(GameObject monster)
{
    if(DeadMonsters.Contains(monster))
    {
        return;
    }
    DeadMonsters.Add(monster);
    EnemiesRemaining -= 1;
    Player.GetComponent<PlayerStats>().PlayerGetsKill();
    UIManager.SetEnemiesText(EnemiesRemaining + "");
    if (EnemiesRemaining <= 0)
    {
        WaveOver();
    }

}

然后我稍后清除了列表。

private void StartWave()
{
    EquipmentSpawner.SpawnEquipment();

    SpawnMonster();
    UIManager.SetEnemiesText(WaveEnemies + "");
    DeadMonsters.Clear();

}

为什么不给你的怪物添加一个组件,它上面有一个 bool 属性 调用类似 "IsAlive" 的东西,并且只有在 属性 为真时才杀死怪物。

例如

public class MonsterComp : MonoBehaviour
{
    public bool IsAlive = true;
}

然后您之前的代码将变为

public void MonsterDeath(GameObject monster)
{
    MonsterComp monsterComp = monster.GetComponent<MonsterComp>();
    if (monsterComp != null && monsterComp.IsAlive)
    {
        monsterComp.IsAlive = false;
        EnemiesRemaining -= 1;
        Player.GetComponent<PlayerStats>().PlayerGetsKill();
        UIManager.SetEnemiesText(EnemiesRemaining + "");
        if (EnemiesRemaining <= 0)
        {
            WaveOver();
        }
    }
}

怪物死后关闭其碰撞器。这样,下一个光线投射将不会检测到它的命中。

public void MonsterDeath() //assumes this function is part of the monster's script
{
    GetComponent<Collider>.enabled = false;
    ... existing code....
}