利用点乘可以很好的实现这一点,已知 a·b = |a||b|cosβ,我们可以点乘主角到NPC的向量和主角面向的forward方向。然后根据cosβ的正负值来判断在前还是在后。因为cosβ数学函数在(-90°,90°)刚好是大于0的,刚好在前时,两向量的夹角也是这个范围。
Transform targetNpc; void Start () { targetNpc = GameObject.Find("Npc").transform; //计算在前还是在后 cos [-90,90] 为 [0,1] float res = Vector3.Dot(transform.forward, targetNpc.position - transform.position); if (res > 0) { Debug.Log("在前面"); } else if (res < 0) { Debug.Log("在后面"); } else { Debug.Log("在正左或右"); } }
如果说主角的视野范围有限,在一个角度之内,那么也很简单。例如视野范围为60°,那么临界值就是cos(60/2),比这个值大的就是可以看见的,因为cos角度越靠近0(越靠近forward)就越大。