123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- //------------------------------------------------------------
- // Game Framework
- // Copyright © 2013-2021 loyalsoft. All rights reserved.
- // Homepage: http://www.game7000.com/
- // Feedback: http://www.game7000.com/
- //------------------------------------------------------------
- using GameFramework;
- using GameFramework.ObjectPool;
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Text;
- using UnityEditor;
- using UnityEngine;
- using UnityGameFramework.Runtime;
- namespace UnityGameFramework.Editor
- {
- [CustomEditor(typeof(ObjectPoolComponent))]
- internal sealed class ObjectPoolComponentInspector : GameFrameworkInspector
- {
- private readonly HashSet<string> m_OpenedItems = new HashSet<string>();
- public override void OnInspectorGUI()
- {
- base.OnInspectorGUI();
- if (!EditorApplication.isPlaying)
- {
- EditorGUILayout.HelpBox("Available during runtime only.", MessageType.Info);
- return;
- }
- ObjectPoolComponent t = (ObjectPoolComponent)target;
- if (IsPrefabInHierarchy(t.gameObject))
- {
- EditorGUILayout.LabelField("Object Pool Count", t.Count.ToString());
- ObjectPoolBase[] objectPools = t.GetAllObjectPools(true);
- foreach (ObjectPoolBase objectPool in objectPools)
- {
- DrawObjectPool(objectPool);
- }
- }
- Repaint();
- }
- private void OnEnable()
- {
- }
- private void DrawObjectPool(ObjectPoolBase objectPool)
- {
- bool lastState = m_OpenedItems.Contains(objectPool.FullName);
- bool currentState = EditorGUILayout.Foldout(lastState, objectPool.FullName);
- if (currentState != lastState)
- {
- if (currentState)
- {
- m_OpenedItems.Add(objectPool.FullName);
- }
- else
- {
- m_OpenedItems.Remove(objectPool.FullName);
- }
- }
- if (currentState)
- {
- EditorGUILayout.BeginVertical("box");
- {
- EditorGUILayout.LabelField("Name", objectPool.Name);
- EditorGUILayout.LabelField("Type", objectPool.ObjectType.FullName);
- EditorGUILayout.LabelField("Auto Release Interval", objectPool.AutoReleaseInterval.ToString());
- EditorGUILayout.LabelField("Capacity", objectPool.Capacity.ToString());
- EditorGUILayout.LabelField("Used Count", objectPool.Count.ToString());
- EditorGUILayout.LabelField("Can Release Count", objectPool.CanReleaseCount.ToString());
- EditorGUILayout.LabelField("Expire Time", objectPool.ExpireTime.ToString());
- EditorGUILayout.LabelField("Priority", objectPool.Priority.ToString());
- ObjectInfo[] objectInfos = objectPool.GetAllObjectInfos();
- if (objectInfos.Length > 0)
- {
- EditorGUILayout.LabelField("Name", objectPool.AllowMultiSpawn ? "Locked\tCount\tFlag\tPriority\tLast Use Time" : "Locked\tIn Use\tFlag\tPriority\tLast Use Time");
- foreach (ObjectInfo objectInfo in objectInfos)
- {
- EditorGUILayout.LabelField(string.IsNullOrEmpty(objectInfo.Name) ? "<None>" : objectInfo.Name, Utility.Text.Format("{0}\t{1}\t{2}\t{3}\t{4}", objectInfo.Locked.ToString(), objectPool.AllowMultiSpawn ? objectInfo.SpawnCount.ToString() : objectInfo.IsInUse.ToString(), objectInfo.CustomCanReleaseFlag.ToString(), objectInfo.Priority.ToString(), objectInfo.LastUseTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss")));
- }
- if (GUILayout.Button("Release"))
- {
- objectPool.Release();
- }
- if (GUILayout.Button("Release All Unused"))
- {
- objectPool.ReleaseAllUnused();
- }
- if (GUILayout.Button("Export CSV Data"))
- {
- string exportFileName = EditorUtility.SaveFilePanel("Export CSV Data", string.Empty, Utility.Text.Format("Object Pool Data - {0}.csv", objectPool.Name), string.Empty);
- if (!string.IsNullOrEmpty(exportFileName))
- {
- try
- {
- int index = 0;
- string[] data = new string[objectInfos.Length + 1];
- data[index++] = Utility.Text.Format("Name,Locked,{0},Custom Can Release Flag,Priority,Last Use Time", objectPool.AllowMultiSpawn ? "Count" : "In Use");
- foreach (ObjectInfo objectInfo in objectInfos)
- {
- data[index++] = Utility.Text.Format("{0},{1},{2},{3},{4},{5}", objectInfo.Name, objectInfo.Locked.ToString(), objectPool.AllowMultiSpawn ? objectInfo.SpawnCount.ToString() : objectInfo.IsInUse.ToString(), objectInfo.CustomCanReleaseFlag.ToString(), objectInfo.Priority.ToString(), objectInfo.LastUseTime.ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss"));
- }
- File.WriteAllLines(exportFileName, data, Encoding.UTF8);
- Debug.Log(Utility.Text.Format("Export object pool CSV data to '{0}' success.", exportFileName));
- }
- catch (Exception exception)
- {
- Debug.LogError(Utility.Text.Format("Export object pool CSV data to '{0}' failure, exception is '{1}'.", exportFileName, exception.ToString()));
- }
- }
- }
- }
- else
- {
- GUILayout.Label("Object Pool is Empty ...");
- }
- }
- EditorGUILayout.EndVertical();
- EditorGUILayout.Separator();
- }
- }
- }
- }
|