コード例 #1
0
    public static void OpenWindow()
    {
        //GetWindow<PrefabCreator>("Prefab Creator");
        ProceduralLevelGenerator window = (ProceduralLevelGenerator)GetWindow(typeof(ProceduralLevelGenerator));

        //window.minSize = new Vector2(600, 450);
        //window.maxSize = new Vector2(600, 450);
        window.Show();
    }
コード例 #2
0
    private void Start()
    {
        // temporary spawning code
        // should setup the whole game - e.g., 10 levels, including the first "tutorial" level and the "boss" level
        _cam = GameObject.Find("Main Camera").GetComponent <Camera>();

        _levels = new Level[LevelsToGenerate + 2];

        var levelGenerator = new ProceduralLevelGenerator();

        _levelsParent = new GameObject("Levels");

        // first generate data
        _levels[0] = new Level(0);
        PremadeLevelGenerator.GenerateFirstLevel(_levels[0]);

        _levels[_levels.Length - 1] = new Level(_levels.Length - 1);
        PremadeLevelGenerator.GenerateBossLevel(_levels[_levels.Length - 1]);

        for (int i = 0; i < LevelsToGenerate; i++)
        {
            _levels[i + 1] = new Level(i + 1);
            levelGenerator.Generate(_levels[i + 1], LevelResolution, LevelMinRoomSize, LevelMaxDepthOffset);
        }

        // now spawn stuff
        for (int i = 0; i < _levels.Length; i++)
        {
            var levelParent = new GameObject($"Level {i}");
            levelParent.transform.parent = _levelsParent.transform;
            _levels[i].WorldParent       = levelParent.transform;

            _levels[i].WorldParent.localPosition = new Vector3(i * LevelResolution * 2, 0, 0);

            for (int x = 0; x < _levels[i].Size; x++)
            {
                for (int y = 0; y < _levels[i].Size; y++)
                {
                    var tile = WorldGenerator.Instance.SpawnStaticWorldBlock(_levels[i], new Vector2Int(x, y), _levels[i].Map[x, y]);
                    if (tile is EntranceTile enter)
                    {
                        enter.PreviousLevel = _levels[i - 1];
                    }

                    if (tile is ExitTile exit)
                    {
                        exit.NextLevel = _levels[i + 1];
                    }
                }
            }

            if (_levels[i].IsProcedural)
            {
                var locations = _levels[i].GenerateItemLocationList();
                for (int j = 0; j < 10; j++)
                {
                    WorldGenerator.Instance.SpawnUnit(_levels[i], locations[j], UnitType.Enemy01);
                }

                for (int j = 10; j < 20; j++)
                {
                    WorldGenerator.Instance.SpawnPickupItem(_levels[i], locations[j]);
                }
            }

            // last "boss" level
            if (!_levels[i].IsProcedural && i == _levels.Length - 1)
            {
                WorldGenerator.Instance.SpawnUnit(_levels[i], new Vector2Int(7, 7), UnitType.Boss);
            }
        }

        _currentLevelIdx = 0;

        if (CurrentLevel.TryGetAnyWalkablePosition(out Vector2Int posToSpawnAiUnit))
        {
            Span <Vector2Int> neighbours = stackalloc Vector2Int[4];
            int count = CurrentLevel.GetNeighbours(posToSpawnAiUnit, in neighbours);

            if (count > 0)
            {
                var player = WorldGenerator.Instance.CreatePlayer();
                CurrentLevel.AddPlayer(player, neighbours[0]);
                player.transform.position = new Vector3(player.CurrentPosition.x, 0, player.CurrentPosition.y);
                _cam.GetComponent <FollowingCamera>().Target = player.transform;
                CurrentPlayer = player;
            }
            else
            {
                throw new InvalidOperationException("nowhere to spawn the player");
            }
        }
    }