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