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); }
public override GameObject GenerateAreaScenery(Terrain terrain) { var arena = new GameObject(Name); // Find boss area center Vector2 center = Vector2.zero; var allData = AreaDataGraph.GetAllNodeData(); foreach (var areaData in allData) { center += areaData.Center; } center /= allData.Length; // Split gate line var skip = SplitEntranceLine(BorderPolygon); BorderPolygon = BorderPolygon.OffsetToCenter(center, 8, skip).ToList(); // Generate gate var line = _gateLine[0] - _gateLine[1]; var gatePosition2D = (_gateLine[0] + _gateLine[1]) / 2; var gatePosition = new Vector3(gatePosition2D.x, 0, gatePosition2D.y); // Set arena center on gate script var arenaCenter2D = center; // Place portal var portalPosition = new Vector3(arenaCenter2D.x, 0, arenaCenter2D.y); portalPosition += new Vector3(0, terrain.SampleHeight(portalPosition), 0); var portal = Object.Instantiate(_portalPrefab, portalPosition, terrain.GetNormalRotation(portalPosition) * Quaternion.LookRotation(gatePosition - new Vector3(portalPosition.x, 0, portalPosition.z), Vector3.up)); portal.transform.parent = arena.transform; // Generate Walls var lines = BorderPolygon.PolygonToLines(skip); var walls = LevelDataGenerator.GenerateBlockerLine(terrain, lines, _wallLenght, _wallPositionNoise, _wallScaleNoise, _wallPrefab, false, _towerPrefab, _wallAngleLimit); walls.transform.parent = arena.transform; // Generate last tower next to the gate var gateTower = Object.Instantiate(_towerPrefab); gateTower.transform.position = gatePosition + Quaternion.LookRotation(new Vector3(line.x, 0, line.y), Vector3.up) * new Vector3(0, 0, line.magnitude / 2); gateTower.transform.position += new Vector3(0, terrain.SampleHeight(gateTower.transform.position), 0); gateTower.transform.rotation = terrain.GetNormalRotation(gateTower.transform.position); gateTower.CorrectAngleTolerance(_wallAngleLimit); gateTower.transform.parent = arena.transform; var navMeshModifier = gateTower.AddComponent <NavMeshModifier>(); navMeshModifier.overrideArea = true; navMeshModifier.area = NavMesh.GetAreaFromName("Not Walkable"); // Spawn boss at the arena center var bossPosition = new Vector3(portalPosition.x, 0, portalPosition.z) + 5 * new Vector3(gatePosition.x - portalPosition.x, 0, gatePosition.z - portalPosition.z).normalized; bossPosition += new Vector3(0, terrain.SampleHeight(bossPosition), 0); var boss = Object.Instantiate(_bossPrefab, bossPosition, Quaternion.identity); boss.transform.parent = arena.transform; var bossTrigger = boss.AddComponent <PortalActivateTrigger>(); bossTrigger.Portal = portal; bossTrigger.Initialize(); return(arena); }