项目需要知道某个物体是不是在角色-60°到90°之间,因此要判断两个物体在XZ平面上的夹角。
可以看到人物只有在-60°到90°之间才会转头看向Cube。而在-180°到-60°和90°到180°之间不会。
先附代码
Vector3 dirA = targetPosition - this.transform.position;
Vector3 dirB = this.transform.forward;
//Vector3.Project计算向量在指定轴上的投影,向量本身减去此投影向量就为在XZ平面上的向量
Vector3 dirA_XZ = dirA - Vector3.Project(dirA,Vector3.up);
Vector3 dirB_XZ = dirB - Vector3.Project(dirB,Vector3.up);
//这个方法的意图是求from向量与to向量之间的夹角,并且此夹角的大小为两者之间的锐角,所以,不管什么情况,这个函数返回的值都不可能大于180
float angle = Vector3.Angle(dirB_XZ,dirA_XZ);
//Vector3.Cross 叉乘返回为同时垂直于两个参数向量的向量,方向可朝上也可朝下,由两向量夹角的方向决定。
Vector3 ABCross = Vector3.Cross(dirB, dirA);
//判断是人物左边还是右边
float dir = (ABCross.y > 0) ? 1 : -1;
angle *= dir;
(1)首先要获得dirA人物到Cube的向量,dirB人物正前方的向量
(2)用Vector3.Project
函数求dirA和dirB在Vector3.up
轴上的投影(即y轴的投影),然后用dirB 减去这个投影就得到了dirB在XZ平面的投影。
(3)用Vector3.Angle
计算夹角,但这个夹角的大小为两个向量之间的锐角,所以,不管什么情况,这个函数返回的值都为0到180。所以还要判断人物在Cube的左边还是右边。
(4)用Vector3.Cross(dirB, dirA)
判断左右。左手大拇指为dirB方向,中指为dirA方向,此时食指指向的方向就算Vector3.Cross
返回的结果。可以看到此时食指向下,即ABCross.y
肯定<0,也就代表Cube在人物的左边,因此角度为负。你把Cube放在人物右边,就ABCross.y
肯定>0,则角度为正。
露西亚让我好好学Unity!!!