使用的是和世界坐标系斜45°角的新坐标系
/// <summary>
/// 不计算Y 返回距离
/// 世界坐标转 新定义坐标
/// </summary>
/// <param name="ve"></param>
private Vector2 RetDistance(Vector3 ve)
{
Vector2 veDis = Vector2.zero;
float veX = Mathf.Abs(ve.x);//那坐标的绝对值
float veZ = Mathf.Abs(ve.z);
if (veZ != 0 && veX != 0)//判断 ve的坐标(排除y轴) 如果在 unity的世界坐标系中的 的X轴 或者Y轴
{
float AsinO = Mathf.Atan(veZ / veX) / Mathf.Deg2Rad;//反余弦ve.z 和 ve.x 求出 夹角
float AsinP = veZ / Mathf.Sin(AsinO * Mathf.Deg2Rad);//先算出 ve.z 和 ve.x 对角线p的长度
if (ve.x > 0 && ve.z > 0)
{
if (veX > veZ)//如果 ve.z 小于 ve.x
{
veDis.x = AsinP * Mathf.Cos((45 - AsinO) * Mathf.Deg2Rad);//算出 自定义坐标系 的x轴
veDis.y = AsinP * Mathf.Sin((45 - AsinO) * Mathf.Deg2Rad);//算出 自定义 坐标的Y轴
}
else if (veX < veZ)
{
veDis.x = AsinP * Mathf.Cos((AsinO - 45) * Mathf.Deg2Rad);//算出 自定义坐标系 的x轴
veDis.y = AsinP * Mathf.Sin((AsinO - 45) * Mathf.Deg2Rad);//算出 自定义 坐标的Y轴
}
else
{
veDis.x = AsinP;
veDis.y = 0;
}
}
else if (ve.x > 0 && ve.z < 0)
{
if (veX > veZ)//如果 ve.z 小于 ve.x
{
veDis.x = AsinP * Mathf.Sin((45 - AsinO) * Mathf.Deg2Rad);//算出 自定义坐标系 的x轴
veDis.y = AsinP * Mathf.Cos((45 - AsinO) * Mathf.Deg2Rad);//算出 自定义 坐标的Y轴
}
else if (veX < veZ)
{
veDis.x = AsinP * Mathf.Sin((45 - AsinO) * Mathf.Deg2Rad);//算出 自定义坐标系 的x轴
veDis.y = AsinP * Mathf.Cos((45 - AsinO) * Mathf.Deg2Rad);//算出 自定义 坐标的Y轴
}
else
{
veDis.x = 0;
veDis.y = AsinP;
}
}
else if (ve.x < 0 && ve.z > 0)
{
if (veX > veZ)//如果 ve.z 小于 ve.x
{
veDis.x = AsinP * Mathf.Sin((AsinO - 45) * Mathf.Deg2Rad);//算出 自定义坐标系 的x轴
veDis.y = AsinP * Mathf.Cos((AsinO - 45) * Mathf.Deg2Rad);//算出 自定义 坐标的Y轴
}
else if (veX < veZ)
{
veDis.x = AsinP * Mathf.Sin((45 - AsinO) * Mathf.Deg2Rad);//算出 自定义坐标系 的x轴
veDis.y = AsinP * Mathf.Cos((45 - AsinO) * Mathf.Deg2Rad);//算出 自定义 坐标的Y轴
}
else
{
veDis.x = 0;
veDis.y = AsinP;
}
}
else if (ve.x < 0 && ve.z < 0)
{
if (veX > veZ)//如果 ve.z 小于 ve.x
{
veDis.x = AsinP * Mathf.Cos((45 - AsinO) * Mathf.Deg2Rad);//算出 自定义坐标系 的x轴
veDis.y = AsinP * Mathf.Sin((45 - AsinO) * Mathf.Deg2Rad);//算出 自定义 坐标的Y轴
}
else if (veX < veZ)
{
veDis.x = AsinP * Mathf.Cos((AsinO - 45) * Mathf.Deg2Rad);//算出 自定义坐标系 的x轴
veDis.y = AsinP * Mathf.Sin((AsinO - 45) * Mathf.Deg2Rad);//算出 自定义 坐标的Y轴
}
else
{
veDis.x = AsinP;
veDis.y = 0;
}
}
else
{
if (veX == 0)
{
veDis.x = veZ * Mathf.Cos(45 * Mathf.Deg2Rad);
veDis.y = veZ * Mathf.Sin(45 * Mathf.Deg2Rad);
}
else if (veZ == 0)
{
veDis.x = veX * Mathf.Cos(45 * Mathf.Deg2Rad);
veDis.y = veX * Mathf.Sin(45 * Mathf.Deg2Rad);
}
else
{
veDis.x = 0;
veDis.y = 0;
}
}
}
return veDis;
}