예제 #1
0
        private EnvType NextState(LevelSettings levelSettings)
        {
            StateTransition[] stateTransitions = states[(int)nextState];
            int stateTransitionsCount          = stateTransitions.Length;
            int weightsSum = 0;
            int levelIndex = levelSettings.Index;

            for (int i = 0; i < stateTransitionsCount; ++i)
            {
                EnvTypeInfo envTypeInfo =
                    envTypeInfoStorage.Get(stateTransitions[i].EnvType);
                weightsSum += envTypeInfo.GetSpawnWeight(levelIndex);
            }

            int randomWeight  = UnityEngine.Random.Range(1, weightsSum + 1);
            int currentWeight = 0;

            for (int i = 0; i < stateTransitionsCount; ++i)
            {
                var         stateTransition = stateTransitions[i];
                EnvTypeInfo envTypeInfo     =
                    envTypeInfoStorage.Get(stateTransition.EnvType);
                currentWeight += envTypeInfo.GetSpawnWeight(levelIndex);

                if (currentWeight >= randomWeight)
                {
                    nextState = stateTransition.NextState;
                    return(stateTransition.EnvType);
                }
            }

            DebugUtils.Assert(false);
            return(0);
        }
예제 #2
0
        public void NewArea(
            EnvTypeInfo envTypeInfo,
            List <SpawnsInfo> spawnsInfos,
            LevelSettings levelSettings,
            LevelView outputLevel,
            Action <LevelAreaView> onDone = null)
        {
            // DebugUtils.Log(
            //     "LevelAreaGeneratorView.NewArea(); envType={0}", envType);
            area = outputLevel.NewArea(envTypeInfo);

            if (spawnsInfos.Count == 0)
            {
                if (onDone != null)
                {
                    onDone(area);
                }
                return;
            }

            Profiler.BeginSample("LevelAreaGeneratorView.NewArea()");
            this.envTypeInfo   = envTypeInfo;
            this.spawnsInfos   = spawnsInfos;
            this.levelSettings = levelSettings;
            this.onDone        = onDone;
            level            = outputLevel;
            spawnsInfosIndex = 0;
            NextObjectType();
            reservedSpawnPoints.Clear();
            InvokeRepeating("NewObject", objectSpawnRate, objectSpawnRate);
            Profiler.EndSample();
        }
예제 #3
0
        private List <SpawnsInfo> GetSpawnsInfos(
            LevelSettings levelSettings,
            EnvTypeInfo envTypeInfo,
            bool spawnPlayer,
            PlayerView player = null)
        {
            Profiler.BeginSample("LevelGenerator.GetSpawnsInfos()");
            LevelObjectType[] objectTypes =
                envTypeInfo.SpawnMap.ObjectTypes;
            Array.Sort(objectTypes, objectTypeComparer);
            spawnsInfosBuffer.Clear();
            int objectTypesCount = objectTypes.Length;

            for (int i = 0; i < objectTypesCount; ++i)
            {
                LevelObjectType objectType     = objectTypes[i];
                ObjectTypeInfo  objectTypeInfo =
                    objectTypeInfoStorage.Get(objectType);
                ObjectLevelSettings objectLevelSettings =
                    levelSettings.GetObjectSettings(objectType);
                int spawnsCount = 0;

                if (objectType == playerObjectType)
                {
                    spawnsCount = spawnPlayer ? 1 : 0;
                    spawnPlayer = false;
                }
                else if (objectLevelSettings != null &&
                         UnityEngine.Random.value <=
                         objectLevelSettings.SpawnChance)
                {
                    LevelObjectView objectProto = objectTypeInfo.ProtoInfo.View;
                    spawnsCount = UnityEngine.Random.Range(
                        objectLevelSettings.MinSpawnsPerArea,
                        objectLevelSettings.MaxSpawnsPerArea + 1);
                    var bonus = objectProto.GetComponent <BonusView>();

                    if (bonus != null)
                    {
                        if (player == null ||
                            !bonusSpawnResolver.IsTimeToSpawn(
                                bonus, player))
                        {
                            spawnsCount = 0;
                        }
                        else
                        {
                            bonusSpawnResolver.ActiveBonusObjects +=
                                spawnsCount;
                        }
                    }
                }

                spawnsInfosBuffer.Add(new SpawnsInfo(objectType, spawnsCount));
            }

            return(spawnsInfosBuffer);
        }
