Exemplo n.º 1
0
    public override GameObject GenerateAreaScenery(Terrain terrain)
    {
        var result = new GameObject(Name);

        // Generate trees taking buildings into consideration
        foreach (var areaData in AreaDataGraph.GetAllNodeData())
        {
            // Poisson filling
            PoissonDiskFillData poissonData =
                new PoissonDiskFillData(Trees, areaData.Polygon, TreeDistance, AngleTolerance, true);
            poissonData.AddClearPolygons(ClearPolygons);
            PoissonDataList.Add(poissonData);

            // Place arenas - skip start position
            if (areaData.Segment.Type == AreaSegment.EAreaSegmentType.Start)
            {
                continue;
            }

            var arena = PlaceArena(areaData, terrain);
            arena.transform.parent = result.transform;
        }


        return(result);
    }
Exemplo n.º 2
0
    public override GameObject GenerateAreaScenery(Terrain terrain)
    {
        var result = new GameObject(Name);

        // Place lamps
        var lamps = PlaceStreetLamps(terrain);

        lamps.transform.parent = result.transform;

        // Place buildings
        var buildings = PlaceBuildings(terrain);

        buildings.transform.parent = result.transform;

        // Generate trees taking buildings into consideration
        foreach (var areaData in AreaDataGraph.GetAllNodeData())
        {
            // Poisson filling
            PoissonDiskFillData poissonData = new PoissonDiskFillData(Trees, areaData.Polygon, TreeDistance, TreeAngleTolerance, true);
            poissonData.AddClearPolygons(ClearPolygons);
            PoissonDataList.Add(poissonData);

            // Place arenas
            var arena = PlaceArena(areaData, terrain);
            arena.transform.parent = result.transform;
        }

        return(result);
    }
Exemplo n.º 3
0
    public override GameObject GenerateAreaScenery(Terrain terrain)
    {
        var result = new GameObject(Name);
        var data   = AreaDataGraph.GetNodeData(0);

        // Create church
        var church = PlaceChurch(data);

        if (church)
        {
            church.transform.position += new Vector3(0, terrain.SampleHeight(church.transform.position), 0);
            church.transform.rotation  = terrain.GetNormalRotation(church.transform.position) * church.transform.rotation;
            church.CorrectAngleTolerance(AngleTolerance);
            church.transform.parent = result.transform;
        }

        // Place chest
        var chestPosition       = new Vector3(data.Center.x, 0, data.Center.y);
        var chestPositionHeight = chestPosition + new Vector3(0, terrain.SampleHeight(chestPosition), 0);
        var pathPosition        = new Vector3(data.Paths[0][0].x, 0, data.Paths[0][0].y);

        if ((pathPosition - chestPosition).sqrMagnitude < 1)
        {
            pathPosition = new Vector3(data.Paths[0][1].x, 0, data.Paths[0][1].y);
        }
        var chest = Object.Instantiate(ChestPrefab, chestPositionHeight, terrain.GetNormalRotation(chestPositionHeight) * Quaternion.LookRotation(pathPosition - chestPosition, Vector3.up));

        chest.transform.parent = result.transform;
        chest.GetComponent <ChestBossTrigger>().MiniBoss = MiniBosses[Random.Range(0, MiniBosses.Length)];

        // Place cemetary
        var cemetery = PlaceCemetery(data, terrain);

        cemetery.transform.parent = result.transform;

        // Fill spaces with trees
        PoissonDiskFillData poissonData = new PoissonDiskFillData(Trees, BorderPolygon.ToArray(), TreeDistance, TreeAngleTolerance, true);

        poissonData.AddClearPolygons(ClearPolygons);
        PoissonDataList.Add(poissonData);

        // Place arena
        PlaceArena(data, terrain).transform.parent = result.transform;

        return(result);
    }
Exemplo n.º 4
0
    //---------------------------------------------------------------------
    //
    // HELPER PRIVATE FUNCTIONS
    //
    //---------------------------------------------------------------------

    // Fill an area with prefabs
    private static GameObject PoissonDiskFill(Terrain terrain, PoissonDiskFillData poissonDiskFillData, string name = "Scenery Area")
    {
        var result = new GameObject(name);

        result.transform.position = Vector3.zero;
        result.transform.rotation = Quaternion.identity;

        if (poissonDiskFillData.Prefabs == null || poissonDiskFillData.Prefabs.Length <= 0)
        {
            return(result);
        }

        var levelCreator = terrain.transform.parent.GetComponent <LevelCreator>();
        var size         = poissonDiskFillData.FrameSize;

        PoissonDiskGenerator.minDist     = poissonDiskFillData.MinDist;
        PoissonDiskGenerator.sampleRange = (size.x > size.y ? size.x : size.y);
        PoissonDiskGenerator.Generate();
        foreach (var sample in PoissonDiskGenerator.ResultSet)
        {
            var point  = sample + poissonDiskFillData.FramePosition;
            var height = terrain.SampleHeight(new Vector3(point.x, 0, point.y) - terrain.transform.position);
            if (height <= (levelCreator.WaterHeight + 0.01f) * terrain.terrainData.size.y ||  // not underwater
                !point.IsInsidePolygon(poissonDiskFillData.Polygon) ||                        //not outside of the area
                !poissonDiskFillData.ClearPolygons.TrueForAll(a => !point.IsInsidePolygon(a)) //not inside of any clear polygon
                )
            {
                continue;
            }

            var go = Object.Instantiate(poissonDiskFillData.Prefabs[Random.Range(0, poissonDiskFillData.Prefabs.Length)]);
            go.transform.position = new Vector3(point.x, height, point.y) + terrain.transform.position;
            go.transform.rotation = terrain.GetNormalRotation(go.transform.position) * Quaternion.Euler(go.transform.rotation.eulerAngles.x, Random.Range(0, 360f), go.transform.rotation.eulerAngles.z);
            go.CorrectAngleTolerance(poissonDiskFillData.AngleTolerance);
            go.transform.parent = result.transform;

            if (poissonDiskFillData.NotWalkable)
            {
                var navMod = go.AddComponent <NavMeshModifier>();
                navMod.overrideArea = true;
                navMod.area         = NavMesh.GetAreaFromName("Not Walkable");
            }
        }

        return(result);
    }