using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.Tilemaps; public class NodeMap : MonoBehaviour { public Vector2Int mapSize; public Node[,] nodeGrid = new Node[0,0]; public float cellSize; public TileData[] TileDatas; public Dictionary DataFromTiles = new Dictionary(); public Tilemap tilemap; // Start is called before the first frame update void Start() { DataFromTiles = new Dictionary(); foreach (var tileData in TileDatas) { foreach (var tile in tileData.Tiles) { DataFromTiles.Add(tile, tileData); } } CreateNodes(); TileCheck(); } public void TileCheck() { foreach (var n in nodeGrid) { Vector2Int gridPosition = n.gridPosition; Vector3Int TileGridPosition = tilemap.WorldToCell(n.worldPosition); TileBase Tile = tilemap.GetTile(TileGridPosition); if (Tile == null) continue; if (!DataFromTiles.ContainsKey(Tile)) { continue; } n.walkable = DataFromTiles[Tile].walkable; } } // Update is called once per frame void Update() { } public void TeleportTo(GameObject g, Node node) { g.transform.position = node.worldPosition; } public List GetNeighbours(Node node) { List neighbours = new List(); for (int x = -1; x <= 1; x++) { for (int y = -1; y <= 1; y++) { if (x == 0 && y == 0) continue; int checkX = node.gridPosition.x + x; int checkY = node.gridPosition.y + y; if (checkX >= 0 && checkX < mapSize.x && checkY >= 0 && checkY < mapSize.y) { Node item = nodeGrid[checkX, checkY]; neighbours.Add(item); } } } return neighbours; } public void CreateNodes() { nodeGrid = new Node[mapSize.x, mapSize.y]; for (int x = 0; x < nodeGrid.GetLength(0); x++) { for (int y = 0; y < nodeGrid.GetLength(1); y++) { Vector2Int gridPosition = new Vector2Int(x, y); nodeGrid[x, y] = new Node(gridPosition, GetWorldPosition(gridPosition)); Vector3Int TileGridPosition = tilemap.WorldToCell(nodeGrid[x,y].worldPosition); TileBase Tile = tilemap.GetTile(TileGridPosition); //nodeGrid[x, y].walkable = DataFromTiles[Tile].walkable; } } } public Node NodeFromWorldPoint(Vector2 worldPosition) { float percentX = (worldPosition.x + mapSize.x / 2) / mapSize.x; float percentY = (worldPosition.y + mapSize.y / 2) / mapSize.y; percentX = Mathf.Clamp01(percentX); percentY = Mathf.Clamp01(percentY); int x = Mathf.RoundToInt((mapSize.x - 1) * percentX); int y = Mathf.RoundToInt((mapSize.y - 1) * percentY); return nodeGrid[x, y]; } public Vector3 GetWorldPosition(Vector2Int position) { Vector3 worldBottomLeft = transform.position - (Vector3.right * (mapSize.x / 2)) - (Vector3.up * (mapSize.y / 2)); Vector3 worldPoint = worldBottomLeft + (Vector3.right * position.x) + (Vector3.up * position.y); Vector3 cellSizeOffset = new Vector3(cellSize / 2, cellSize / 2, 0); return worldPoint * cellSize + cellSizeOffset; } public bool showIndividualNodes; public void OnDrawGizmos() { Gizmos.DrawWireCube(transform.position,new Vector3(mapSize.x,mapSize.y,1) * cellSize); if (!showIndividualNodes) { return; } foreach (var n in nodeGrid) { Vector3 size = Vector3.one * cellSize; Gizmos.DrawWireCube(n.worldPosition, size); } } }