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

C# Unity-避免对同一对象进行多次光线投射以多次运行函数,c#,unity3d,raycasting,C#,Unity3d,Raycasting,我正在使用我的武器的光线投射来检测敌人是否被击中,然后我运行一个函数来杀死敌人,并在减少敌人数量的同时杀死玩家。这对于单子弹武器来说效果不错,但是如果我使用的是一把散弹枪,它会发出多个光线投射,它会为每一次子弹命中调用该函数,因此如果所有子弹命中并且敌人的数量减去6,玩家将获得6次死亡 下面是杀死敌人的功能 public void MonsterDeath() { EnemiesRemaining -= 1; Player.GetComponent<PlayerStats

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

下面是杀死敌人的功能

public void MonsterDeath()
{

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

}
public void monster death()
{
EnemiesRemaining-=1;
Player.GetComponent().PlayerGetsKill();
UIManager.SetEnemiesText(EnemiesRemaining+“”);

如果(EnemiesRemaining我确实使用了一个游戏对象列表解决了这个问题,我在其中添加了最近死去的怪物的游戏对象

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();
    }

}

为什么不给你的怪物添加一个有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();
        }
    }
}
公共虚空怪物死亡(游戏对象怪物)
{
MonsterComp MonsterComp=monster.GetComponent();
if(monsterComp!=null&&monsterComp.IsAlive)
{
monsterComp.IsAlive=false;
EnemiesRemaining-=1;
Player.GetComponent().PlayerGetsKill();
UIManager.SetEnemiesText(EnemiesRemaining+“”);

如果(EnemiesRemaining在怪物死亡时禁用其碰撞器。这样,下一次光线投射将不会检测到对其的命中

public void MonsterDeath() //assumes this function is part of the monster's script
{
    GetComponent<Collider>.enabled = false;
    ... existing code....
}
public void MonsterDeath()//假定此函数是怪物脚本的一部分
{
GetComponent.enabled=false;
…现有代码。。。。
}

我对Unity没有太多的经验,但我会先检查光线投射命中率,然后让你的程序决定调用MonsterDeath。你可以将碰撞器保存在一个数组中,并检查它是否是怪物。然后你检查重复并移除它们。然后你对对象调用MonsterDeath函数。我想到的另一件事是是设置一个布尔值,指示怪物是否被击中。实际上,我使用列表做了类似的操作。我将展示我的解决方案,谢谢。我尝试了,但在IsAlive设置为false之前,它似乎仍然通过了kill函数。
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....
}