我很难从我的函数中得到相反的结果,以从网格单元获取世界位置:
public class WorldPosition : IMessageSerializable
{
private Vector2Int _map;
private Vector2Int _cell;
private Vector2Int _world;
// Getter setter
// other codes...
public Vector2Int World { get => _world; set { _world = value; UpdateMapAndCell(); } }
// other codes...
public Vector2 ToUnityPosition()
{
float unityX = (World.X * 0.5f - World.Y * 0.5f);
float unityY = 0.25f + (World.X * 0.25f + World.Y * 0.25f);
return new Vector2(unityX, unityY);
}
}
对于 unityY,开始处的 0.25f 是单元格中心的偏移量。我不知道如何创建该函数
public ToWorldPosition(Vector2 unityPosition);
我现在连续尝试了 3 个小时并开始发疯......
我需要这个来更新我的玩家在两点之间移动时的位置。
我们可以在图片上看到: 蓝线是 X 轴:要移动到我的统一空间中的单元格 X+1,它是
+0.5x,+0.25y
。-0.5x,+0.25y
。World.X * 0.5f
并减去 World.Y * 0.5f
,因为 Y 朝相反方向移动(这是等距变换的基本 +x -y)World.X * 0.25f + World.Y * 0.25f
因为 X 和 Y 都上升。开始处的 0.25f
是偏移量,因为我的玩家在 0,0 时不在地图之外。
作为第一步,我会将您的方法概括为
public static class IsometricExtensions
{
public static Vector2 ToUnityPosition(this Vector2Int iso, float cellSize = 0.5f)
{
var unityX = (iso.x - iso.y) * cellSize;
var unityY = (iso.x + iso.y + 1) * cellSize / 2f;
return new Vector2(unityX, unityY);
}
}
现在为了扭转这个局面,你基本上可以将操作一一颠倒
public static Vector2Int ToIsometricPosition(this Vector2 unity, float cellSize = 0.5f)
{
// inverts the offset
unity.y -= cellSize / 2f;
// both directions influence iso X positively
var isoX = unity.x + unity.y;
// Y axis influences positive while X-axis negative
var isoY = unity.y - unity.x;
// finally a step of 1 in any direction in Unity space
// is a step of 2 (= 1 / 0.5) in iso grid space
return Vector2Int.RoundToInt(new Vector2(isoX, isoY) / cellSize);
}