【问题标题】:Damaging an enemies with OverlapSphere in Unity在 Unity 中使用 OverlapSphere 对敌人造成伤害
【发布时间】:2020-02-11 12:49:00
【问题描述】:

我在 C# 中遇到了 OverlapSphere 的问题。我试图进行一次爆炸,对附近的敌人造成伤害,但如果火箭击中一个目标,它只会对这个目标造成伤害。当火箭在附近敌人的地板或墙壁上爆炸时,它不会造成伤害。

    EnemyHealth target = collision.collider.gameObject.GetComponent<EnemyHealth>();
    Instantiate(explosionEffect, transform.position, transform.rotation);
    Collider [] colliders = Physics.OverlapSphere(transform.position, radius);
    foreach(Collider nearbyObject in colliders)
    {
        Collider enemy = nearbyObject.GetComponent<Collider>();

        if (enemy != null)
        {
            target.TakeDamage(damage); //this fuction deal damage to enemies
        }

我的代码片段。我不知道如何修复它,这是我的第一款游戏,我之前没有使用 Unity 和 C#。

【问题讨论】:

  • 半径是否足以击中目标?对撞机是否正确匹配目标的变换?敌人的对撞机是否在不与爆炸相互作用的层中?我看不出代码有什么问题......可能是统一对象给你带来了麻烦
  • 每个敌人的目标都不会改变......所以你会为每个命中的物体损坏同一个物体
  • 我认为这可能是原因,但我现在不知道如何解决。我应该在现场制作一张所有敌人的表格还是类似的东西?

标签: c# unity3d overlap


【解决方案1】:

您没有在循环中设置敌人EnemyHealth,而是始终使用相同的target 来造成伤害。您需要为每个与您的球体碰撞的对象获取 EnemyHealth 组件:

    Instantiate(explosionEffect, transform.position, transform.rotation);
    Collider [] colliders = Physics.OverlapSphere(transform.position, radius);
    foreach(Collider nearbyObject in colliders)
    {
        // Assuming that the enemy gameobject with the collider also holds the EnemyHealth script (!)
        EnemyHealth enemy = nearbyObject.GetComponent<EnemyHealth>();

        if (enemy != null)
        {
            enemy.TakeDamage(damage); //this fuction deal damage to enemies
        }
    }

注意:调用GetComponent() 可能会很昂贵,所以如果你经常这样做,你应该尝试为敌人缓存EnemyHealth 组件。

【讨论】:

  • 感谢您的帮助,它解决了我的问题 :)
猜你喜欢
  • 2014-12-28
  • 1970-01-01
  • 2016-10-27
  • 2020-10-10
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多