Пример #1
0
    IEnumerator StartEvent_C(SpawnEventInformation _inf)
    {
        yield return(new WaitForSeconds(_inf.delayBeforeSpawn));

        EnemyBehaviour newEnemy = _inf.spawner.SpawnEnemy(_inf.enemyType, false);

        newEnemy.onDeath.AddListener(() => { OnEnemyDeath(newEnemy); });
        enemyList.Add(newEnemy);

        if (enemyList.Count >= spawnEventList.Count && !mustKillEnemiesBeforeNextWave && linkedWaveController != null)
        {
            linkedWaveController.currentEnemies.Add(newEnemy);
            yield return(new WaitForSeconds(delayBeforeNextWave));

            OnEventEnd();
        }
    }
Пример #2
0
    public override void OnInspectorGUI()
    {
        this.serializedObject.Update();
        if (waveEditor.waveList.Count > 0)
        {
            GUILayout.BeginVertical(EditorStyles.helpBox);
            GUI.color = Color.gray;
            GUIStyle i_headerStyle = new GUIStyle(EditorStyles.helpBox);
            i_headerStyle.alignment = TextAnchor.MiddleCenter;
            i_headerStyle.fontSize  = 20;
            i_headerStyle.fontStyle = FontStyle.Bold;
            GUILayout.Box("Global settings", i_headerStyle);
            GUILayout.Space(10);
            GUI.color = Color.white;
            SerializedProperty m_startOnTriggerEnter = serializedObject.FindProperty("startOnTriggerEnter");
            EditorGUILayout.PropertyField(m_startOnTriggerEnter, new GUIContent("Start automatically when players enters zone ?"));

            SerializedProperty m_skipArena = serializedObject.FindProperty("skipArena");
            EditorGUILayout.PropertyField(m_skipArena, new GUIContent("Skip arena ?"));
            this.serializedObject.ApplyModifiedProperties();

            EditorGUI.BeginChangeCheck();
            SerializedProperty m_exitDoor = serializedObject.FindProperty("exitDoor");
            EditorGUILayout.PropertyField(m_exitDoor, true);
            this.serializedObject.ApplyModifiedProperties();
            if (EditorGUI.EndChangeCheck())
            {
                UpdateDoorCounter();
            }

            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            if (GUILayout.Button("Update door counter", GUILayout.Width(200), GUILayout.Height(30)))
            {
                UpdateDoorCounter();
            }

            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();
            GUILayout.Space(10);
            GUILayout.EndVertical();
            GUILayout.Space(20);


            GUILayout.BeginVertical(EditorStyles.helpBox);
            GUI.color = Color.gray;
            GUILayout.Box("Spawns", i_headerStyle);
            GUI.color = Color.white;
            GUILayout.Space(10);
            for (int i = 0; i < waveEditor.spawnList.Count; i++)
            {
                GUILayout.BeginHorizontal();
                waveEditor.spawnList[i].color = EditorGUILayout.ColorField(waveEditor.spawnList[i].color, GUILayout.Width(50), GUILayout.Height(20));
                this.serializedObject.Update();

                EditorGUI.BeginChangeCheck();
                SerializedProperty m_spawnName = serializedObject.FindProperty("spawnList.Array.data[" + i + "].customName");
                EditorGUILayout.PropertyField(m_spawnName, new GUIContent(""));
                this.serializedObject.ApplyModifiedProperties();
                if (EditorGUI.EndChangeCheck())
                {
                    if (waveEditor.spawnList[i].transform != null)
                    {
                        waveEditor.spawnList[i].transform.name = waveEditor.spawnList[i].customName;
                    }
                }

                Transform previousTransform = waveEditor.spawnList[i].transform;
                EditorGUI.BeginChangeCheck();
                SerializedProperty m_spawnTransform = serializedObject.FindProperty("spawnList.Array.data[" + i + "].transform");
                EditorGUILayout.PropertyField(m_spawnTransform, new GUIContent(""));
                this.serializedObject.ApplyModifiedProperties();
                if (EditorGUI.EndChangeCheck())
                {
                    if (previousTransform != waveEditor.spawnList[i].transform)
                    {
                        IconManager.SetIcon(waveEditor.spawnList[i].transform.gameObject, IconManager.LabelIcon.Blue);
                        waveEditor.spawnList[i].customName = waveEditor.spawnList[i].transform.name;
                        return;
                    }
                }


                if (GUILayout.Button(EditorGUIUtility.IconContent("winbtn_win_close"), GUILayout.Width(20), GUILayout.Height(20)))
                {
                    foreach (WaveData wave in waveEditor.waveList)
                    {
                        foreach (WaveEnemy enemy in wave.currentEnemies)
                        {
                            if (enemy.spawnIndexes.Contains(i))
                            {
                                enemy.spawnIndexes.Remove(i);
                            }
                        }
                    }

                    waveEditor.spawnList.RemoveAt(i);
                    return;
                }
                GUILayout.EndHorizontal();
            }

            GUILayout.Space(10);
            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            if (GUILayout.Button("Add spawn", GUILayout.Width(100), GUILayout.Height(30)))
            {
                AddSpawn();
            }
            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();
            GUILayout.Space(10);
            GUILayout.EndVertical();


            GUILayout.Label("Actions on wave start", EditorStyles.centeredGreyMiniLabel);
            SerializedProperty m_events = serializedObject.FindProperty("onStartEvents");
            EditorGUILayout.PropertyField(m_events, true);
        }
        for (int i = 0; i < waveEditor.waveList.Count; i++)
        {
            WaveData i_waveData = waveEditor.waveList[i];
            GUILayout.BeginVertical(EditorStyles.helpBox);
            GUI.color = Color.gray;
            GUILayout.BeginHorizontal();
            GUIStyle i_headerStyle = new GUIStyle(EditorStyles.helpBox);
            i_headerStyle.alignment = TextAnchor.MiddleCenter;
            i_headerStyle.fontSize  = 20;
            i_headerStyle.fontStyle = FontStyle.Bold;
            GUILayout.Box("Wave " + (i + 1).ToString(), i_headerStyle);
            GUI.color = Color.white;
            if (GUILayout.Button(EditorGUIUtility.IconContent("winbtn_win_close"), GUILayout.Width(30), GUILayout.Height(30)))
            {
                RemoveWave(i_waveData);
            }
            GUILayout.EndHorizontal();

            //"Wave start event settings" panel
            GUILayout.Label("Start event", EditorStyles.centeredGreyMiniLabel);
            GUILayout.BeginVertical(EditorStyles.helpBox);
            if (i_waveData.onStartSpawnEvent.isEnabled == false)
            {
                GUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                if (GUILayout.Button("Add event", GUILayout.Width(100), GUILayout.Height(30)))
                {
                    AddSpawnEvent(i_waveData);
                }
                GUILayout.FlexibleSpace();
                GUILayout.EndHorizontal();
            }
            else
            {
                //Serialize the wave datas
                GUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                if (GUILayout.Button("Remove event", GUILayout.Width(100), GUILayout.Height(30)))
                {
                    RemoveSpawnEvent(i_waveData);
                }
                GUILayout.FlexibleSpace();
                GUILayout.EndHorizontal();
                SerializedProperty m_mustKillEnemiesBeforeNextWave = serializedObject.FindProperty("waveList.Array.data[" + i + "].onStartSpawnEvent.mustKillEnemiesBeforeNextWave");
                EditorGUILayout.PropertyField(m_mustKillEnemiesBeforeNextWave);
                SerializedProperty m_delayBeforeNextWave = serializedObject.FindProperty("waveList.Array.data[" + i + "].onStartSpawnEvent.delayBeforeNextWave");
                EditorGUILayout.PropertyField(m_delayBeforeNextWave);
                GUILayout.BeginVertical();
                for (int y = 0; y < i_waveData.onStartSpawnEvent.spawnEventList.Count; y++)
                {
                    SpawnEventInformation spawnEventInformation = i_waveData.onStartSpawnEvent.spawnEventList[y];
                    GUILayout.BeginHorizontal();
                    int enemyTypeIndex = EditorGUILayout.Popup(enemyDatas.GetEnemyIndex(spawnEventInformation.enemyType), EnemyListToString(enemyDatas.enemyDatas.ToArray()), GUILayout.Width(120));
                    spawnEventInformation.enemyType = enemyDatas.enemyDatas[enemyTypeIndex];

                    int spawnTypeIndex = EditorGUILayout.Popup(GetSpawnerIndex(spawnEventInformation.spawner), GetAvailableSpawnerNames().ToArray(), GUILayout.Width(120));
                    if (availableSpawners != null && availableSpawners.Count > spawnTypeIndex && spawnEventInformation != null)
                    {
                        spawnEventInformation.spawner = availableSpawners[spawnTypeIndex];
                    }

                    this.serializedObject.ApplyModifiedProperties();

                    GUILayout.FlexibleSpace();
                    SerializedProperty m_delayBeforeSpawn = serializedObject.FindProperty("waveList.Array.data[" + i + "].onStartSpawnEvent.spawnEventList.Array.data[" + y + "].delayBeforeSpawn");
                    EditorGUILayout.PropertyField(m_delayBeforeSpawn);

                    if (GUILayout.Button(EditorGUIUtility.IconContent("winbtn_win_close"), GUILayout.Width(20), GUILayout.Height(20)))
                    {
                        i_waveData.onStartSpawnEvent.spawnEventList.RemoveAt(y);
                        return;
                    }
                    GUILayout.EndHorizontal();
                }
                GUILayout.BeginHorizontal();
                GUILayout.FlexibleSpace();
                if (GUILayout.Button("+", GUILayout.Width(30), GUILayout.Height(30)))
                {
                    i_waveData.onStartSpawnEvent.spawnEventList.Add(new SpawnEventInformation());
                }
                GUILayout.FlexibleSpace();
                GUILayout.EndHorizontal();
                GUILayout.EndVertical();
            }
            GUILayout.EndVertical();


            //"Wave global settings" panel
            GUILayout.Label("Global settings", EditorStyles.centeredGreyMiniLabel);
            i_waveData.maxPowerLevel       = EditorGUILayout.CurveField("Max power level", i_waveData.maxPowerLevel);
            i_waveData.duration            = EditorGUILayout.FloatField("Duration", i_waveData.duration);
            i_waveData.pauseBeforeNextWave = EditorGUILayout.FloatField("Pause before next wave", i_waveData.pauseBeforeNextWave);

            //"Wave enemy ratio visualizers" panel
            GUILayout.Space(10);
            GUILayout.Label("Enemy spawn chances", EditorStyles.centeredGreyMiniLabel);
            GUILayout.BeginHorizontal();
            GUILayout.FlexibleSpace();
            for (int y = 0; y < i_waveData.currentEnemies.Count; y++)
            {
                GUIStyle visualizerStyle = new GUIStyle(GUI.skin.textField);
                GUI.color = i_waveData.currentEnemies[y].enemyType.color;
                visualizerStyle.alignment = TextAnchor.MiddleCenter;
                GUILayout.TextField(i_waveData.currentEnemies[y].enemyType.name, visualizerStyle, GUILayout.Width(300 * i_waveData.currentEnemies[y].probability), GUILayout.Height(30));
                GUI.color = i_waveData.currentEnemies[y].enemyType.color;
            }
            GUILayout.FlexibleSpace();
            GUILayout.EndHorizontal();
            GUILayout.Space(10);

            //"Current enemies" panel
            GUI.color = Color.white;
            GUILayout.BeginVertical();
            for (int y = 0; y < i_waveData.currentEnemies.Count; y++)
            {
                GUILayout.BeginHorizontal();
                GUI.color = i_waveData.currentEnemies[y].enemyType.color;
                GUILayout.Label(EditorGUIUtility.IconContent("Canvas Icon"), GUILayout.Width(30), GUILayout.Height(30));
                GUI.color = Color.white;
                GUILayout.BeginVertical();
                GUILayout.Box(waveEditor.waveList[i].currentEnemies[y].enemyType.name, EditorStyles.miniButton);
                GUILayout.Box("Power level: " + waveEditor.waveList[i].currentEnemies[y].enemyType.prefab.GetComponent <EnemyBehaviour>().powerLevel, EditorStyles.centeredGreyMiniLabel);
                GUILayout.EndVertical();
                EditorGUI.BeginChangeCheck();
                float probaSliderValue = EditorGUILayout.Slider(Mathf.Round(i_waveData.currentEnemies[y].probability * 100f) / 100f, 0f, 1f);
                if (EditorGUI.EndChangeCheck())
                {
                    i_waveData.SetEnemySpawnProbability(i_waveData.currentEnemies[y].enemyType, probaSliderValue);
                }
                if (GUILayout.Button(EditorGUIUtility.IconContent("winbtn_win_close"), GUILayout.Width(20), GUILayout.Height(20)))
                {
                    i_waveData.RemoveEnemySpawnProbability(i_waveData.currentEnemies[y]);
                    UpdateAvailableEnemies(i_waveData);
                    return;
                }
                for (int z = 0; z < waveEditor.spawnList.Count; z++)
                {
                    GUI.color = waveEditor.spawnList[z].color;
                    GUIStyle buttonStyle = new GUIStyle(EditorStyles.boldLabel);
                    if (GUILayout.Button(Resources.Load <Texture2D>("WaveToolSprites/WhiteSquareTransparentBorder"), buttonStyle, GUILayout.Width(30), GUILayout.Height(30)))
                    {
                        if (i_waveData.currentEnemies[y].spawnIndexes.Contains(z))
                        {
                            i_waveData.currentEnemies[y].spawnIndexes.Remove(z);
                        }
                        else
                        {
                            i_waveData.currentEnemies[y].spawnIndexes.Add(z);
                        }
                    }
                    GUI.color = Color.white;
                    if (i_waveData.currentEnemies[y].spawnIndexes.Contains(z))
                    {
                        GUI.Label(GUILayoutUtility.GetLastRect(), Resources.Load <Texture2D>("WaveToolSprites/WhiteOutline"));
                    }
                }
                GUILayout.EndHorizontal();
                GUILayout.Space(10);
            }
            GUILayout.EndVertical();

            //"Add enemy" panel
            if (enemyAvailable[i_waveData] != null)
            {
                if (enemyAvailable[i_waveData].Length > 0)
                {
                    GUILayout.Space(10);
                    GUILayout.Label("Add enemy type", EditorStyles.centeredGreyMiniLabel);
                    GUILayout.BeginHorizontal();
                    enemyFoldoutIndex[i_waveData] = EditorGUILayout.Popup(enemyFoldoutIndex[i_waveData], EnemyListToString(enemyAvailable[i_waveData]));
                    if (GUILayout.Button("Add"))
                    {
                        AddEnemy(i_waveData, enemyFoldoutIndex[i_waveData]);
                    }
                    GUILayout.EndHorizontal();
                }
            }

            //"onEndActions" panel
            GUILayout.Space(10);
            GUILayout.Label("Actions on wave end", EditorStyles.centeredGreyMiniLabel);
            SerializedProperty m_events = serializedObject.FindProperty("waveList.Array.data[" + i + "].onEndEvents");
            EditorGUILayout.PropertyField(m_events, true);
            GUILayout.Space(20);
            GUILayout.EndVertical();
            GUILayout.Space(30);
        }

        //"Add new wave" panel
        GUILayout.BeginHorizontal();
        GUILayout.FlexibleSpace();
        if (GUILayout.Button("Add new wave", GUILayout.Width(150), GUILayout.Height(35)))
        {
            AddWave();
        }
        GUILayout.FlexibleSpace();
        GUILayout.EndHorizontal();
        GUILayout.Space(30);
        EditorUtility.SetDirty(target);
        this.serializedObject.ApplyModifiedProperties();
    }