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); }
/// <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; }
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); }