private Vector3 GetSize() { ObjectTypeInfo objectTypeInfo = objectTypeInfoStorage.Get(objectType); return(new Vector3( itemsAcrossX * objectTypeInfo.Width, 0f, itemsAcrossZ * objectTypeInfo.Depth)); }
public int Compare(LevelObjectType lhs, LevelObjectType rhs) { int result = objectTypeInfoStorage.Get(lhs).SpawnPriority - objectTypeInfoStorage.Get(rhs).SpawnPriority; if (result == 0) { return(UnityEngine.Random.Range(0, 2) == 0 ? 1 : -1); } return(result); }
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); }
private void NewObject() { // DebugUtils.Log("LevelAreaGeneratorView.NewObject()"); Profiler.BeginSample("LevelAreaGeneratorView.NewObject()"); LevelObjectType objectType = spawnsInfos[spawnsInfosIndex].ObjectType; List <SpawnLocation> spawnLocations = envTypeInfo.SpawnMap.GetLocations(objectType); ObjectTypeInfo objectTypeInfo = objectTypeInfoStorage.Get(objectType); Vector3 spawnPoint; SpawnLocation spawnLocation; bool isFreeSpaceExists = true; do { spawnLocation = spawnLocations[ UnityEngine.Random.Range(0, spawnLocations.Count)]; spawnPoint = GetRandomSpawnPoint( spawnLocation.Bounds, objectTypeInfo); if (spawnTriesCount == 0) { isFreeSpaceExists = false; break; } --spawnTriesCount; } while (IsSpawnPointReserved(spawnPoint)); if (isFreeSpaceExists) { int objectProtoIndex = UnityEngine.Random.Range( 0, objectTypeInfo.ProtoInfos.Length); ObjectProtoInfo objectProtoInfo = objectTypeInfo.ProtoInfos[objectProtoIndex]; LevelObjectView obj = level.NewObject( objectProtoInfo.View, spawnPoint, area.Index); InitObject(obj, objectTypeInfo, objectProtoInfo, spawnLocation, levelSettings); ReserveSpawnPoint(spawnPoint); } --objectsCountToSpawn; Profiler.EndSample(); if (objectsCountToSpawn <= 0 || spawnTriesCount <= 0) { ++spawnsInfosIndex; if (spawnsInfosIndex >= spawnsInfos.Count) { CancelInvoke("NewObject"); if (onDone != null) { onDone(area); } return; } NextObjectType(); } }