Refactorizando la información de los hexágonos: tipos, enum y mapa centralizado
En este artículo vamos a revisar cómo hemos mejorado la forma en la que manejamos los datos de cada hexágono en nuestra cuadrícula flat-top. Pasamos de usar strings para identificar el tipo de terreno a una estructura más robusta con enums, y creamos un sistema centralizado para acceder a la información de cualquier tile desde cualquier parte del juego.
¿Por qué evitar strings para los tipos de terreno?
Inicialmente teníamos algo como esto en HexTileInfo
:
public string tileType; // Ej: "ocean", "grass", "forest"
Esto funcionaba, pero tenía varios problemas:
- Mayor propensión a errores tipográficos.
- Comparaciones de strings menos eficientes.
- No hay ayuda de autocompletado en el editor.
La solución fue introducir un enum
llamado TileType
:
public enum TileType
{
Grass,
Forest,
Hill,
Mountain,
Ocean,
Desert
}
Y luego actualizar HexTileInfo
:
public TileType tileType;
Unity lo muestra como un dropdown en el Inspector, y desde código las comparaciones son seguras y rápidas:
if (tile.tileType == TileType.Ocean)
{
// Bloquear movimiento
}
Centralizando el mapa con HexMapManager
Para evitar tener que hacer raycasts o buscar GameObjects cada vez que queramos saber algo sobre un tile, creamos una clase llamada HexMapManager
que actúa como fuente de verdad para todos los hexágonos.
public class HexMapManager : MonoBehaviour
{
public static HexMapManager Instance { get; private set; }
private Dictionary<Vector2Int, HexTileInfo> tileMap = new();
void Awake()
{
Instance = this;
}
public void RegisterTile(Vector2Int coords, HexTileInfo tile)
{
tileMap[coords] = tile;
}
public bool TryGetTile(Vector2Int coords, out HexTileInfo tile)
{
return tileMap.TryGetValue(coords, out tile);
}
public bool IsNavigable(Vector2Int coords)
{
return TryGetTile(coords, out var tile) && tile.tileType != TileType.Ocean;
}
}
Durante la generación de la cuadrícula, registramos cada tile:
Vector2Int coords = new(col, row);
HexMapManager.Instance.RegisterTile(coords, info);
Y luego podemos consultar desde cualquier script:
if (HexMapManager.Instance.IsNavigable(qrCoords))
{
// Mover al personaje
}
Ventajas de esta refactorización
- Acceso rápido y centralizado a la información de los tiles.
- Código más limpio, seguro y legible.
- Mayor facilidad para extender el sistema (por ejemplo, podríamos agregar
GetMovementCost()
según el tipo de tile).
En el próximo artículo vamos a centrarnos en todo lo relacionado con el movimiento del personaje, desde la selección del tile hasta el seguimiento de cámara inteligente.