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