public static float FaceAngle(Transform T1, Vector3 where, PBEnums.Axis withoutAxis = PBEnums.Axis.None)
        {
            float dot   = FaceDot(T1, where, withoutAxis);
            float angle = DotToAngle(dot);

            return(angle);
        }
        public static float FaceDot(Transform T1, Vector3 where, PBEnums.Axis withoutAxis = PBEnums.Axis.None)
        {
            Vector3 pos = where - T1.position;

            SetVector3WithoutAxis(ref pos, withoutAxis);
            Vector3 forward = T1.forward.normalized;

            SetVector3WithoutAxis(ref forward, withoutAxis);
            float dot = Vector3.Dot(forward, pos.normalized);

            return(dot);
        }
        /// <summary>
        /// 设置vector3的一个轴的值为defaultValue(默认为0)
        /// </summary>
        /// <param name="v"></param>
        /// <param name="axis"></param>
        /// <param name="defaultValue"></param>
        public static void SetVector3WithoutAxis(ref Vector3 v, PBEnums.Axis axis, float defaultValue = 0)
        {
            switch (axis)
            {
            case PBEnums.Axis.X:
                v.Set(defaultValue, v.y, v.z);
                break;

            case PBEnums.Axis.Y:
                v.Set(v.x, defaultValue, v.z);
                break;

            case PBEnums.Axis.Z:
                v.Set(v.x, v.y, defaultValue);
                break;
            }
        }
 /// <summary>
 /// obj2处于obj面向的点积
 /// </summary>
 /// <param name="T1"></param>
 /// <param name="T2"></param>
 /// <returns></returns>
 public static float FaceDot(Transform T1, Transform T2, PBEnums.Axis withoutAxis = PBEnums.Axis.None)
 {
     return(FaceDot(T1, T2.position, withoutAxis));
 }
        /// <summary>
        /// 面对面
        /// </summary>
        /// <param name="T1"></param>
        /// <param name="T1DegreesDelta"></param>
        /// <param name="T2"></param>
        /// <param name="T2DegreesDelta"></param>
        /// <param name="withoutAxis"></param>
        /// <returns></returns>
        public static bool FaceToFaceWithSpeed(Transform T1, float T1DegreesDelta, Transform T2, float T2DegreesDelta, PBEnums.Axis withoutAxis = PBEnums.Axis.None)
        {
            bool a = FaceToTargetWithSpeed(T1, T2.position, T1DegreesDelta, withoutAxis);
            bool b = FaceToTargetWithSpeed(T2, T1.position, T2DegreesDelta, withoutAxis);

            return(a && b);
        }
        /// <summary>
        /// 面对面
        /// </summary>
        /// <param name="T1"></param>
        /// <param name="T1FormRotation"></param>
        /// <param name="T2"></param>
        /// <param name="T2FormRotation"></param>
        /// <param name="interpolate"></param>
        /// <param name="lerpType"></param>
        /// <param name="withoutAxis"></param>
        /// <returns></returns>
        public static bool FaceToFace(Transform T1, Quaternion T1FormRotation, Transform T2, Quaternion T2FormRotation, float interpolate = 1, PBEnums.LerpType lerpType = PBEnums.LerpType.Lerp, PBEnums.Axis withoutAxis = PBEnums.Axis.None)
        {
            bool a = FaceToTarget(T1, T1FormRotation, T2.position, interpolate, lerpType, withoutAxis);
            bool b = FaceToTarget(T2, T2FormRotation, T1.position, interpolate, lerpType, withoutAxis);

            return(a && b);
        }
        /// <summary>
        /// 以一定距离面向target
        /// </summary>
        /// <param name="transform"></param>
        /// <param name="toTarget"></param>
        /// <param name="degreesDelta"></param>
        /// <param name="withoutAxis"></param>
        /// <returns></returns>
        public static bool FaceToTargetWithSpeed(Transform transform, Vector3 toTarget, float degreesDelta, PBEnums.Axis withoutAxis = PBEnums.Axis.None)
        {
            Vector3 face = toTarget - transform.position;

            SetVector3WithoutAxis(ref face, withoutAxis, 0);
            Quaternion toRotation = Quaternion.LookRotation(face);

            transform.rotation = Quaternion.RotateTowards(transform.rotation, toRotation, degreesDelta);

            if (Quaternion.Angle(transform.rotation, toRotation) <= 0.1)
            {
                transform.rotation = toRotation;
                return(true);
            }
            else
            {
                return(false);
            }
        }
        /// <summary>
        /// 使transform面向target
        /// </summary>
        /// <param name="transform">旋转对象</param>
        /// <param name="formRotation">初始rotation</param>
        /// <param name="toTarget">面向的位置</param>
        /// <param name="interpolate">插值[0-1]</param>
        /// <param name="lerpType">插值类型</param>
        /// <param name="withoutAxis"></param>
        /// <returns></returns>
        public static bool FaceToTarget(Transform transform, Quaternion formRotation, Vector3 toTarget, float interpolate = 1, PBEnums.LerpType lerpType = PBEnums.LerpType.Lerp, PBEnums.Axis withoutAxis = PBEnums.Axis.None)
        {
            Vector3 face = toTarget - transform.position;

            SetVector3WithoutAxis(ref face, withoutAxis, 0);
            Quaternion toRotation = Quaternion.LookRotation(face);

            if (interpolate > 1)
            {
                interpolate = 1;
            }
            switch (lerpType)
            {
            case PBEnums.LerpType.Lerp:
                transform.rotation = Quaternion.Lerp(formRotation, toRotation, interpolate);
                break;

            case PBEnums.LerpType.Slerp:
                transform.rotation = Quaternion.Slerp(formRotation, toRotation, interpolate);
                break;
            }
            if (interpolate == 1)
            {
                return(true);
            }
            else
            {
                return(false);
            }
        }