using System.Collections.Generic; using UnityEngine; public class MengaturGrid : MonoBehaviour { public LayerMask unwalkableMask; public Vector2 gridWorldSize; public float nodeRadius; [HideInInspector] public int visitedNodeCount = 0; Node[,] grid; float nodeDiameter; int gridSizeX, gridSizeY; void Awake() { nodeDiameter = nodeRadius * 2; gridSizeX = Mathf.RoundToInt(gridWorldSize.x / nodeDiameter); gridSizeY = Mathf.RoundToInt(gridWorldSize.y / nodeDiameter); CreateGrid(); } void CreateGrid() { grid = new Node[gridSizeX, gridSizeY]; Vector3 worldBottomLeft = transform.position - Vector3.right * gridWorldSize.x / 2 - Vector3.forward * gridWorldSize.y / 2; for (int x = 0; x < gridSizeX; x++) { for (int y = 0; y < gridSizeY; y++) { Vector3 worldPoint = worldBottomLeft + Vector3.right * (x * nodeDiameter + nodeRadius) + Vector3.forward * (y * nodeDiameter + nodeRadius); bool walkable = !(Physics.CheckSphere(worldPoint, nodeRadius, unwalkableMask)); grid[x, y] = new Node(walkable, worldPoint, x, y); } } Debug.Log("Ukuran grid: " + gridSizeX + " x " + gridSizeY + " = " + (gridSizeX * gridSizeY) + " node"); } public Node NodeFromWorldPoint(Vector3 worldPosition) { float percentX = (worldPosition.x - transform.position.x + gridWorldSize.x / 2) / gridWorldSize.x; float percentY = (worldPosition.z - transform.position.z + gridWorldSize.y / 2) / gridWorldSize.y; percentX = Mathf.Clamp01(percentX); percentY = Mathf.Clamp01(percentY); int x = Mathf.RoundToInt((gridSizeX - 1) * percentX); int y = Mathf.RoundToInt((gridSizeY - 1) * percentY); return grid[x, y]; } public List GetNeighbours(Node node) { List neighbours = new List(); int[,] arah = new int[,] { { 0, 1 }, // atas { 0, -1 }, // bawah { 1, 0 }, // kanan { -1, 0 } // kiri }; for (int i = 0; i < arah.GetLength(0); i++) { int checkX = node.gridX + arah[i, 0]; int checkY = node.gridY + arah[i, 1]; if (checkX >= 0 && checkX < gridSizeX && checkY >= 0 && checkY < gridSizeY) { neighbours.Add(grid[checkX, checkY]); } } return neighbours; } // void OnDrawGizmos() // { // Gizmos.DrawWireCube(transform.position, new Vector3(gridWorldSize.x, 1, gridWorldSize.y)); // if (grid != null) // { // foreach (Node n in grid) // { // Gizmos.color = (n.walkable) ? Color.white : Color.red; // Gizmos.DrawCube(n.worldPosition + Vector3.up * 0.1f, Vector3.one * (nodeRadius * 1.5f)); // } // } // } }