91 lines
2.0 KiB
C#
91 lines
2.0 KiB
C#
using UnityEngine;
|
|
|
|
namespace RootMotion
|
|
{
|
|
public class AxisTools
|
|
{
|
|
public static Vector3 ToVector3(Axis axis)
|
|
{
|
|
return axis switch
|
|
{
|
|
Axis.X => Vector3.right,
|
|
Axis.Y => Vector3.up,
|
|
_ => Vector3.forward,
|
|
};
|
|
}
|
|
|
|
public static Axis ToAxis(Vector3 v)
|
|
{
|
|
float num = Mathf.Abs(v.x);
|
|
float num2 = Mathf.Abs(v.y);
|
|
float num3 = Mathf.Abs(v.z);
|
|
Axis result = Axis.X;
|
|
if (num2 > num && num2 > num3)
|
|
{
|
|
result = Axis.Y;
|
|
}
|
|
if (num3 > num && num3 > num2)
|
|
{
|
|
result = Axis.Z;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public static Axis GetAxisToPoint(Transform t, Vector3 worldPosition)
|
|
{
|
|
Vector3 axisVectorToPoint = GetAxisVectorToPoint(t, worldPosition);
|
|
if (axisVectorToPoint == Vector3.right)
|
|
{
|
|
return Axis.X;
|
|
}
|
|
if (axisVectorToPoint == Vector3.up)
|
|
{
|
|
return Axis.Y;
|
|
}
|
|
return Axis.Z;
|
|
}
|
|
|
|
public static Axis GetAxisToDirection(Transform t, Vector3 direction)
|
|
{
|
|
Vector3 axisVectorToDirection = GetAxisVectorToDirection(t, direction);
|
|
if (axisVectorToDirection == Vector3.right)
|
|
{
|
|
return Axis.X;
|
|
}
|
|
if (axisVectorToDirection == Vector3.up)
|
|
{
|
|
return Axis.Y;
|
|
}
|
|
return Axis.Z;
|
|
}
|
|
|
|
public static Vector3 GetAxisVectorToPoint(Transform t, Vector3 worldPosition)
|
|
{
|
|
return GetAxisVectorToDirection(t, worldPosition - t.position);
|
|
}
|
|
|
|
public static Vector3 GetAxisVectorToDirection(Transform t, Vector3 direction)
|
|
{
|
|
return GetAxisVectorToDirection(t.rotation, direction);
|
|
}
|
|
|
|
public static Vector3 GetAxisVectorToDirection(Quaternion r, Vector3 direction)
|
|
{
|
|
direction = direction.normalized;
|
|
Vector3 result = Vector3.right;
|
|
float num = Mathf.Abs(Vector3.Dot(Vector3.Normalize(r * Vector3.right), direction));
|
|
float num2 = Mathf.Abs(Vector3.Dot(Vector3.Normalize(r * Vector3.up), direction));
|
|
if (num2 > num)
|
|
{
|
|
result = Vector3.up;
|
|
}
|
|
float num3 = Mathf.Abs(Vector3.Dot(Vector3.Normalize(r * Vector3.forward), direction));
|
|
if (num3 > num && num3 > num2)
|
|
{
|
|
result = Vector3.forward;
|
|
}
|
|
return result;
|
|
}
|
|
}
|
|
}
|