private void OnGUI() { GUILayout.BeginArea(new Rect(10, 10, 300, 300)); GUILayout.BeginHorizontal(); GUILayout.BeginVertical(); var load = GUILayout.Button("Load Database 1"); var unload = GUILayout.Button("Unload Database 1"); GUILayout.EndVertical(); GUILayout.BeginVertical(); var load2 = GUILayout.Button("Load Database 2"); var unload2 = GUILayout.Button("Unload Database 2"); GUILayout.EndVertical(); GUILayout.EndHorizontal(); var log = GUILayout.Button("Log Pool"); GUILayout.EndArea(); GUILayout.BeginArea(new Rect(320, 10, 300, 300)); GUILayout.BeginVertical(); GUILayout.BeginHorizontal(); if (GUILayout.Toggle(_prefabSelection == 0, "Prefab 1")) { _prefabSelection = 0; } if (GUILayout.Toggle(_prefabSelection == 1, "Prefab 2")) { _prefabSelection = 1; } if (GUILayout.Toggle(_prefabSelection == 2, "Prefab 3")) { _prefabSelection = 2; } GUILayout.EndHorizontal(); GUI.color = new Color(0.8f, 0.8f, 0f); GUILayout.Label("Click on the plane to instantiate an object through the pool syste. Click an object to return it to the pool."); GUILayout.EndVertical(); GUILayout.EndArea(); if (load) { GameObjectPoolManager.LoadDatabase(_poolableDatabase1); GameObjectPoolManager.PopulateAll(); } if (unload) { GameObjectPoolManager.UnloadDatabase(_poolableDatabase1); GameObjectPoolManager.PopulateAll(); } if (load2) { GameObjectPoolManager.LoadDatabase(_poolableDatabase2); GameObjectPoolManager.PopulateAll(); } if (unload2) { GameObjectPoolManager.UnloadDatabase(_poolableDatabase2); GameObjectPoolManager.PopulateAll(); } if (log) { _logText = GameObjectPoolManager.Log(); _lastLogTime = Time.time; } if (Time.time - _lastLogTime < 5f) { GUILayout.BeginArea(new Rect(10, 320, 300, Screen.height - 320)); GUI.color = new Color(0.8f, 0.8f, 0f); GUILayout.Label(_logText); GUILayout.EndArea(); } }
public override void OnInspectorGUI() { serializedObject.Update(); Undo.RecordObject(target, "Changed GameObjectPoolDefinitionDatabase"); var count = _database.ObjectPoolDefinitions.Count; var listProp = serializedObject.FindProperty("ObjectPoolDefinitions"); GUILayout.Label(new GUIContent(string.Format("{0} {1}:", count, count > 1 ? "Definitions" : "Definition"))); var i = 0; while (i < count) { var definitionProp = listProp.GetArrayElementAtIndex(i); var prefabProp = definitionProp.FindPropertyRelative("Prefab"); var countProp = definitionProp.FindPropertyRelative("Count"); EditorGUILayout.BeginHorizontal(); EditorGUILayout.PropertyField(prefabProp, GUIContent.none); var cacheLableWidth = EditorGUIUtility.labelWidth; EditorGUIUtility.labelWidth = 90; EditorGUILayout.PropertyField(countProp, new GUIContent("Pool Count")); countProp.intValue = Mathf.Max(countProp.intValue, 0); EditorGUIUtility.labelWidth = cacheLableWidth; var delete = GUILayout.Button("X"); EditorGUILayout.EndHorizontal(); if (delete) { _database.ObjectPoolDefinitions.RemoveAt(i); return; } i++; } GUILayout.Space(10); // Edit list GUILayout.BeginHorizontal(); GUILayout.FlexibleSpace(); var sortAZ = GUILayout.Button("Sort A-Z"); var add = GUILayout.Button("+", GUILayout.MinWidth(40)); if (add) { _database.ObjectPoolDefinitions.Add(new GameObjectPoolDefinition()); } if (sortAZ) { _database.ObjectPoolDefinitions = _database.ObjectPoolDefinitions.OrderBy(x => x.Name) .OrderBy(x => x.Prefab == null ? 1 : 0) .ToList(); } GUILayout.EndHorizontal(); // Apply changes serializedObject.ApplyModifiedProperties(); GUILayout.Space(10); // Drag and Drop prefabs var e = Event.current; var position = EditorGUILayout.GetControlRect(false, 30); var dragAndDropStyle = new GUIStyle(GUI.skin.box); dragAndDropStyle.alignment = TextAnchor.MiddleCenter; dragAndDropStyle.normal.textColor = Color.gray; GUI.Box(position, "Drop Prefabs Here", dragAndDropStyle); switch (e.type) { case EventType.DragUpdated: case EventType.DragPerform: if (!position.Contains(e.mousePosition)) { break; } DragAndDrop.visualMode = DragAndDropVisualMode.Copy; if (e.type == EventType.DragPerform) { DragAndDrop.AcceptDrag(); foreach (var draggedObject in DragAndDrop.objectReferences) { var go = draggedObject as GameObject; if (go && PrefabUtility.GetPrefabType(go) == PrefabType.Prefab) { _database.ObjectPoolDefinitions.Add(new GameObjectPoolDefinition(go)); serializedObject.ApplyModifiedProperties(); } } } Event.current.Use(); break; } GUILayout.Space(20); // Meta Data var isLoaded = GameObjectPoolManager.IsLoaded(_database); GUILayout.Label(new GUIContent(string.Format("Is Loaded: {0}", isLoaded))); GUILayout.BeginHorizontal(); var selectPrefabs = GUILayout.Button("Select Prefabs"); var doLoad = GUILayout.Button(isLoaded ? "Unload" : "Load"); GUI.enabled = isLoaded; GUILayout.EndHorizontal(); GUI.enabled = true; if (selectPrefabs) { Selection.objects = _database.ObjectPoolDefinitions.Select(x => x.Prefab as Object).Where(x => x != null).ToArray(); } if (doLoad) { if (isLoaded) { GameObjectPoolManager.UnloadDatabase(_database); } else { GameObjectPoolManager.LoadDatabase(_database); } } }