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