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
您的球体 Gizmo 和实际球体不同:对于绘图 Gizmo,您使用 transform.position,但对于重叠球体 - transform.transform.localPosition(不需要像 transform.transform, position 和 localPosition 可以非常不同)。我想,这就是答案。
LayerMask 很容易弄乱,这是一个很好的方法,但是为了测试你最好使用标签,或者 gameObject.InstanceID,甚至 gameObject.name。但它是次要的,总的来说看起来你处理层是正确的。
确保你的agent.StoppingDistance不要设置得太小
每帧都使用 GetComponent 是一种不好的做法,就像获取 targetStats 一样。
我现在不太明白 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
您的球体 Gizmo 和实际球体不同:对于绘图 Gizmo,您使用 transform.position,但对于重叠球体 - transform.transform.localPosition(不需要像 transform.transform, position 和 localPosition 可以非常不同)。我想,这就是答案。
LayerMask 很容易弄乱,这是一个很好的方法,但是为了测试你最好使用标签,或者 gameObject.InstanceID,甚至 gameObject.name。但它是次要的,总的来说看起来你处理层是正确的。
确保你的agent.StoppingDistance不要设置得太小
每帧都使用 GetComponent 是一种不好的做法,就像获取 targetStats 一样。