예제 #4
0
        public LevelAreaView NewArea(EnvTypeInfo envTypeInfo)
        {
            Profiler.BeginSample("LevelView.NewArea()");
            var poolId =
                envTypeInfo.ViewProto.GetComponent <PoolableView>().PoolId;
            var area = poolStorage.Take(poolId).GetComponent <LevelAreaView>();

            area.Init(nextAreaIndex);
            area.transform.position =
                new Vector3(0f, 0f, nextAreaIndex * areaDepth);
            area.transform.rotation = Quaternion.identity;
            area.transform.parent   = transform;
            ++nextAreaIndex;
            Profiler.EndSample();
            return(area);
        }
예제 #5
0
        public void NewArea(PlayerView player, LevelView outputLevel,
                            Action <LevelAreaView> onDone = null)
        {
            // DebugUtils.Log("LevelGenerator.NewArea()");
            Profiler.BeginSample("LevelGenerator.NewArea()");
            LevelSettings levelSettings =
                levelSettingsStorage.Get(outputLevel.Index);
            bool              spawnPlayer = false;
            EnvType           envType     = NextState(levelSettings);
            EnvTypeInfo       envTypeInfo = envTypeInfoStorage.Get(envType);
            List <SpawnsInfo> spawnsInfos =
                GetSpawnsInfos(levelSettings, envTypeInfo, spawnPlayer, player);

            areaGenerator.NewArea(
                envTypeInfo,
                spawnsInfos,
                levelSettings,
                outputLevel,
                onDone);
            Profiler.EndSample();
        }
예제 #6
0
        public void NewLevel(LevelView outputLevel, Action onDone = null)
        {
            // DebugUtils.Log("LevelGenerator.NewLevel()");
            outputLevel.gameObject.SetActive(false);
            isStopped = false;
            nextState = State.First;
            bonusSpawnResolver.ActiveBonusObjects = 0;
            spawnsInfosBuffer.Clear();
            LevelSettings levelSettings =
                levelSettingsStorage.Get(outputLevel.Index);
            EnvType     envType     = NextState(levelSettings);
            EnvTypeInfo envTypeInfo = envTypeInfoStorage.Get(envType);

            areaGenerator.NewArea(
                envTypeInfo,
                spawnsInfosBuffer,
                levelSettings,
                outputLevel,
                (LevelAreaView area1) => {
                if (isStopped)
                {
                    return;
                }

                envType                       = NextState(levelSettings);
                envTypeInfo                   = envTypeInfoStorage.Get(envType);
                PlayerView player             = null;
                bool spawnPlayer              = true;
                List <SpawnsInfo> spawnsInfos = GetSpawnsInfos(
                    levelSettings,
                    envTypeInfo,
                    spawnPlayer,
                    player);
                areaGenerator.NewArea(
                    envTypeInfo,
                    spawnsInfos,
                    levelSettings,
                    outputLevel,
                    (LevelAreaView area2) => {
                    if (isStopped)
                    {
                        return;
                    }

                    envType     = NextState(levelSettings);
                    envTypeInfo = envTypeInfoStorage.Get(envType);
                    spawnPlayer = false;
                    spawnsInfos = GetSpawnsInfos(
                        levelSettings,
                        envTypeInfo,
                        spawnPlayer,
                        player);
                    areaGenerator.NewArea(
                        envTypeInfo,
                        spawnsInfos,
                        levelSettings,
                        outputLevel,
                        (LevelAreaView area3) => {
                        if (isStopped)
                        {
                            return;
                        }

                        outputLevel.gameObject.SetActive(true);
                        if (onDone != null)
                        {
                            onDone();
                        }
                        eventBus.Fire(
                            (int)Events.LevelGeneratorLevelGenerate,
                            new Evt(this, outputLevel));
                    });
                });
            });
        }