コード例 #1
0
        private Vector3 GetSize()
        {
            ObjectTypeInfo objectTypeInfo =
                objectTypeInfoStorage.Get(objectType);

            return(new Vector3(
                       itemsAcrossX * objectTypeInfo.Width,
                       0f,
                       itemsAcrossZ * objectTypeInfo.Depth));
        }
コード例 #2
0
            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);
            }
コード例 #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
        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();
            }
        }