예제 #1
0
 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();
     }
 }
예제 #2
0
 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);
 }