Unity3d 角色旋转

 
 
    /// <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;
    }


猜你喜欢

转载自blog.csdn.net/u013628121/article/details/79745769