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