/// <summary> /// 角色旋转到面向点,在Update函数里执行 /// </summary> /// <param name="trans"></param> /// <param name="pos"></param> /// <param name="turnSpeed">旋转取值范围 50-720</param> /// <returns></returns> public bool RotatePosUpdate(Transform trans, Vector3 pos,float turnSpeed=182f) { //计算两个点方向 Vector3 targetPos = pos; Vector3 playerPos = trans.position; //向量减法 和y无关,所以同步一下高度 playerPos.y = targetPos.y; //向量减法,得到一个向量,包含方向和距离 Vector3 dir = targetPos - playerPos; //归一化 去除距离 ,只要方向 dir = dir.normalized; //计算旋转方向 Vector3 move = trans.InverseTransformDirection(dir); //转换为本地坐标 move = Vector3.ProjectOnPlane(move, Vector3.up);// 根据地面的法向量,产生一个对应平面的速度方向 float m_TurnAmount = Mathf.Atan2(move.x, move.z); //产生一个方位角,即与z轴的夹角,用于人物转向 trans.Rotate(0, m_TurnAmount * turnSpeed * Time.deltaTime, 0); //总之转! //计算两个点角度 float angle = Vector3.Angle(playerPos, targetPos); //求出两向量之间的夹角 Vector3 normal = Vector3.Cross(playerPos, targetPos);//叉乘求出法线向量 angle *= Mathf.Sign(Vector3.Dot(normal, Vector3.up)); //求法线向量与物体上方向向量点乘,结果为1或-1,修正旋转方向 if (Mathf.Abs(angle) < 1f)//如果两个点角度小于1度的话,说明转到了 { Debug.LogError("转到位了,angle=:" + angle); return true; } return false; }
Unity3d 角色旋转
猜你喜欢
转载自blog.csdn.net/u013628121/article/details/79745769
今日推荐
周排行