物理学OverlapSphere不能正确响应

问题描述 投票:-1回答:1

我现在还不太明白Physics.OverlapSphere是如何工作的。如下面的代码所示,如果玩家进入重叠球体,那么它应该返回true,但当玩家进入球体时,我一直得到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);
   }

对撞机与怪物[碰撞玩家[][1]][2]

https:/i.stack.imgur.com8Fgh0.png。 https:/i.stack.imgur.comjnubp.png。

不知道什么原因,我发现重叠球在地图中的某个位置能用,但其他位置完全不能用。我想这可能是Unity的一个bug。

奇怪的位置

c# unity3d collider
1个回答
0
投票
  1. 你的球体gizmo和实际的球体是不同的:对于绘制gizmo你用transform.position,但是对于重叠球体--transform.transform.localPosition(不需要像transform.transform那样用double,position和localPosition可以很不同)。我想,这就是答案。

  2. 它很容易被LayerMask搞乱,这是个好办法,但对于测试来说,你最好用tag,或者gameObject.InstanceID,甚至gameObject.name。但这只是小事,总的来说,你处理层的方法是正确的。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.