Beispiel #1
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);
    }
Beispiel #2
0
    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);
    }