Код: Выделить всё
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);
}
}
Я пробовал 3 часа подряд и начал сходить с ума...
Мне это нужно, чтобы обновить положение моего игрока, пока он путешествует между двумя точками.
[img]https://i.stack .imgur.com/6Flim.png[/img]
На картинке мы видим:
синяя линия — это ось 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.
Подробнее здесь: https://stackoverflow.com/questions/782 ... c-position
Мобильная версия