List <Point> GetPfsPath(Vector2 unitCoords, Vector2 finPoint)
    {
        //Now find path to that point:
        var pathFinder   = new PathFinder();
        var mapGenerator = GameObject.Find("ObstaclesMapGenerator").GetComponent <ObstaclesMapGenerator>();

        CoordConverter = new TileCoordSystemConverter(mapGenerator.WorldSize, mapGenerator.CellSize);
        Point start   = CoordConverter.UW_To_PFS(unitCoords);
        Point goal    = CoordConverter.UW_To_PFS(finPoint);
        var   pfsPath = pathFinder.FindPath(start, goal);

        return(pfsPath);
    }
Пример #2
0
    /// <summary>
    /// Возвращает долю занятой поверхности
    /// тайла с коорд. tileCoords коллайдером
    /// с точками colliderPoints.
    /// Помимо этого коллайдера, учитывает также
    /// коллайдер тайла-препятствия, если таковой на этом тайле присутствует
    /// </summary>
    /// <param name="tileCoords"></param>
    /// <param name="currentColliderIndex"></param>
    /// <param name="colliderPoints"></param>
    /// <param name="resultArray"></param>
    /// <param name="currentColliderGameObject"></param>
    void ProcessTileDuringMapGeneration
    (
        Point tileCoords
        , int currentColliderIndex
        , List <Vector2> colliderPoints
        , double[,] resultArray
        , GameObject currentColliderGameObject
    )
    {
        int   tx = tileCoords.X, ty = tileCoords.Y, i = currentColliderIndex;
        var   coordSystemConverter = new TileCoordSystemConverter(WorldSize, CellSize);
        Point usCoords             = new Point(tx, ty);
        Point pfsCoords            = coordSystemConverter.US_To_PFS(usCoords);

        //Сразу же проверим, является ли этот тайл тайлом-препятствием
        //И если да, то возвращаем 1 - полностью занятый тайл
        if (TileIsObstacle(usCoords))
        {
            resultArray[pfsCoords.X, pfsCoords.Y] = 1f;
            return;
        }
        var cell = GetVerticesOfCell(usCoords);
        ClipperForFloats clipper = new ClipperForFloats();

        clipper.AddPolygon(cell, PolyType.ptSubject);
        clipper.AddPolygon(colliderPoints, PolyType.ptClip);
        double intersectionArea = clipper.GetIntersectionArea();
        double occupiedFraction = intersectionArea / CellArea;
        var    intersectionInfo = new ColliderAndCellIntersectionInfo
                                  (
            occupiedFraction,
            tileCoords,
            currentColliderGameObject,
            i
                                  );

        //-------------------------------------------------------------
        //if (intersectionInfo.CellFraction != 0
        // && !currentColliderGameObject.name.ToLower().Contains("letov"))
        //{
        //    Debug.Log(intersectionInfo);
        //    Debug.Log("Cell (World):" + StringManipulation.ListToString(cell));
        //    Debug.Log($"Cell (US): {tileCoords}");
        //    Debug.Log("Collider points (World): " + StringManipulation.ListToString<Vector2>(colliderPoints));
        //}
        //-------------------------------------------------------------
        resultArray[pfsCoords.X, pfsCoords.Y] += occupiedFraction;
    }
Пример #3
0
    protected bool PointIsOccupied(Vector2 uwPoint)
    {
        var  mapGenerator   = GameObject.Find("ObstaclesMapGenerator").GetComponent <ObstaclesMapGenerator>();
        var  converter      = new TileCoordSystemConverter(mapGenerator.WorldSize, mapGenerator.CellSize);
        var  usPoint        = converter.UW_To_US(uwPoint);
        var  tileAtLocation = Map.GetTile(new Vector3Int(usPoint.X, usPoint.Y, 0));
        bool result         = tileAtLocation != null;

        if (result)
        {
            return(result);
        }

        //bool result = false;
        var colliderOnPoint = Physics2D.OverlapCircle(uwPoint, 0.01f, 0, -100f, 100f);

        result = colliderOnPoint != null;

        return(result);
    }