Physics OverlapSphere 没有正确响应

Physics OverlapSphere does not respond correctly

我现在不太明白 Physics.OverlapSphere 是如何工作的。如下代码所示,如​​果玩家进入重叠球体,那么它应该 return 为真,但当玩家进入球体时,我总是得到 false。 这是调用方法

的脚本
void Update()
   {
       float distance = Vector3.Distance(target.position, transform.position);
       if (distance <= lookRadius)
       {
           agent.SetDestination(target.position);
           if (distance <= agent.stoppingDistance)
           {
               CharacterStats targetStats = target.GetComponent<CharacterStats>();
               Debug.Log(enemy.onPlayerEnter());
               if (targetStats != null && enemy.onPlayerEnter())
               {//if player exist and the player enters the attack area
                   Combat.Attack(targetStats);
               }

               FaceTarget();
           }
       }
       animator.SetFloat("speed", agent.velocity.magnitude); 

这是方法的脚本:

public bool onPlayerEnter()
   {
       Collider[] hitColliders = Physics.OverlapSphere(interactionTransform.transform.localPosition, radius);
       //Debug.Log(interactionTransform.transform.localPosition);
       for(int i = 0; i < hitColliders.Length; i++)
       {
           if(LayerMask.LayerToName(hitColliders[i].gameObject.layer) == "Player")
           {
               Debug.Log("Player enter");
               return true;
           }
       }
       return false;
   }

//visualize the overlapsphere
private void OnDrawGizmosSelected()
   {
       if (interactionTransform == null) interactionTransform = transform;
       Gizmos.color = Color.cyan;
       Gizmos.DrawWireSphere(interactionTransform.position, radius);
   }

collider with monster [与玩家碰撞[][1]][2]

https://i.stack.imgur.com/8Fgh0.png https://i.stack.imgur.com/jnubp.png

不知道为什么,我发现overlapsphere在地图中的某个位置有效,但其余位置根本不起作用。我认为这可能是 Unity 中的一个错误。

weird position

  1. 您的球体 Gizmo 和实际球体不同:对于绘图 Gizmo,您使用 transform.position,但对于重叠球体 - transform.transform.localPosition(不需要像 transform.transform, position 和 localPosition 可以非常不同)。我想,这就是答案。

  2. LayerMask 很容易弄乱,这是一个很好的方法,但是为了测试你最好使用标签,或者 gameObject.InstanceID,甚至 gameObject.name。但它是次要的,总的来说看起来你处理层是正确的。

  3. 确保你的agent.StoppingDistance不要设置得太小

  4. 每帧都使用 GetComponent 是一种不好的做法,就像获取 targetStats 一样。