public void moving() { if (Input.GetButtonDown("leftClick") && GameState == gameState.moveChoosing) { GameState = gameState.action; switchChoosingMode(); Vector3Int pos = grid.WorldToCell(Camera.main.ScreenToWorldPoint(Input.mousePosition)); //Debug.Log(pos.x+","+pos.y+","+pos.z); //AStar aStar = new AStar(mapManager.getMap().getSize(), mapManager, aStarMode.move); //if (aStar.findPath(activeUnit.getPosition()[0], activeUnit.getPosition()[1], pos.x, pos.y, activeUnit.getSpeed(), activeUnit)) //{ // StartCoroutine(move(aStar, pos, resourceManager.getUnitMovementSpeed())); //} } else { mapManager.clearRangeTilemap(); } }
public bool findPath(int originX, int originY, int targetX, int targetY, int range, Unit movingUnit) { path.Clear(); path.TrimExcess(); close.Clear(); close.TrimExcess(); open.Clear(); open.TrimExcess(); open.Add(tiles[originX, originY]); open[0].parent = open[0]; while (open.Capacity > 1) { open = open.OrderBy(f => f.F).ToList(); current = open[0]; if (current.X == targetX && current.Y == targetY) { mapManager.clearRangeTilemap(); if (current.G > range * 10 || current.G == 0) { return(false); } //Debug.Log(current.F); AStarTile backtraked = current; while (backtraked.parent != backtraked) { path.Insert(0, backtraked); //Debug.Log(backtraked.parent.X + " " + backtraked.parent.Y); //mapManager.pathGenerateTile(backtraked.X, backtraked.Y); backtraked = backtraked.parent; } return(true); } if (current.X - 1 > -1) { if (!tiles[current.X - 1, current.Y].isInClose) { if (tiles[current.X - 1, current.Y].walkable) { tiles[current.X - 1, current.Y].setH(targetX, targetY); if (!tiles[current.X - 1, current.Y].isInOpen || tiles[current.X - 1, current.Y].G > current.G + 10) { tiles[current.X - 1, current.Y].isInOpen = true; tiles[current.X - 1, current.Y].G = current.G + 10; tiles[current.X - 1, current.Y].parent = current; tiles[current.X - 1, current.Y].setF(); open.Add(tiles[current.X - 1, current.Y]); } //Debug.Log(tiles[current.X - 1, current.Y].F); } } } if (current.X + 1 < tiles.GetLength(0)) { if (!tiles[current.X + 1, current.Y].isInClose) { if (tiles[current.X + 1, current.Y].walkable) { tiles[current.X + 1, current.Y].setH(targetX, targetY); if (!tiles[current.X + 1, current.Y].isInOpen || tiles[current.X + 1, current.Y].G > current.G + 10) { tiles[current.X + 1, current.Y].isInOpen = true; tiles[current.X + 1, current.Y].G = current.G + 10; tiles[current.X + 1, current.Y].parent = current; tiles[current.X + 1, current.Y].setF(); open.Add(tiles[current.X + 1, current.Y]); } } } } if (current.Y - 1 > -1 && !tiles[current.X, current.Y - 1].isInClose) { if (!tiles[current.X, current.Y - 1].isInClose) { if (tiles[current.X, current.Y - 1].walkable) { tiles[current.X, current.Y - 1].setH(targetX, targetY); if (!tiles[current.X, current.Y - 1].isInOpen || tiles[current.X, current.Y - 1].G > current.G + 10) { tiles[current.X, current.Y - 1].isInOpen = true; tiles[current.X, current.Y - 1].G = current.G + 10; tiles[current.X, current.Y - 1].parent = current; tiles[current.X, current.Y - 1].setF(); open.Add(tiles[current.X, current.Y - 1]); } } } } if (current.Y + 1 < tiles.GetLength(1)) { if (!tiles[current.X, current.Y + 1].isInClose) { if (tiles[current.X, current.Y + 1].walkable) { tiles[current.X, current.Y + 1].setH(targetX, targetY); if (!tiles[current.X, current.Y + 1].isInOpen || tiles[current.X, current.Y + 1].G > current.G + 10) { tiles[current.X, current.Y + 1].isInOpen = true; tiles[current.X, current.Y + 1].G = current.G + 10; tiles[current.X, current.Y + 1].parent = current; tiles[current.X, current.Y + 1].setF(); open.Add(tiles[current.X, current.Y + 1]); } } } } if (current.X - 1 > -1 && current.Y - 1 > -1) { if (!tiles[current.X - 1, current.Y - 1].isInClose) { if ((tiles[current.X - 1, current.Y - 1].walkable && tiles[current.X - 1, current.Y].walkable) || (tiles[current.X - 1, current.Y - 1].walkable && tiles[current.X, current.Y - 1].walkable)) { tiles[current.X - 1, current.Y - 1].setH(targetX, targetY); if (!tiles[current.X - 1, current.Y - 1].isInOpen || tiles[current.X - 1, current.Y - 1].G > current.G + 15) { tiles[current.X - 1, current.Y - 1].isInOpen = true; tiles[current.X - 1, current.Y - 1].G = current.G + 15; tiles[current.X - 1, current.Y - 1].parent = current; tiles[current.X - 1, current.Y - 1].setF(); open.Add(tiles[current.X - 1, current.Y - 1]); } } } } if (current.X + 1 < tiles.GetLength(0) && current.Y - 1 > -1) { if (!tiles[current.X + 1, current.Y - 1].isInClose) { if ((tiles[current.X + 1, current.Y - 1].walkable && tiles[current.X + 1, current.Y].walkable) || (tiles[current.X + 1, current.Y - 1].walkable && tiles[current.X, current.Y - 1].walkable)) { tiles[current.X + 1, current.Y - 1].setH(targetX, targetY); if (!tiles[current.X + 1, current.Y - 1].isInOpen || tiles[current.X + 1, current.Y - 1].G > current.G + 15) { tiles[current.X + 1, current.Y - 1].isInOpen = true; tiles[current.X + 1, current.Y - 1].G = current.G + 15; tiles[current.X + 1, current.Y - 1].parent = current; tiles[current.X + 1, current.Y - 1].setF(); open.Add(tiles[current.X + 1, current.Y - 1]); } } } } if (current.X - 1 > -1 && current.Y + 1 < tiles.GetLength(1)) { if (!tiles[current.X - 1, current.Y + 1].isInClose) { if ((tiles[current.X - 1, current.Y + 1].walkable && tiles[current.X - 1, current.Y].walkable) || (tiles[current.X - 1, current.Y + 1].walkable && tiles[current.X, current.Y + 1].walkable)) { tiles[current.X - 1, current.Y + 1].setH(targetX, targetY); if (!tiles[current.X - 1, current.Y + 1].isInOpen || tiles[current.X - 1, current.Y + 1].G > current.G + 15) { tiles[current.X - 1, current.Y + 1].isInOpen = true; tiles[current.X - 1, current.Y + 1].G = current.G + 15; tiles[current.X - 1, current.Y + 1].parent = current; tiles[current.X - 1, current.Y + 1].setF(); open.Add(tiles[current.X - 1, current.Y + 1]); } } } } if (current.X + 1 < tiles.GetLength(0) && current.Y + 1 < tiles.GetLength(1)) { if (!tiles[current.X + 1, current.Y + 1].isInClose) { if ((tiles[current.X + 1, current.Y + 1].walkable && tiles[current.X + 1, current.Y].walkable) || (tiles[current.X + 1, current.Y + 1].walkable && tiles[current.X, current.Y + 1].walkable)) { tiles[current.X + 1, current.Y + 1].setH(targetX, targetY); if (!tiles[current.X + 1, current.Y + 1].isInOpen || tiles[current.X + 1, current.Y + 1].G > current.G + 15) { tiles[current.X + 1, current.Y + 1].isInOpen = true; tiles[current.X + 1, current.Y + 1].G = current.G + 15; tiles[current.X + 1, current.Y + 1].parent = current; tiles[current.X + 1, current.Y + 1].setF(); open.Add(tiles[current.X + 1, current.Y + 1]); } } } } open.Remove(current); open.TrimExcess(); current.isInClose = true; close.Add(current); } return(false); }