float CalcHeuristic(eFindMethod eMethod, float distanceFromStart, TileCell tileCell, TileCell nextTileCell, TileCell targetTileCell)
    {
        switch (eMethod)
        {
        case eFindMethod.DISTANCE:
            return(distanceFromStart);

        case eFindMethod.SIMPLE:
            return(CalcSimpleHeuristic(tileCell, nextTileCell, targetTileCell));

        case eFindMethod.COMPLEX:
            return(CalcComplexHeuristic(nextTileCell, targetTileCell));

        case eFindMethod.ASTAR:
            return(CalcAStarHeuristic(distanceFromStart, nextTileCell, targetTileCell));

        default:
            return(0);
        }
    }
    public void FindPath(eFindMode mode, eFindMethod method)
    {
        bool isViewRange = (eFindMode.VIEW_MOVERANGE == mode || eFindMode.VIEW_ATTACKRANGE == mode);

        while (0 != _pathfindingQueue.Count)
        {
            sPathCommand command = _pathfindingQueue[0];
            _pathfindingQueue.RemoveAt(0);

            if (false == command.tileCell.IsVisit())
            {
                command.tileCell.Visit();

                //FIND TARGET
                if (eFindMode.FIND_PATH == mode)
                {
                    if ((_targetTileCell.GetTileX() == command.tileCell.GetTileX()) &&
                        (_targetTileCell.GetTileY() == command.tileCell.GetTileY()))
                    {
                        _reverseTileCell = _targetTileCell;
                        return;
                    }
                }


                for (eMoveDirection direction = 0; direction <= eMoveDirection.DOWN; direction++)
                {
                    sPosition curPosition;
                    curPosition.x = command.tileCell.GetTileX();
                    curPosition.y = command.tileCell.GetTileY();
                    sPosition nextPosition = GlobalUtility.GetPositionByDirection(curPosition, direction);

                    TileMap  map          = GameManager.Instance.GetMap();
                    TileCell nextTileCell = map.GetTileCell(nextPosition.x, nextPosition.y);

                    if (CheckPrecondition(mode, nextTileCell, _targetTileCell))
                    {
                        float distanceFromStart = command.tileCell.GetDistanceFromStart()
                                                  + command.tileCell.GetDistanceWeight();
                        float heuristic = CalcHeuristic(method, distanceFromStart,
                                                        command.tileCell, nextTileCell, _targetTileCell);

                        if (isViewRange && (_range < distanceFromStart))
                        {
                            return;
                        }

                        if (null == nextTileCell.GetPrevTileCell())
                        {
                            nextTileCell.SetDistanceFromStart(distanceFromStart);
                            nextTileCell.SetPrevTileCell(command.tileCell);

                            sPathCommand newCommand;
                            newCommand.tileCell  = nextTileCell;
                            newCommand.heuristic = heuristic;
                            PushCommand(newCommand);

                            //검색범위를 그려준다.
                            if (isViewRange)
                            {
                                DrawSearchTile(nextTileCell);
                            }
                        }
                    }
                }
            }
        }
    }