如何将Unity等距坐标转换回正交网格世界坐标?
解法:从Unity坐标反推网格世界坐标
首先推导逆变换的数学公式,原转换逻辑为:
unityX = 0.5 * World.X - 0.5 * World.Y unityY = 0.25 + 0.25 * World.X + 0.25 * World.Y
步骤1:整理方程消去偏移
先把unityY的居中偏移量移到等式左侧,再放大系数简化计算:
2 * unityX = World.X - World.Y --- (1) 4 * (unityY - 0.25) = World.X + World.Y --- (2)
步骤2:联立求解世界坐标
将两个方程相加,消去World.Y得到World.X的表达式:
2*unityX + 4*(unityY - 0.25) = 2*World.X World.X = unityX + 2*unityY - 0.5
将两个方程相减,消去World.X得到World.Y的表达式:
4*(unityY - 0.25) - 2*unityX = 2*World.Y World.Y = 2*unityY - unityX - 0.5
步骤3:实现逆转换函数
由于World是Vector2Int类型,需要对计算结果取整(用Mathf.RoundToInt保证坐标对应正确的网格单元格),最终函数实现如下:
public void ToWorldPosition(Vector2 unityPosition) { float uX = unityPosition.x; float uY = unityPosition.y; // 计算世界坐标的浮点值 float worldXFloat = uX + 2 * uY - 0.5f; float worldYFloat = 2 * uY - uX - 0.5f; // 取整得到整数网格坐标 Vector2Int newWorld = new Vector2Int( Mathf.RoundToInt(worldXFloat), Mathf.RoundToInt(worldYFloat) ); // 赋值并触发原有更新逻辑 World = newWorld; }
验证示例
- 当Unity坐标为
(0, 0.25)(对应原World=(0,0)),代入计算得到World.X=0、World.Y=0,与原转换一致。 - 当Unity坐标为
(0.5, 0.5)(对应原World=(1,0)),代入计算得到World.X=1、World.Y=0,与原转换一致。 - 当Unity坐标为
(-0.5, 0.5)(对应原World=(0,1)),代入计算得到World.X=0、World.Y=1,与原转换一致。
内容的提问来源于stack exchange,提问作者Borhink
相关产品推荐
相关产品推荐

