From 612eead0cdab1e07319241972fa216e6b48df068 Mon Sep 17 00:00:00 2001 From: coffee <985942825@qq.com> Date: Sat, 4 Jan 2025 01:48:06 +0800 Subject: [PATCH] SimpleGOPoolKit --- .../Core/EasyPool/Core/IAbstractPool.cs | 2 +- .../EasyPool/Core/RecyclablePoolConfig.cs | 2 +- .../Core/EasyPool/Core/RecyclablePoolInfo.cs | 6 +- Assets/Unity-Tools/Core/EasyPool/Editor.meta | 3 + .../Editor/SimpleGOPoolManagerInspector.cs | 105 +++ .../SimpleGOPoolManagerInspector.cs.meta | 3 + .../EasyPool/SimpleGOPool/SimpleGOPoolKit.cs | 308 +++++++ .../SimpleGOPool/SimpleGOPoolKit.cs.meta | 3 + .../SimpleGOPool/SimpleGameObjectPool.cs | 22 +- .../Demo/EasyPoolKit/SimpleGOPool/Cube.prefab | 110 +++ .../EasyPoolKit/SimpleGOPool/Cube.prefab.meta | 7 + .../EasyPoolKit/SimpleGOPool/Image.prefab | 77 ++ .../SimpleGOPool/Image.prefab.meta | 7 + .../SimpleGOPool/SimpleGOPool.unity | 779 ++++++++++++++++-- .../SimpleGOPool/SimpleGOPoolManager.cs | 54 +- 15 files changed, 1394 insertions(+), 94 deletions(-) create mode 100644 Assets/Unity-Tools/Core/EasyPool/Editor.meta create mode 100644 Assets/Unity-Tools/Core/EasyPool/Editor/SimpleGOPoolManagerInspector.cs create mode 100644 Assets/Unity-Tools/Core/EasyPool/Editor/SimpleGOPoolManagerInspector.cs.meta create mode 100644 Assets/Unity-Tools/Core/EasyPool/SimpleGOPool/SimpleGOPoolKit.cs create mode 100644 Assets/Unity-Tools/Core/EasyPool/SimpleGOPool/SimpleGOPoolKit.cs.meta create mode 100644 Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Cube.prefab create mode 100644 Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Cube.prefab.meta create mode 100644 Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Image.prefab create mode 100644 Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Image.prefab.meta diff --git a/Assets/Unity-Tools/Core/EasyPool/Core/IAbstractPool.cs b/Assets/Unity-Tools/Core/EasyPool/Core/IAbstractPool.cs index 0ca50a2..767d590 100644 --- a/Assets/Unity-Tools/Core/EasyPool/Core/IAbstractPool.cs +++ b/Assets/Unity-Tools/Core/EasyPool/Core/IAbstractPool.cs @@ -31,7 +31,7 @@ namespace Tools.EasyPoolKit PoolClearType ClearType { get; } - bool IfIgnoreTimeScale { get; } + bool IsIgnoreTimeScale { get; } int GetCachedObjectCount(); diff --git a/Assets/Unity-Tools/Core/EasyPool/Core/RecyclablePoolConfig.cs b/Assets/Unity-Tools/Core/EasyPool/Core/RecyclablePoolConfig.cs index e2aa301..e438bb3 100644 --- a/Assets/Unity-Tools/Core/EasyPool/Core/RecyclablePoolConfig.cs +++ b/Assets/Unity-Tools/Core/EasyPool/Core/RecyclablePoolConfig.cs @@ -15,7 +15,7 @@ namespace Tools.EasyPoolKit public int? MaxDespawnCount = null; public PoolClearType ClearType = PoolClearType.Default; public float? AutoClearTime = null; - public bool IfIgnoreTimeScale = false; + public bool IsIgnoreTimeScale = false; public object[] ExtraArgs = Array.Empty(); } } \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/EasyPool/Core/RecyclablePoolInfo.cs b/Assets/Unity-Tools/Core/EasyPool/Core/RecyclablePoolInfo.cs index ebff318..b40fdc6 100644 --- a/Assets/Unity-Tools/Core/EasyPool/Core/RecyclablePoolInfo.cs +++ b/Assets/Unity-Tools/Core/EasyPool/Core/RecyclablePoolInfo.cs @@ -14,7 +14,7 @@ namespace Tools.EasyPoolKit public int? MaxDespawnCount { get; private set; } = null; public PoolClearType ClearType { get; private set; } = PoolClearType.Default; public float? AutoClearTime { get; private set; } = null; - public bool IfIgnoreTimeScale { get; private set; } = false; + public bool IsIgnoreTimeScale { get; private set; } = false; public int CachedObjectCount => _getCachedCount?.Invoke() ?? 0; @@ -49,7 +49,7 @@ namespace Tools.EasyPoolKit MaxDespawnCount = config.MaxDespawnCount; ClearType = config.ClearType; AutoClearTime = config.AutoClearTime; - IfIgnoreTimeScale = config.IfIgnoreTimeScale; + IsIgnoreTimeScale = config.IsIgnoreTimeScale; _getCachedCount = getCachedCount; _getUsedCount = getUsedCount; @@ -78,7 +78,7 @@ namespace Tools.EasyPoolKit .Append("==========").Append(ReferenceType.ToString()).Append('\n') .Append("AutoClearTime:").Append((AutoClearTime.HasValue ? AutoClearTime.Value.ToString() : "-")).Append('\n') .Append("==========").Append(ReferenceType.ToString()).Append('\n') - .Append("IfIgnoreTimeScale:").Append(IfIgnoreTimeScale.ToString()).Append('\n'); + .Append("IfIgnoreTimeScale:").Append(IsIgnoreTimeScale.ToString()).Append('\n'); return stringBuilder.ToString(); #else diff --git a/Assets/Unity-Tools/Core/EasyPool/Editor.meta b/Assets/Unity-Tools/Core/EasyPool/Editor.meta new file mode 100644 index 0000000..dd13377 --- /dev/null +++ b/Assets/Unity-Tools/Core/EasyPool/Editor.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ef6366134be2491abe6c53f03aa7f5ca +timeCreated: 1735923167 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/EasyPool/Editor/SimpleGOPoolManagerInspector.cs b/Assets/Unity-Tools/Core/EasyPool/Editor/SimpleGOPoolManagerInspector.cs new file mode 100644 index 0000000..0b6a559 --- /dev/null +++ b/Assets/Unity-Tools/Core/EasyPool/Editor/SimpleGOPoolManagerInspector.cs @@ -0,0 +1,105 @@ +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace Tools.EasyPoolKit.Editor +{ + [CustomEditor(typeof(SimpleGOPoolKit))] + public class SimpleGOPoolManagerInspector : UnityEditor.Editor + { + private readonly HashSet _poolIdsSet = new HashSet(); + + public override void OnInspectorGUI() + { + // if (!EditorApplication.isPlaying) + // { + // EditorGUILayout.HelpBox("只在运行时可用。", MessageType.Info); + // return; + // } + // + var poolKit = target as SimpleGOPoolKit; + + if (poolKit) + { + EditorGUILayout.LabelField("SimpleGOPoolKit"); + + var poolsInfo = poolKit.GetPoolsInfo(); + + EditorGUILayout.LabelField("GameObject Pool Count", poolsInfo.Count.ToString()); + + foreach (var poolInfo in poolsInfo) + { + DrawGameObjectPool(poolInfo); + } + } + + Repaint(); // 每帧都会调用OnInspectorGUI,所以这里的Repaint会导致每帧都会刷新Inspector + } + + private void DrawGameObjectPool(RecyclablePoolInfo poolInfo) + { + var isLastOpened = _poolIdsSet.Contains(poolInfo.PoolId); + var isCurOpened = EditorGUILayout.Foldout(isLastOpened, poolInfo.PoolId); + + if (isCurOpened != isLastOpened) + { + if (isCurOpened) + { + _poolIdsSet.Add(poolInfo.PoolId); + } + else + { + _poolIdsSet.Remove(poolInfo.PoolId); + } + } + + if (isCurOpened) + { + EditorGUILayout.BeginVertical("box"); + { + EditorGUILayout.LabelField("PoolId", poolInfo.PoolId); + EditorGUILayout.LabelField("ReferenceType", poolInfo.ReferenceType.ToString()); + EditorGUILayout.LabelField("InitCreateCount", poolInfo.InitCreateCount.HasValue ? poolInfo.InitCreateCount.Value.ToString() : "-"); + EditorGUILayout.LabelField("ReachMaxLimitType", poolInfo.ReachMaxLimitType.ToString()); + if (poolInfo.ReachMaxLimitType != PoolReachMaxLimitType.Default) + { + EditorGUILayout.LabelField("MaxSpawnCount", poolInfo.MaxSpawnCount.HasValue ? poolInfo.MaxSpawnCount.Value.ToString() : "-"); + } + EditorGUILayout.LabelField("DespawnDestroyType", poolInfo.DespawnDestroyType.ToString()); + if (poolInfo.DespawnDestroyType == PoolDespawnDestroyType.DestroyToLimit) + { + EditorGUILayout.LabelField("MaxDespawnCount", poolInfo.MaxDespawnCount.HasValue ? poolInfo.MaxDespawnCount.Value.ToString() : "-"); + } + + EditorGUILayout.LabelField("ClearType", poolInfo.ClearType.ToString()); + EditorGUILayout.LabelField("AutoClearTime", poolInfo.AutoClearTime.ToString()); + EditorGUILayout.LabelField("IfIgnoreTimeScale", poolInfo.IsIgnoreTimeScale.ToString()); + EditorGUILayout.LabelField("CachedObjectCount", poolInfo.CachedObjectCount.ToString()); + EditorGUILayout.LabelField("UsedObjectCount", poolInfo.UsedObjectCount.ToString()); + EditorGUILayout.LabelField("TotalObjectCount", poolInfo.TotalObjectCount.ToString()); + + if (GUILayout.Button("ClearUnusedObjects(Safe)")) + { + if (poolInfo.ExtraInfo is SimpleGameObjectPool pool) + { + pool.ClearUnusedObjects(); + } + } + + if (GUILayout.Button("ClearPool(Unsafe)")) + { + if (poolInfo.ExtraInfo is SimpleGameObjectPool pool) + { + pool.ClearAll(); + } + } + + //TODO Draw all Objects + } + EditorGUILayout.EndVertical(); + + EditorGUILayout.Separator(); + } + } + } +} \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/EasyPool/Editor/SimpleGOPoolManagerInspector.cs.meta b/Assets/Unity-Tools/Core/EasyPool/Editor/SimpleGOPoolManagerInspector.cs.meta new file mode 100644 index 0000000..bcde1a2 --- /dev/null +++ b/Assets/Unity-Tools/Core/EasyPool/Editor/SimpleGOPoolManagerInspector.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: ef6bc10cd01946918340eecebc59c854 +timeCreated: 1735923179 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/EasyPool/SimpleGOPool/SimpleGOPoolKit.cs b/Assets/Unity-Tools/Core/EasyPool/SimpleGOPool/SimpleGOPoolKit.cs new file mode 100644 index 0000000..0227778 --- /dev/null +++ b/Assets/Unity-Tools/Core/EasyPool/SimpleGOPool/SimpleGOPoolKit.cs @@ -0,0 +1,308 @@ +using System; +using System.Collections.Generic; +using NUnit.Framework; +using UnityEngine; + +namespace Tools.EasyPoolKit +{ + public class SimpleGOPoolKit : MonoBehaviour + { + public static SimpleGOPoolKit Instance + { + get + { + if (_instance == null) + { + var poolRoot = new GameObject("SimpleGOPoolKit"); + var cachedRoot = new GameObject("CachedRoot"); + cachedRoot.transform.SetParent(poolRoot.transform, false); + cachedRoot.gameObject.SetActive(false); + _instance = poolRoot.AddComponent(); + _instance._cachedRoot = cachedRoot.transform; + DontDestroyOnLoad(_instance.gameObject); + } + + return _instance; + } + } + + private static SimpleGOPoolKit _instance; + + // 缓存根节点 + private Transform _cachedRoot; + + // key: 预制体的HashID, value: 对应的预制体 + private Dictionary _prefabTemplates = new Dictionary(); + + // key: 预制体的HashID, value: 对应的对象池 + private Dictionary _gameObjPools = new Dictionary(); + + // key: 激活的物体实例的HashID, value: 对应的预制体的HashID + private Dictionary _gameObjRelations = new Dictionary(); + + private List _poolInfoList = new List(); + public List GetPoolsInfo() => _poolInfoList; + + private bool _ifAppQuit = false; + + + private void Awake() + { + Debug.Log("Awake"); + if (_instance != null) + { + Debug.LogError("EasyPoolKit == 不要绑定SimpleGOPoolKit到任何物体上, 使用SimpleGOPoolKit.Instance!"); + Destroy(gameObject); + } + } + + private void Update() + { + foreach (var poolPair in _gameObjPools) + { + var pool = poolPair.Value; + var deltaTime = pool.IsIgnoreTimeScale ? Time.unscaledDeltaTime : Time.deltaTime; + pool.OnPoolUpdate(deltaTime); + } + } + + private void OnApplicationQuit() + { + _ifAppQuit = true; + } + + private void OnDestroy() + { + if (!_ifAppQuit) + { + ClearAllPools(true); + } + } + + /// 检测是否已有对应的对象池 + public bool IsPoolValid(int prefabHash) + { + return _prefabTemplates.ContainsKey(prefabHash) && _gameObjPools.ContainsKey(prefabHash); + } + + public SimpleGameObjectPool RegisterPrefab(GameObject prefabAsset, RecyclablePoolConfig config = null) + { + Assert.IsNotNull(prefabAsset); + + var prefabHash = prefabAsset.GetInstanceID(); + +#if EASY_POOL_DEBUG + if (_gameObjPools.ContainsKey(prefabHash) || _prefabTemplates.ContainsKey(prefabHash)) + { + Debug.LogError($"EasyPoolKit == {prefabAsset.name} 已经注册过该预制体了!"); + return null; + } +#endif + + if (config == null) + { + config = GetSimpleGOPoolConfig(prefabAsset, null); + } + + if (config.SpawnFunc == null) + { + config.SpawnFunc = () => DefaultCreateObjectFunc(prefabHash); // 这里只是注册了一个方法,并没有直接执行 + } + + if (config.ExtraArgs == null || config.ExtraArgs.Length == 0) + { + config.ExtraArgs = new object[] { _cachedRoot }; + } + + _prefabTemplates[prefabHash] = prefabAsset; + var newPool = new SimpleGameObjectPool(config); + _gameObjPools[prefabHash] = newPool; + _poolInfoList.Add(newPool.GetPoolInfoReadOnly()); + + return newPool; + } + + public bool UnRegisterPrefab(int prefabHash) + { + _prefabTemplates.Remove(prefabHash); + RemoveObjectsRelationByAssetHash(prefabHash); + if (_gameObjPools.TryGetValue(prefabHash, out var pool)) + { + pool.ClearAll(); + _poolInfoList.Remove(pool.GetPoolInfoReadOnly()); + _gameObjPools.Remove(prefabHash); + + return true; + } + + return false; + } + + /// + /// 简单的生成一个对象 + /// + /// 使用该方法生成的对象时需要设置手动设置父级,否则无法正常取出对象 + /// + /// + /// + public GameObject SimpleSpawn(GameObject prefabTemplate) + { + Assert.IsNotNull(prefabTemplate); + + var prefabHash = prefabTemplate.GetInstanceID(); + + if (!_gameObjPools.TryGetValue(prefabHash, out var pool)) + { + pool = RegisterPrefab(prefabTemplate); + } + + var newObj = pool.SpawnObject(); + + _gameObjRelations[newObj.GetInstanceID()] = prefabHash; + + return newObj; + } + + public bool TrySpawn(int prefabHash, out GameObject newObj) + { + newObj = null; + if (_gameObjPools.TryGetValue(prefabHash, out var pool)) + { + newObj = pool.SpawnObject(); + _gameObjRelations[newObj.GetInstanceID()] = prefabHash; + } + + return newObj != null; + } + + public bool Despawn(GameObject usedObj) + { + Assert.IsNotNull(usedObj); + + var objHash = usedObj.GetInstanceID(); + + if (!_gameObjRelations.TryGetValue(objHash, out var assetHash)) + { + return false; + } + + if (!_gameObjPools.TryGetValue(assetHash, out var pool)) + { + return false; + } + + _gameObjRelations.Remove(objHash); + + return pool.DespawnObject(usedObj); + } + + public bool ClearPoolByAssetHash(int prefabHash, bool onlyClearUnused = false) + { + if (_gameObjPools.TryGetValue(prefabHash, out var pool)) + { + if (onlyClearUnused) + { + pool.ClearUnusedObjects(); + return true; + } + else + { + pool.ClearAll(); + return true; + } + } + + return false; + } + + public void ClearAllUnusedObjects() + { + foreach (var poolPair in _gameObjPools) + { + poolPair.Value.ClearUnusedObjects(); + } + } + + /// + /// 清空所有对象池 + /// + /// 是否摧毁所有对象池,再次需要使用时将重新注册 + public void ClearAllPools(bool isDestroy) + { + foreach (var pool in _gameObjPools) + { + pool.Value.ClearAll(); + } + + _gameObjRelations.Clear(); + + if (isDestroy) + { + if (_cachedRoot) + { + for (int i = _cachedRoot.childCount - 1; i >= 0; i--) + { + var child = _cachedRoot.GetChild(i).gameObject; + Destroy(child); + } + } + + _prefabTemplates.Clear(); + _poolInfoList.Clear(); + _gameObjPools.Clear(); + } + } + + private List _tempRemovedObjectList = new List(); + private void RemoveObjectsRelationByAssetHash(int assetHash) + { + foreach (var relation in _gameObjRelations) + { + if (relation.Value == assetHash) + { + _tempRemovedObjectList.Add(relation.Key); + } + } + + foreach (var removeItem in _tempRemovedObjectList) + { + _gameObjRelations.Remove(removeItem); + } + + _tempRemovedObjectList.Clear(); + } + + + public RecyclablePoolConfig GetSimpleGOPoolConfig(GameObject prefabAsset, Func spawnFunc) + { + Assert.IsNotNull(prefabAsset); + + var poolConfig = new RecyclablePoolConfig() + { + ObjectType = RecycleObjectType.GameObject, + ReferenceType = typeof(GameObject), + PoolId = $"SimplePool_{prefabAsset.name}_{prefabAsset.GetInstanceID()}", + SpawnFunc = spawnFunc, + }; + + return poolConfig; + } + + + private GameObject DefaultCreateObjectFunc(int prefabHash) + { + // 使用委托注册该本方法时_prefabTemplates不一定不一定含有该prefabHash,只有在真正调用该方法含有对应的prefabHash就OK了 + if (_prefabTemplates.TryGetValue(prefabHash, out var prefabAsset)) + { + if (prefabAsset != null) + { + var gameObj = Instantiate(prefabAsset); + return gameObj; + } + } + + Debug.LogError($"EasyPoolKit == Cannot create object: {prefabHash}"); + return null; + } + } +} \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/EasyPool/SimpleGOPool/SimpleGOPoolKit.cs.meta b/Assets/Unity-Tools/Core/EasyPool/SimpleGOPool/SimpleGOPoolKit.cs.meta new file mode 100644 index 0000000..7ecf2df --- /dev/null +++ b/Assets/Unity-Tools/Core/EasyPool/SimpleGOPool/SimpleGOPoolKit.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 68d17d2d113542f693bc4bc9d81114c7 +timeCreated: 1735917282 \ No newline at end of file diff --git a/Assets/Unity-Tools/Core/EasyPool/SimpleGOPool/SimpleGameObjectPool.cs b/Assets/Unity-Tools/Core/EasyPool/SimpleGOPool/SimpleGameObjectPool.cs index dd37483..29b79b7 100644 --- a/Assets/Unity-Tools/Core/EasyPool/SimpleGOPool/SimpleGameObjectPool.cs +++ b/Assets/Unity-Tools/Core/EasyPool/SimpleGOPool/SimpleGameObjectPool.cs @@ -25,7 +25,7 @@ namespace Tools.EasyPoolKit public PoolReachMaxLimitType ReachMaxLimitType { get; private set; } public PoolDespawnDestroyType DespawnDestroyType { get; private set; } public PoolClearType ClearType { get; private set; } - public bool IfIgnoreTimeScale { get; private set; } + public bool IsIgnoreTimeScale { get; private set; } public int GetCachedObjectCount() => CachedQueue.Count; public int GetUsedObjectCount() => UsedList.Count; @@ -55,7 +55,7 @@ namespace Tools.EasyPoolKit MaxSpawnCount = config.MaxSpawnCount; MaxDespawnCount = config.MaxDespawnCount; AutoClearTime = config.AutoClearTime; - IfIgnoreTimeScale = config.IfIgnoreTimeScale; + IsIgnoreTimeScale = config.IsIgnoreTimeScale; PoolInfo = new RecyclablePoolInfo(config, GetCachedObjectCount, GetUsedObjectCount, GetTotalObjectCount, this); @@ -173,14 +173,14 @@ namespace Tools.EasyPoolKit } else { - bool ifReachLimit = false; + bool isReachLimit = false; if (ReachMaxLimitType != PoolReachMaxLimitType.Default && MaxSpawnCount.HasValue) { - ifReachLimit = GetTotalObjectCount() >= MaxSpawnCount.Value; + isReachLimit = GetTotalObjectCount() >= MaxSpawnCount.Value; } - if (!ifReachLimit) + if (!isReachLimit) { cachedObj = CreateObject(); } @@ -252,21 +252,21 @@ namespace Tools.EasyPoolKit Debug.LogError($"EasyPoolKit == 无法回收该物体,该物体并不在使用物体队列中:{usedObj.name}"); } - bool ifReachLimit = false; + bool isReachLimit = false; if (DespawnDestroyType == PoolDespawnDestroyType.DestroyToLimit) { // if (MaxDespawnCount.HasValue && GetCachedObjectCount() > MaxDespawnCount.Value) if (MaxDespawnCount.HasValue && GetCachedObjectCount() > MaxDespawnCount.Value) { - ifReachLimit = true; + isReachLimit = true; } } UsedList.Remove(usedNode); UsedTimeDic.Remove(usedObj.GetInstanceID()); - if (ifReachLimit) + if (isReachLimit) { DestroyPoolObject(usedObj); } @@ -338,7 +338,11 @@ namespace Tools.EasyPoolKit private void PoolClearAll() { - ClearUnusedObjects(); + foreach (var cachedItem in CachedQueue) + { + DestroyPoolObject(cachedItem); + } + CachedQueue.Clear(); while (UsedList.Count > 0) { diff --git a/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Cube.prefab b/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Cube.prefab new file mode 100644 index 0000000..7e8d9aa --- /dev/null +++ b/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Cube.prefab @@ -0,0 +1,110 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &82165116843846793 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1262207781300642152} + - component: {fileID: 4310159731594785575} + - component: {fileID: 4452916137218812562} + - component: {fileID: 6953180764611318131} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1262207781300642152 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 82165116843846793} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 2.084, z: 2.399} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &4310159731594785575 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 82165116843846793} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &4452916137218812562 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 82165116843846793} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!65 &6953180764611318131 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 82165116843846793} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} diff --git a/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Cube.prefab.meta b/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Cube.prefab.meta new file mode 100644 index 0000000..1f933e6 --- /dev/null +++ b/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Cube.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: c3da4049b69f3154f9390ac8d19cfcf1 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Image.prefab b/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Image.prefab new file mode 100644 index 0000000..646ec1f --- /dev/null +++ b/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Image.prefab @@ -0,0 +1,77 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &676787276947558211 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7097476890679178042} + - component: {fileID: 7801389463094041662} + - component: {fileID: 1024640473808077771} + m_Layer: 5 + m_Name: Image + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &7097476890679178042 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 676787276947558211} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 91.5, y: -25} + m_SizeDelta: {x: 183, y: 50} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &7801389463094041662 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 676787276947558211} + m_CullTransparentMesh: 1 +--- !u!114 &1024640473808077771 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 676787276947558211} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 diff --git a/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Image.prefab.meta b/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Image.prefab.meta new file mode 100644 index 0000000..40255d4 --- /dev/null +++ b/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/Image.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 770926bef9745f9468d76286c104ffbd +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/SimpleGOPool.unity b/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/SimpleGOPool.unity index c277d9b..af25d1d 100644 --- a/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/SimpleGOPool.unity +++ b/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/SimpleGOPool.unity @@ -130,6 +130,7 @@ GameObject: - component: {fileID: 65465575} - component: {fileID: 65465574} - component: {fileID: 65465573} + - component: {fileID: 65465576} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -211,6 +212,50 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &65465576 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 65465572} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_Version: 2 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 --- !u!1 &79651670 GameObject: m_ObjectHideFlags: 0 @@ -332,6 +377,458 @@ MonoBehaviour: m_LightCookieSize: {x: 1, y: 1} m_LightCookieOffset: {x: 0, y: 0} m_SoftShadowQuality: 0 +--- !u!1 &330912624 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 330912625} + - component: {fileID: 330912628} + - component: {fileID: 330912627} + - component: {fileID: 330912626} + m_Layer: 5 + m_Name: Viewport + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &330912625 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 330912624} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1878731560} + m_Father: {fileID: 1366901895} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -17, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &330912626 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 330912624} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ShowMaskGraphic: 0 +--- !u!114 &330912627 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 330912624} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &330912628 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 330912624} + m_CullTransparentMesh: 1 +--- !u!1 &404696245 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 404696246} + - component: {fileID: 404696248} + - component: {fileID: 404696247} + m_Layer: 5 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &404696246 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 404696245} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1987258637} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &404696247 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 404696245} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &404696248 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 404696245} + m_CullTransparentMesh: 1 +--- !u!1 &1366901894 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1366901895} + - component: {fileID: 1366901898} + - component: {fileID: 1366901897} + - component: {fileID: 1366901896} + m_Layer: 5 + m_Name: Scroll View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1366901895 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1366901894} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 330912625} + - {fileID: 1942527436} + m_Father: {fileID: 1397674205} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 17, y: 178} + m_SizeDelta: {x: 200, y: 200} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1366901896 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1366901894} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Content: {fileID: 1878731560} + m_Horizontal: 0 + m_Vertical: 1 + m_MovementType: 1 + m_Elasticity: 0.1 + m_Inertia: 1 + m_DecelerationRate: 0.135 + m_ScrollSensitivity: 1 + m_Viewport: {fileID: 330912625} + m_HorizontalScrollbar: {fileID: 0} + m_VerticalScrollbar: {fileID: 1942527437} + m_HorizontalScrollbarVisibility: 2 + m_VerticalScrollbarVisibility: 0 + m_HorizontalScrollbarSpacing: -3 + m_VerticalScrollbarSpacing: -3 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1366901897 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1366901894} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0.392} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1366901898 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1366901894} + m_CullTransparentMesh: 1 +--- !u!1 &1397674201 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1397674205} + - component: {fileID: 1397674204} + - component: {fileID: 1397674203} + - component: {fileID: 1397674202} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1397674202 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1397674201} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 55 +--- !u!114 &1397674203 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1397674201} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1397674204 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1397674201} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 0 + m_Camera: {fileID: 0} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_VertexColorAlwaysGammaSpace: 0 + m_AdditionalShaderChannelsFlag: 0 + m_UpdateRectTransformForStandalone: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1397674205 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1397674201} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1366901895} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1878731559 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1878731560} + - component: {fileID: 1878731561} + - component: {fileID: 1878731562} + m_Layer: 5 + m_Name: Content + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1878731560 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1878731559} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 330912625} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 1} +--- !u!114 &1878731561 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1878731559} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3245ec927659c4140ac4f8d17403cc18, type: 3} + m_Name: + m_EditorClassIdentifier: + m_HorizontalFit: 0 + m_VerticalFit: 1 +--- !u!114 &1878731562 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1878731559} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 0 + m_Spacing: 0 + m_ChildForceExpandWidth: 1 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 1 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 --- !u!1 &1887936863 GameObject: m_ObjectHideFlags: 0 @@ -376,8 +873,12 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: c53679ae49565704d8a17892b9bbc378, type: 3} m_Name: m_EditorClassIdentifier: - prefab: {fileID: 2037916656} ---- !u!1 &2037916656 + cubePrefab: {fileID: 82165116843846793, guid: c3da4049b69f3154f9390ac8d19cfcf1, type: 3} + cubes: [] + imagePrefab: {fileID: 676787276947558211, guid: 770926bef9745f9468d76286c104ffbd, type: 3} + parent: {fileID: 1878731560} + images: [] +--- !u!1 &1942527435 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -385,101 +886,234 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 2037916660} - - component: {fileID: 2037916659} - - component: {fileID: 2037916658} - - component: {fileID: 2037916657} - m_Layer: 0 - m_Name: Cube + - component: {fileID: 1942527436} + - component: {fileID: 1942527439} + - component: {fileID: 1942527438} + - component: {fileID: 1942527437} + m_Layer: 5 + m_Name: Scrollbar Vertical m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!65 &2037916657 -BoxCollider: +--- !u!224 &1942527436 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2037916656} - m_Material: {fileID: 0} - m_IncludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_ExcludeLayers: - serializedVersion: 2 - m_Bits: 0 - m_LayerOverridePriority: 0 - m_IsTrigger: 0 - m_ProvidesContacts: 0 + m_GameObject: {fileID: 1942527435} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1987258637} + m_Father: {fileID: 1366901895} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 20, y: 0} + m_Pivot: {x: 1, y: 1} +--- !u!114 &1942527437 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1942527435} m_Enabled: 1 - serializedVersion: 3 - m_Size: {x: 1, y: 1, z: 1} - m_Center: {x: 0, y: 0, z: 0} ---- !u!23 &2037916658 -MeshRenderer: + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 404696247} + m_HandleRect: {fileID: 404696246} + m_Direction: 2 + m_Value: 0 + m_Size: 1 + m_NumberOfSteps: 0 + m_OnValueChanged: + m_PersistentCalls: + m_Calls: [] +--- !u!114 &1942527438 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2037916656} + m_GameObject: {fileID: 1942527435} m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_RayTracingMode: 2 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_AdditionalVertexStreams: {fileID: 0} ---- !u!33 &2037916659 -MeshFilter: + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!222 &1942527439 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1942527435} + m_CullTransparentMesh: 1 +--- !u!1 &1987258636 +GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2037916656} - m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} ---- !u!4 &2037916660 + serializedVersion: 6 + m_Component: + - component: {fileID: 1987258637} + m_Layer: 5 + m_Name: Sliding Area + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1987258637 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1987258636} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 404696246} + m_Father: {fileID: 1942527436} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: -20, y: -20} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!1 &1994288141 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1994288144} + - component: {fileID: 1994288143} + - component: {fileID: 1994288142} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1994288142 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1994288141} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 01614664b831546d2ae94a42149d80ac, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_MoveRepeatDelay: 0.5 + m_MoveRepeatRate: 0.1 + m_XRTrackingOrigin: {fileID: 0} + m_ActionsAsset: {fileID: -944628639613478452, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_PointAction: {fileID: -1654692200621890270, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_MoveAction: {fileID: -8784545083839296357, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_SubmitAction: {fileID: 392368643174621059, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_CancelAction: {fileID: 7727032971491509709, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_LeftClickAction: {fileID: 3001919216989983466, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_MiddleClickAction: {fileID: -2185481485913320682, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_RightClickAction: {fileID: -4090225696740746782, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_ScrollWheelAction: {fileID: 6240969308177333660, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_TrackedDevicePositionAction: {fileID: 6564999863303420839, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_TrackedDeviceOrientationAction: {fileID: 7970375526676320489, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_DeselectOnBackgroundClick: 1 + m_PointerBehavior: 0 + m_CursorLockBehavior: 0 + m_ScrollDeltaPerTick: 6 +--- !u!114 &1994288143 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1994288141} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1994288144 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2037916656} + m_GameObject: {fileID: 1994288141} serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 2.084, z: 2.399} + m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: [] @@ -492,4 +1126,5 @@ SceneRoots: - {fileID: 65465575} - {fileID: 79651672} - {fileID: 1887936864} - - {fileID: 2037916660} + - {fileID: 1397674205} + - {fileID: 1994288144} diff --git a/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/SimpleGOPoolManager.cs b/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/SimpleGOPoolManager.cs index 640ebfb..4448cca 100644 --- a/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/SimpleGOPoolManager.cs +++ b/Assets/Unity-Tools/Demo/EasyPoolKit/SimpleGOPool/SimpleGOPoolManager.cs @@ -1,18 +1,56 @@ +using System.Collections.Generic; +using Sirenix.OdinInspector; using UnityEngine; namespace Tools.EasyPoolKit.Demo { public class SimpleGOPoolManager : MonoBehaviour { - public GameObject prefab; - private void Start() + public GameObject cubePrefab; + [ReadOnly] public List cubes = new List(); + + [Space] + public GameObject imagePrefab; + public Transform parent; + [ReadOnly] public List images = new List(); + + + private void Update() { - var config = new RecyclablePoolConfig(); - config.SpawnFunc = () => Instantiate(prefab); - config.ObjectType = RecycleObjectType.GameObject; - config.ExtraArgs = new object[] { transform }; - config.InitCreateCount = 5; - var pool = new SimpleGameObjectPool(config); + if (Input.GetKeyDown(KeyCode.A)) + { + var newImage = SimpleGOPoolKit.Instance.SimpleSpawn(imagePrefab); + newImage.transform.SetParent(parent); + images.Add(newImage); + } + else if (Input.GetKeyDown(KeyCode.S)) + { + if (images.Count > 0) + { + var lastImage = images[^1]; + SimpleGOPoolKit.Instance.Despawn(lastImage); + images.RemoveAt(images.Count - 1); + } + } + else if (Input.GetKeyDown(KeyCode.C)) + { + SimpleGOPoolKit.Instance.ClearAllPools(true); + } + else if (Input.GetKeyDown(KeyCode.Alpha1)) + { + var newImage = SimpleGOPoolKit.Instance.SimpleSpawn(cubePrefab); + newImage.transform.SetParent(null); + cubes.Add(newImage); + } + else if (Input.GetKeyDown(KeyCode.Alpha2)) + { + if (cubes.Count > 0) + { + var lastCube = cubes[^1]; + SimpleGOPoolKit.Instance.Despawn(lastCube); + cubes.RemoveAt(cubes.Count - 1); + } + } } } }