物理OverlapSphere无法检测到碰撞

时间:2020-07-19 11:40:07

标签: unity3d game-physics physics collision

我想在我的玩家的剑上创建一个对撞机,如果他攻击他会检测到并通过动画事件关闭/打开一个名为(Damage Point)的游戏对象,该对象附带一个脚本,会降低敌人的生命值。 但是在某处无法正确检测到。我试图添加OnDrawGizmos函数来查看我的球体碰撞器,但是即使将其增大,它也无法检测到。

screenshot 1

关于我的问题,最奇怪的是,我对我的怪物宝箱和幻想玩家使用了相同的代码,但是对于宝箱却有效,但对于玩家却没有。

我创建了一个名为PlayerDamage的类,该类附加在一个空的游戏对象上,位于我的剑尖上。

{
        public class PlayerDamage : MonoBehaviour
        public int damageAmount = 2;
        public LayerMask enemyLayer;
    
        void Update()
        {
            Collider[] hits = Physics.OverlapSphere(transform.position, 1.7f, enemyLayer);
            
    
            if (hits.Length > 0)
            {
                if (hits[0].gameObject.tag == MyTags.ENEMY_TAG)
                {
                    print("COLLIDED WITH ENEMY");
                }
            }
        }
    
        private void OnDrawGizmos()
        {
            Gizmos.DrawWireSphere(transform.position, 1.7f);
        }

screenshot 2

在另一个称为PlayerScript的脚本中,该脚本直接附加到播放器上,我有一个名为Attack的函数:

void Attack()
    {
        if (Input.GetKeyDown(KeyCode.K))
        {
            if (!anim.GetCurrentAnimatorStateInfo(0).IsName(MyTags.ATTACK_ANIMATION) || !anim.GetCurrentAnimatorStateInfo(0).IsName(MyTags.RUN_ATTACK_ANIMATION))
            {
                anim.SetTrigger(MyTags.ATTACK_TRIGGER);
            }
        }
    }

screenshot 3

在PlayerScript类中,还有两个函数,分别称为ActivateDamagePoint和DeactivateDamagePoint,它们被分配给攻击动画的动画事件。

void ActivateDamagePoint()
    {
        damagePoint.SetActive(true);
    }

    void DeactivateDamagePoint()
    {
        damagePoint.SetActive(false);
    }

screenshot 4

我再次检查了所有内容是否都在他的图层上,并且标签还可以,但这并不能解决我的问题。

screenshot 5 screenshot 6

就像我之前说过的那样,我使用相同的代码并且可以使用它,但是不幸的是,它不适用于我的玩家。我还在那里具有Activate和Deactivate DamagePoint功能,我的胸部发作动画的动画事件也调用了这些功能。

1 个答案:

答案 0 :(得分:0)

好的,经过1小时的调试,我终于找到了解决方案:

它在MyTags类(所有字符串变量的帮助器类)中,错误是:

public static string ENEMY_TAG = "Enemey";

代替:

public static string ENEMY_TAG = "Enemy";