我现在还不太明白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。
你的球体gizmo和实际的球体是不同的:对于绘制gizmo你用transform.position,但是对于重叠球体--transform.transform.localPosition(不需要像transform.transform那样用double,position和localPosition可以很不同)。我想,这就是答案。
它很容易被LayerMask搞乱,这是个好办法,但对于测试来说,你最好用tag,或者gameObject.InstanceID,甚至gameObject.name。但这只是小事,总的来说,你处理层的方法是正确的。
确保你的agent.StoppingDistance不要设置的太小。
每一帧都使用GetComponent是一种不好的做法,就像你使用get targetStats一样。