public static void DrawGizmosGrid <T>(UnityGrid <T> grid) { Gizmos.color = grid.Color; Rect rect = new Rect(grid.Position - grid.WorldSize / 2, grid.WorldSize); Vector2 startLine = rect.min; Vector2 endLine = new Vector2(rect.xMin, rect.yMax); Vector2 step = new Vector2(grid.CaseSize, 0); for (int i = 0; i <= grid.width; i++) { Gizmos.DrawLine(startLine, endLine); startLine += step; endLine += step; } startLine = rect.min; endLine = new Vector2(rect.xMax, rect.yMin); step = new Vector2(0, grid.CaseSize); for (int i = 0; i <= grid.height; i++) { Gizmos.DrawLine(startLine, endLine); startLine += step; endLine += step; } }
private void Start() { grid = FindObjectOfType <UnityGrid>(); }
/// <summary> /// Evaluate the grid's tiles and update for a new valid connection if possible. /// </summary> /// <param name="grid">The grid to be evaluated.</param> public void Evaluate(UnityGrid grid) { if (grid.State == UnityGrid.GridStates.Unsolved) { //Check for valid starting tile before checking the grid and connect it if necessary if (grid.CableTileGrid[0, 0].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[0].IsValid) { if (grid.CableTileGrid[0, 0].GetComponent <UnityCableTile>().CableState != CableTile.CableStates.Connected) { grid.CableTileGrid[0, 0].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected; grid.LastConnectedTile = grid.CableTileGrid[0, 0]; } else { UnityCableTile lastConnectedTile = grid.LastConnectedTile.GetComponent <UnityCableTile>(); //i - vertical, j - horizontal for (int i = 0; i < grid.CableTileGrid.GetLength(0); i++) { for (int j = 0; j < grid.CableTileGrid.GetLength(1); j++) { if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>() == lastConnectedTile) { //Check if this is the EndTile and mark Solved IF it has a valid Right if (grid.CableTileGrid[i, j] == grid.CableTileGrid[grid.CableTileGrid.GetLength(0) - 1, grid.CableTileGrid.GetLength(1) - 1] && grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[2].IsValid == true) { grid.State = UnityGrid.GridStates.Solved; Debug.Log("Solved!"); } //Check Tile to Right else if (CanConnectRight(i, j)) { grid.CableTileGrid[i, j + 1].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected; grid.LastConnectedTile = grid.CableTileGrid[i, j + 1]; } //Check Tile to Bottom else if (CanConnectBottom(i, j)) { grid.CableTileGrid[i + 1, j].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected; grid.LastConnectedTile = grid.CableTileGrid[i + 1, j]; } //Check Tile to Top else if (CanConnectTop(i, j)) { grid.CableTileGrid[i - 1, j].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected; grid.LastConnectedTile = grid.CableTileGrid[i - 1, j]; } //Check Tile to Left else if (CanConnectLeft(i, j)) { grid.CableTileGrid[i, j - 1].GetComponent <UnityCableTile>().CableState = CableTile.CableStates.Connected; grid.LastConnectedTile = grid.CableTileGrid[i, j - 1]; } } } } } } } #region Surrounding-Tile Checkers bool CanConnectRight(int i, int j) { //Return false Immediately if it goes beyond grid bounds. if (j + 1 > grid.CableTileGrid.GetLength(1) - 1) { return(false); } if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[2].IsValid && grid.CableTileGrid[i, j + 1].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[0].IsValid && grid.CableTileGrid[i, j + 1].GetComponent <UnityCableTile>().CableState == CableTile.CableStates.Revealed) { return(true); } return(false); } bool CanConnectBottom(int i, int j) { //Return false Immediately if it goes beyond grid bounds. if (i + 1 > grid.CableTileGrid.GetLength(0) - 1) { return(false); } if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[3].IsValid && grid.CableTileGrid[i + 1, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[1].IsValid && grid.CableTileGrid[i + 1, j].GetComponent <UnityCableTile>().CableState == CableTile.CableStates.Revealed) { return(true); } return(false); } bool CanConnectTop(int i, int j) { if (i - 1 < 0) { return(false); } if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[1].IsValid && grid.CableTileGrid[i - 1, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[3].IsValid && grid.CableTileGrid[i - 1, j].GetComponent <UnityCableTile>().CableState == CableTile.CableStates.Revealed) { return(true); } return(false); } bool CanConnectLeft(int i, int j) { if (j - 1 < 0) { return(false); } if (grid.CableTileGrid[i, j].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[0].IsValid && grid.CableTileGrid[i, j - 1].GetComponent <UnityCableTile>().cableTile.Cable.Nodes[2].IsValid && grid.CableTileGrid[i, j - 1].GetComponent <UnityCableTile>().CableState == CableTile.CableStates.Revealed) { return(true); } return(false); } #endregion }