如何将等距恢复到世界位置?

问题描述 投票:0回答:1

我很难从我的函数中得到相反的结果,以从网格单元获取世界位置:

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

红线是 Y 轴:要移动到我的统一空间中的单元格 Y+1,它是
-0.5x,+0.25y

因此,为了获得统一位置,我们需要涉及网格(世界向量)中的 X 和 Y。
对于 X:我们添加
World.X * 0.5f
并减去
World.Y * 0.5f
,因为 Y 朝相反方向移动(这是等距变换的基本 +x -y)
对于 Y :
World.X * 0.25f + World.Y * 0.25f
因为 X 和 Y 都上升。开始处的
0.25f
是偏移量,因为我的玩家在 0,0 时不在地图之外。

c# unity-game-engine isometric
1个回答
0
投票

作为第一步,我会将你的方法概括为

public static class IsometricExtensions
{
    public static Vector2 ToUnityPosition(this Vector2 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 Vector2 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 new Vector2(isoX, isoY) / cellSize;
}
© www.soinside.com 2019 - 2024. All rights reserved.