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