using UnityEngine;
public class MapFrameConverter : MonoBehaviour
{
[Header("Map frame data")]
[SerializeField] private float mapOriginX = 0f;
[SerializeField] private float mapOriginY = 0f;
[SerializeField] private float mapResolution = 0.05f;
[SerializeField] private int mapWidth = 0;
[SerializeField] private int mapHeight = 0;
public float MapOriginX => mapOriginX;
public float MapOriginY => mapOriginY;
public float MapResolution => mapResolution;
public int MapWidth => mapWidth;
public int MapHeight => mapHeight;
public float MapWidthMeters => mapWidth * mapResolution;
public float MapHeightMeters => mapHeight * mapResolution;
public void SetMapInfo(float originX, float originY, float resolution, int width, int height)
{
mapOriginX = originX;
mapOriginY = originY;
mapResolution = resolution;
mapWidth = width;
mapHeight = height;
Debug.Log(
$"[MapFrameConverter] origin=({mapOriginX:F2}, {mapOriginY:F2}) " +
$"resolution={mapResolution:F3} size=({MapWidthMeters:F2}m, {MapHeightMeters:F2}m)"
);
}
///
/// Convierte coordenadas globales del frame 'map' a coordenadas locales de Unity.
/// map_x -> Unity X
/// map_y -> Unity Z
/// Unity Y = altura visual
///
public Vector3 MapToLocal(float mapX, float mapY, float yHeight = 0f)
{
float localX = mapX - mapOriginX;
float localZ = mapY - mapOriginY;
return new Vector3(localX, yHeight, localZ);
}
///
/// Igual que MapToLocal, pero solo en 2D (X,Z).
///
public Vector2 MapToLocal2D(float mapX, float mapY)
{
float localX = mapX - mapOriginX;
float localZ = mapY - mapOriginY;
return new Vector2(localX, localZ);
}
///
/// Convierte coordenadas locales de Unity de vuelta al frame 'map'.
/// Unity X -> map_x
/// Unity Z -> map_y
///
public Vector2 LocalToMap(float localX, float localZ)
{
float mapX = localX + mapOriginX;
float mapY = localZ + mapOriginY;
return new Vector2(mapX, mapY);
}
///
/// Devuelve el centro del mapa en coordenadas locales.
/// Si el origen local es la esquina inferior izquierda del mapa, el centro es (width/2, height/2).
///
public Vector3 GetLocalMapCenter(float yHeight = 0f)
{
return new Vector3(MapWidthMeters * 0.5f, yHeight, MapHeightMeters * 0.5f);
}
///
/// Comprueba si un punto del frame 'map' cae dentro de los límites del mapa actual.
///
public bool IsInsideMap(float mapX, float mapY)
{
float localX = mapX - mapOriginX;
float localZ = mapY - mapOriginY;
return localX >= 0f && localX <= MapWidthMeters &&
localZ >= 0f && localZ <= MapHeightMeters;
}
///
/// Comprueba si un punto local de Unity cae dentro de los límites del mapa actual.
///
public bool IsInsideLocalMap(float localX, float localZ)
{
return localX >= 0f && localX <= MapWidthMeters &&
localZ >= 0f && localZ <= MapHeightMeters;
}
}