前些日子学了射线寻路的方法,通过往前发出一条射线,如果射线击中的障碍物位置点的法线在射线的右侧,则往右侧转向,如果在左侧,则往左侧转向。如下图所示:
//以下方法为通过对比射线射中的法线来进行躲避障碍物
if (Physics.Raycast (transform.position + Vector3.up * 0.5f, transform.forward, out hit, 10f, lmBarrier)) { //往该角色提高半米的位置的前方发射一条10米的射线,如果有射中障碍物层级的物体
float rotateDir = Vector3.Dot (transform.right, hit.normal); //获取角色右方向与击中位置的法线的点乘结果,主要用于判断障碍物位置,是在角色左边还是右边
Debug.DrawRay (transform.position + Vector3.up * 0.5f, transform.forward * 7, Color.red);
Debug.DrawRay (hit.point, hit.normal, Color.blue);
if (rotateDir >= 0) { //如果大于等于0
transform.Rotate (transform.up * 90 * Time.deltaTime); //则往顺时针方向以90度每秒的方向转动
lookReTime = 0; //避免在躲避障碍物的时候,还会朝向玩家,易发生相反转向
} else {
transform.Rotate (transform.up * -90 * Time.deltaTime); //则往逆时针方向以90度每秒的方向转动
lookReTime = 0;
}
这样子确实能躲避一些简单的障碍物,但是我们很快就可以发现,会有一些问题:当碰到两个障碍物在一起形成夹角时,很有可能导致在这个角落里来回转动,再也走不出这个角落了