public override void OnInspectorGUI() { EditorGUIUtility.LookLikeControls(); EditorGUI.indentLevel = 0; var kill = (KillableChildVisibility)target; var isDirty = false; WorldVariableTracker.ClearInGamePlayerStats(); LevelSettings.Instance = null; // clear cached version DTInspectorUtility.DrawTexture(CoreGameKitInspectorResources.LogoTexture); var newKillableToAlert = (Killable)EditorGUILayout.ObjectField("Killable To Alert", kill.killableWithRenderer, typeof(Killable), true); if (newKillableToAlert != kill.killableWithRenderer) { UndoHelper.RecordObjectPropertyForUndo(ref isDirty, kill, "change Killable To Alert"); kill.killableWithRenderer = newKillableToAlert; } if (GUI.changed || isDirty) { EditorUtility.SetDirty(target); // or it won't save the data!! } //DrawDefaultInspector(); }
// ReSharper disable once FunctionComplexityOverflow public override void OnInspectorGUI() { EditorGUIUtility.LookLikeControls(); _settings = (WavePrefabPool)target; _poolTrans = _settings.transform; WorldVariableTracker.ClearInGamePlayerStats(); DTInspectorUtility.DrawTexture(CoreGameKitInspectorResources.LogoTexture); _isDirty = false; var allStats = KillerVariablesHelper.AllStatNames; var myParent = _settings.transform.parent; LevelSettings levelSettings = null; if (myParent != null) { var levelSettingObj = myParent.parent; if (levelSettingObj != null) { levelSettings = levelSettingObj.GetComponent <LevelSettings>(); } } if (levelSettings == null) { return; } EditorGUI.indentLevel = 0; var newSeq = (WavePrefabPool.PoolDispersalMode)EditorGUILayout.EnumPopup("Spawn Sequence", _settings.dispersalMode); if (newSeq != _settings.dispersalMode) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "change Spawn Sequence"); _settings.dispersalMode = newSeq; } if (_settings.dispersalMode == WavePrefabPool.PoolDispersalMode.Randomized) { var newExhaust = EditorGUILayout.Toggle("Exhaust before repeat", _settings.exhaustiveList); if (newExhaust != _settings.exhaustiveList) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "toggle Exhaust before repeat"); _settings.exhaustiveList = newExhaust; } } var hadNoListener = _settings.listener == null; var newListener = (WavePrefabPoolListener)EditorGUILayout.ObjectField("Listener", _settings.listener, typeof(WavePrefabPoolListener), true); if (newListener != _settings.listener) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "assign Listener"); _settings.listener = newListener; if (hadNoListener && _settings.listener != null) { _settings.listener.sourcePrefabPoolName = _settings.transform.name; } } EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Scene Objects Using"); GUI.contentColor = DTInspectorUtility.BrightButtonColor; if (GUILayout.Button("List", EditorStyles.toolbarButton, GUILayout.MinWidth(55))) { FindMatchingSpawners(_poolTrans, false); } GUILayout.Space(10); if (GUILayout.Button("Select", EditorStyles.toolbarButton, GUILayout.MinWidth(55))) { FindMatchingSpawners(_poolTrans, true); } GUILayout.FlexibleSpace(); GUI.contentColor = Color.white; EditorGUILayout.EndHorizontal(); DTInspectorUtility.VerticalSpace(4); if (!Application.isPlaying) { EditorGUILayout.BeginVertical(); var anEvent = Event.current; EditorGUILayout.BeginHorizontal(); GUILayout.Space(4); GUI.color = DTInspectorUtility.DragAreaColor; var dragArea = GUILayoutUtility.GetRect(0f, 30f, GUILayout.ExpandWidth(true)); GUI.Box(dragArea, "Drag prefabs here in bulk to add them to the Pool!"); GUI.color = Color.white; switch (anEvent.type) { case EventType.DragUpdated: case EventType.DragPerform: if (!dragArea.Contains(anEvent.mousePosition)) { break; } DragAndDrop.visualMode = DragAndDropVisualMode.Copy; if (anEvent.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); foreach (var dragged in DragAndDrop.objectReferences) { AddPoolItem(dragged); } } Event.current.Use(); break; } GUILayout.Space(4); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); DTInspectorUtility.VerticalSpace(4); } EditorGUI.indentLevel = 0; var state = _settings.isExpanded; var text = string.Format("Prefab Pool Items ({0})", _settings.poolItems.Count); // ReSharper disable once ConvertIfStatementToConditionalTernaryExpression if (!state) { GUI.backgroundColor = DTInspectorUtility.InactiveHeaderColor; } else { GUI.backgroundColor = DTInspectorUtility.ActiveHeaderColor; } GUILayout.BeginHorizontal(); #if UNITY_3_5_7 if (!state) { text += " (Click to expand)"; } #else text = "<b><size=11>" + text + "</size></b>"; #endif if (state) { text = "\u25BC " + text; } else { text = "\u25BA " + text; } if (!GUILayout.Toggle(true, text, "dragtab", GUILayout.MinWidth(20f))) { state = !state; } GUILayout.Space(2f); if (state != _settings.isExpanded) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "toggle expand Prefab Pool Items"); _settings.isExpanded = state; } // BUTTONS... EditorGUILayout.BeginHorizontal(GUILayout.MaxWidth(100)); DTInspectorUtility.ResetColors(); var alphaSort = false; //DTInspectorUtility.UseLightSkinButtonColor(); // Add expand/collapse buttons if there are items in the list if (_settings.poolItems.Count > 0) { GUI.contentColor = DTInspectorUtility.BrightButtonColor; alphaSort = GUILayout.Button("Alpha Sort", EditorStyles.toolbarButton, GUILayout.Height(16)); const string collapseIcon = "Collapse"; var content = new GUIContent(collapseIcon, "Click to collapse all"); var masterCollapse = GUILayout.Button(content, EditorStyles.toolbarButton, GUILayout.Height(16)); const string expandIcon = "Expand"; content = new GUIContent(expandIcon, "Click to expand all"); var masterExpand = GUILayout.Button(content, EditorStyles.toolbarButton, GUILayout.Height(16)); if (masterExpand) { ExpandCollapseAll(_settings, true); } if (masterCollapse) { ExpandCollapseAll(_settings, false); } GUI.contentColor = Color.white; } else { GUILayout.FlexibleSpace(); } EditorGUILayout.BeginHorizontal(GUILayout.MaxWidth(50)); var topAdded = false; var addText = string.Format("Click to add Pool item{0}.", _settings.poolItems.Count > 0 ? " before the first" : ""); GUI.contentColor = DTInspectorUtility.AddButtonColor; // Main Add button if (GUILayout.Button(new GUIContent("Add", addText), EditorStyles.toolbarButton, GUILayout.Height(16))) { topAdded = true; } GUI.contentColor = Color.white; GUILayout.Space(4); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndHorizontal(); EditorGUILayout.EndHorizontal(); int?itemToDelete = null; int?itemToInsert = null; int?itemToShiftUp = null; int?itemToShiftDown = null; if (_settings.isExpanded) { DTInspectorUtility.BeginGroupedControls(); for (var i = 0; i < _settings.poolItems.Count; i++) { var item = _settings.poolItems[i]; DTInspectorUtility.StartGroupHeader(1); EditorGUILayout.BeginHorizontal(); EditorGUI.indentLevel = 1; var sName = ""; if (!item.isExpanded) { if (item.prefabToSpawn == null) { sName = " " + LevelSettings.EmptyValue; } else { sName = " (" + item.prefabToSpawn.name + ")"; } } var sDisabled = ""; var itemDisabled = item.activeMode == LevelSettings.ActiveItemMode.Never; if (!item.isExpanded && itemDisabled) { sDisabled = " - DISABLED"; } var newItemExpanded = DTInspectorUtility.Foldout(item.isExpanded, string.Format("Pool Item #{0}{1}{2}", (i + 1), sName, sDisabled)); if (newItemExpanded != item.isExpanded) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "toggle expand Pool Item"); item.isExpanded = newItemExpanded; } GUILayout.FlexibleSpace(); if (Application.isPlaying) { GUI.contentColor = DTInspectorUtility.BrightTextColor; var itemCount = _settings.PoolInstancesOfIndex(i); GUILayout.Label("Remaining: " + itemCount); GUI.contentColor = Color.white; } var poolItemButton = DTInspectorUtility.AddFoldOutListItemButtons(i, _settings.poolItems.Count, "Pool Item", false, true); switch (poolItemButton) { case DTInspectorUtility.FunctionButtons.Remove: itemToDelete = i; _isDirty = true; break; case DTInspectorUtility.FunctionButtons.Add: itemToInsert = i; _isDirty = true; break; case DTInspectorUtility.FunctionButtons.ShiftUp: itemToShiftUp = i; _isDirty = true; break; case DTInspectorUtility.FunctionButtons.ShiftDown: itemToShiftDown = i; _isDirty = true; break; } EditorGUI.indentLevel = 0; EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); if (itemDisabled) { DTInspectorUtility.ShowColorWarningBox("This item is currently disabled and will never spawn."); } if (!item.isExpanded) { EditorGUILayout.EndVertical(); continue; } EditorGUI.indentLevel = 0; if (item.prefabToSpawn == null && !itemDisabled) { DTInspectorUtility.ShowColorWarningBox("Nothing will spawn when this item is chosen from the pool."); } var newActive = (LevelSettings.ActiveItemMode)EditorGUILayout.EnumPopup("Active Mode", item.activeMode); if (newActive != item.activeMode) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "toggle Active Mode"); item.activeMode = newActive; } switch (item.activeMode) { case LevelSettings.ActiveItemMode.IfWorldVariableInRange: case LevelSettings.ActiveItemMode.IfWorldVariableOutsideRange: var missingStatNames = new List <string>(); missingStatNames.AddRange(allStats); missingStatNames.RemoveAll(delegate(string obj) { return(item.activeItemCriteria.HasKey(obj)); }); var newStat = EditorGUILayout.Popup("Add Active Limit", 0, missingStatNames.ToArray()); if (newStat != 0) { AddActiveLimit(missingStatNames[newStat], item); } if (item.activeItemCriteria.statMods.Count == 0) { DTInspectorUtility.ShowRedErrorBox("You have no Active Limits. Item will never be Active."); } else { EditorGUILayout.Separator(); int?indexToDelete = null; for (var j = 0; j < item.activeItemCriteria.statMods.Count; j++) { var modifier = item.activeItemCriteria.statMods[j]; EditorGUILayout.BeginHorizontal(); GUILayout.Space(15); var statName = modifier._statName; GUILayout.Label(statName); GUILayout.FlexibleSpace(); GUILayout.Label("Min"); switch (modifier._varTypeToUse) { case WorldVariableTracker.VariableType._integer: var newMin = EditorGUILayout.IntField(modifier._modValueIntMin, GUILayout.MaxWidth(60)); if (newMin != modifier._modValueIntMin) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "change Active Limit Min"); modifier._modValueIntMin = newMin; } GUILayout.Label("Max"); var newMax = EditorGUILayout.IntField(modifier._modValueIntMax, GUILayout.MaxWidth(60)); if (newMax != modifier._modValueIntMax) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "change Active Limit Max"); modifier._modValueIntMax = newMax; } break; case WorldVariableTracker.VariableType._float: var newMinFloat = EditorGUILayout.FloatField(modifier._modValueFloatMin, GUILayout.MaxWidth(60)); if (newMinFloat != modifier._modValueFloatMin) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "change Active Limit Min"); modifier._modValueFloatMin = newMinFloat; } GUILayout.Label("Max"); var newMaxFloat = EditorGUILayout.FloatField(modifier._modValueFloatMax, GUILayout.MaxWidth(60)); if (newMaxFloat != modifier._modValueFloatMax) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "change Active Limit Max"); modifier._modValueFloatMax = newMaxFloat; } break; default: Debug.LogError("Add code for varType: " + modifier._varTypeToUse.ToString()); break; } var oldBG = GUI.backgroundColor; GUI.backgroundColor = DTInspectorUtility.DeleteButtonColor; if (GUILayout.Button(new GUIContent("Delete", "Remove this limit"), EditorStyles.miniButtonMid, GUILayout.MaxWidth(64))) { indexToDelete = j; } GUI.backgroundColor = oldBG; GUILayout.Space(5); EditorGUILayout.EndHorizontal(); var min = modifier._varTypeToUse == WorldVariableTracker.VariableType._integer ? modifier._modValueIntMin : modifier._modValueFloatMin; var max = modifier._varTypeToUse == WorldVariableTracker.VariableType._integer ? modifier._modValueIntMax : modifier._modValueFloatMax; if (min > max) { DTInspectorUtility.ShowRedErrorBox(modifier._statName + " Min cannot exceed Max, please fix!"); } } DTInspectorUtility.ShowColorWarningBox("Limits are inclusive: i.e. 'Above' means >="); if (indexToDelete.HasValue) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "delete Active Limit"); item.activeItemCriteria.DeleteByIndex(indexToDelete.Value); } DTInspectorUtility.VerticalSpace(2); } break; } var newPrefab = (Transform)EditorGUILayout.ObjectField("Prefab", item.prefabToSpawn, typeof(Transform), true); if (newPrefab != item.prefabToSpawn) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "change Prefab"); item.prefabToSpawn = newPrefab; } KillerVariablesHelper.DisplayKillerInt(ref _isDirty, item.thisWeight, "Weight", _settings); EditorGUILayout.EndVertical(); DTInspectorUtility.AddSpaceForNonU5(); } DTInspectorUtility.EndGroupedControls(); } if (topAdded) { var newItem = new WavePrefabPoolItem(); var index = 0; if (_settings.poolItems.Count > 0) { index = _settings.poolItems.Count - 1; } UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "add Prefab Pool Item"); _settings.poolItems.Insert(index, newItem); } else if (itemToDelete.HasValue) { if (_settings.poolItems.Count == 1) { DTInspectorUtility.ShowAlert("You cannot delete the only Prefab Pool item. Delete the entire Pool from the hierarchy if you wish."); } else { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "remove Prefab Pool Item"); _settings.poolItems.RemoveAt(itemToDelete.Value); } } else if (itemToInsert.HasValue) { var newItem = new WavePrefabPoolItem(); UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "add Prefab Pool Item"); _settings.poolItems.Insert(itemToInsert.Value + 1, newItem); } if (itemToShiftUp.HasValue) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "shift up Prefab Pool Item"); var item = _settings.poolItems[itemToShiftUp.Value]; _settings.poolItems.Insert(itemToShiftUp.Value - 1, item); _settings.poolItems.RemoveAt(itemToShiftUp.Value + 1); } if (itemToShiftDown.HasValue) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "shift down Prefab Pool Item"); var index = itemToShiftDown.Value + 1; var item = _settings.poolItems[index]; _settings.poolItems.Insert(index - 1, item); _settings.poolItems.RemoveAt(index + 1); } if (alphaSort) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "Alpha Sort Prefab Pool Items"); _settings.poolItems.Sort(delegate(WavePrefabPoolItem x, WavePrefabPoolItem y) { if (x.prefabToSpawn == null) { return(-1); } if (y.prefabToSpawn == null) { return(1); } return(x.prefabToSpawn.name.CompareTo(y.prefabToSpawn.name)); }); } if (GUI.changed || topAdded || _isDirty) { EditorUtility.SetDirty(target); // or it won't save the data!! } //DrawDefaultInspector(); }
// ReSharper disable once FunctionComplexityOverflow public override void OnInspectorGUI() { _settings = (WavePrefabPoolGroup)target; WorldVariableTracker.ClearInGamePlayerStats(); DTInspectorUtility.DrawTexture(CoreGameKitInspectorResources.LogoTexture); _isDirty = false; DTInspectorUtility.BeginGroupedControls(); DTInspectorUtility.StartGroupHeader(); EditorGUI.indentLevel = 1; var newExp = DTInspectorUtility.Foldout(_settings.newPrefabPoolExpanded, "Create New Prefab Pools"); if (newExp != _settings.newPrefabPoolExpanded) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "toggle expand Create New Prefab Pools"); _settings.newPrefabPoolExpanded = newExp; } EditorGUILayout.EndVertical(); if (_settings.newPrefabPoolExpanded) { EditorGUI.indentLevel = 0; var newPoolName = EditorGUILayout.TextField("New Pool Name", _settings.newPrefabPoolName); if (newPoolName != _settings.newPrefabPoolName) { UndoHelper.RecordObjectPropertyForUndo(ref _isDirty, _settings, "change New Pool Name"); _settings.newPrefabPoolName = newPoolName; } EditorGUILayout.BeginHorizontal(); GUILayout.Space(6); GUI.contentColor = DTInspectorUtility.AddButtonColor; if (GUILayout.Button("Create Prefab Pool", EditorStyles.toolbarButton, GUILayout.MaxWidth(110))) { CreatePrefabPool(); } GUI.contentColor = Color.white; GUILayout.FlexibleSpace(); EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndVertical(); DTInspectorUtility.VerticalSpace(2); var pools = LevelSettings.GetAllPrefabPools; if (pools.Count == 0) { DTInspectorUtility.ShowColorWarningBox("You currently have no Prefab Pools."); } foreach (var pool in pools) { DTInspectorUtility.StartGroupHeader(1, false); EditorGUILayout.BeginHorizontal(); var poolScript = pool.GetComponent <WavePrefabPool>(); var itemName = pool.name + " (" + poolScript.poolItems.Count + " "; itemName += (poolScript.poolItems.Count == 1 ? "item" : "items") + ")"; GUILayout.Label(itemName); GUILayout.FlexibleSpace(); var buttonPressed = DTInspectorUtility.AddControlButtons("Prefab Pool"); if (buttonPressed == DTInspectorUtility.FunctionButtons.Edit) { Selection.activeGameObject = pool.gameObject; } EditorGUILayout.EndHorizontal(); EditorGUILayout.EndVertical(); } DTInspectorUtility.EndGroupedControls(); if (GUI.changed || _isDirty) { EditorUtility.SetDirty(target); // or it won't save the data!! } }