From 45c82c513c67130bb52cb5e7f2f10c957e463cf1 Mon Sep 17 00:00:00 2001
From: client_Wu Xijin <364452445@qq.com>
Date: 星期六, 27 十月 2018 11:36:55 +0800
Subject: [PATCH] 4340 【前端】支持xlua方便IOS提审
---
Core/ResModule/GameObjectPoolManager.cs | 1288 +++++++++++++++++++++++++++++-----------------------------
1 files changed, 645 insertions(+), 643 deletions(-)
diff --git a/Core/ResModule/GameObjectPoolManager.cs b/Core/ResModule/GameObjectPoolManager.cs
index 760c73c..797e411 100644
--- a/Core/ResModule/GameObjectPoolManager.cs
+++ b/Core/ResModule/GameObjectPoolManager.cs
@@ -1,643 +1,645 @@
-锘縰sing System.Collections.Generic;
-using UnityEngine;
-using System;
-using TableConfig;
-
-public class GameObjectPoolManager : SingletonMonobehaviour<GameObjectPoolManager>
-{
-#if UNITY_EDITOR
- private Dictionary<int, DebugItem> m_DebugInstIDDict = null;
-#endif
- private Dictionary<int, GameObjectPool> m_PoolDict = null;
-
- // 涓嶉渶瑕侀攢姣佺殑瀵硅薄鍒楄〃
- private List<int> dontDestoryGoInstIDList = null;
-
- private Transform m_TargetContainer;
-
- public void Initialize()
- {
- if (m_PoolDict == null)
- {
- m_PoolDict = new Dictionary<int, GameObjectPool>();
- }
-
- if (!m_TargetContainer)
- {
- m_TargetContainer = new GameObject("Container").transform;
- m_TargetContainer.SetParent(transform);
- }
-
- if (dontDestoryGoInstIDList == null)
- {
- dontDestoryGoInstIDList = new List<int>();
- }
-
-#if UNITY_EDITOR
- if (m_DebugInstIDDict == null)
- {
- m_DebugInstIDDict = new Dictionary<int, DebugItem>();
- }
-#endif
- }
-
- public void AddDontDestroyGoInstID(int id)
- {
- if (!dontDestoryGoInstIDList.Contains(id))
- {
- dontDestoryGoInstIDList.Add(id);
- }
- }
-
- public bool ExistPool(GameObject prefab)
- {
- if (prefab == null)
- {
- return false;
- }
-
- if (m_PoolDict.ContainsKey(prefab.GetInstanceID()))
- {
- return true;
- }
-
- return false;
- }
-
- public GameObjectPool RequestPool(GameObject prefab)
- {
- if (prefab == null)
- {
- return null;
- }
-
- int _prefabInstanceId = prefab.GetInstanceID();
-
- GameObjectPool _pool = null;
- if (m_PoolDict.TryGetValue(_prefabInstanceId, out _pool))
- {
- return _pool;
- }
-
- _pool = new GameObjectPool(prefab);
- m_PoolDict[_prefabInstanceId] = _pool;
-
- return _pool;
- }
-
-
- public void CacheGameObject(GameObject prefab, int count, bool _prefabActive)
- {
- if (prefab == null)
- {
- return;
- }
-
- RequestPool(prefab).Cache(count, _prefabActive);
- }
-
- public void CacheNpc(int npcID, int count, bool prefabActive)
- {
- string _assetName;
- string _assetBundleName;
-
- NPCConfig _m = ConfigManager.Instance.GetTemplate<NPCConfig>(npcID);
-
- if (_m == null || _m.MODE.Equals("0"))
- {
- return;
- }
-
- if (GAMgr.Instance.s_NpcID2Assetname.TryGetValue(npcID, out _assetName))
- {
- _assetBundleName = GAMgr.Instance.s_NpcID2BundleName[npcID];
- }
- else
- {
- _assetName = StringUtility.Contact(InstanceResourcesLoader.raceSuffix, _m.MODE);
- _assetBundleName = StringUtility.Contact(ResourcesPath.MOB_FOLDER_NAME, _assetName);
- GAMgr.Instance.s_NpcID2Assetname[npcID] = _assetName;
- GAMgr.Instance.s_NpcID2BundleName[npcID] = _assetBundleName;
- }
-
- GameObject _prefab = InstanceResourcesLoader.LoadMob(_assetBundleName, _assetName);
-
- if (!_prefab)
- {
- return;
- }
-
- GameObjectPool _pool = RequestPool(_prefab);
-
- _pool.assetBundleName = _assetBundleName;
- _pool.assetName = _assetName;
-
- _pool.Cache(count, prefabActive);
- }
-
- public GameObject RequestGameObject(GameObject prefab)
- {
- if (prefab == null)
- {
- return null;
- }
-
- return RequestPool(prefab).Request();
- }
-
- public GameObject RequestDefaultPet()
- {
- GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralConfig.Instance.ModeDefaultConfig[2][0],
- GeneralConfig.Instance.ModeDefaultConfig[2][1]);
-
- if (!_prefab)
- {
- return null;
- }
-
- GameObjectPool _pool = RequestPool(_prefab);
-
- _pool.assetName = GeneralConfig.Instance.ModeDefaultConfig[2][1];
- _pool.assetBundleName = GeneralConfig.Instance.ModeDefaultConfig[2][0];
-
- return _pool.Request();
- }
-
- public GameObject RequestDefaultFightNpc()
- {
- GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralConfig.Instance.ModeDefaultConfig[1][0],
- GeneralConfig.Instance.ModeDefaultConfig[1][1]);
-
- if (!_prefab)
- {
- return null;
- }
-
- GameObjectPool _pool = RequestPool(_prefab);
-
- _pool.assetName = GeneralConfig.Instance.ModeDefaultConfig[1][1];
- _pool.assetBundleName = GeneralConfig.Instance.ModeDefaultConfig[1][0];
-
- return _pool.Request();
- }
-
- public GameObject RequestDefaultFuncNpc()
- {
- GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralConfig.Instance.ModeDefaultConfig[0][0],
- GeneralConfig.Instance.ModeDefaultConfig[0][1]);
-
- if (!_prefab)
- {
- return null;
- }
-
- GameObjectPool _pool = RequestPool(_prefab);
-
- _pool.assetName = GeneralConfig.Instance.ModeDefaultConfig[0][1];
- _pool.assetBundleName = GeneralConfig.Instance.ModeDefaultConfig[0][0];
-
- return _pool.Request();
- }
-
- public void ReleaseDefaultPet(GameObject go)
- {
- GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralConfig.Instance.ModeDefaultConfig[2][0],
- GeneralConfig.Instance.ModeDefaultConfig[2][1]);
- if (!_prefab)
- {
- return;
- }
-
- GameObjectPool _pool = RequestPool(_prefab);
-
- if (_pool != null)
- {
- _pool.Release(go);
- }
- }
-
- public void ReleaseDefaultHorse(GameObject go)
- {
- GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralConfig.Instance.ModeDefaultConfig[3][0],
- GeneralConfig.Instance.ModeDefaultConfig[3][1]);
- if (!_prefab)
- {
- return;
- }
-
- GameObjectPool _pool = RequestPool(_prefab);
-
- if (_pool != null)
- {
- _pool.Release(go);
- }
- }
-
- public void ReleaseDefaultFightNPC(GameObject go)
- {
- GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralConfig.Instance.ModeDefaultConfig[1][0],
- GeneralConfig.Instance.ModeDefaultConfig[1][1]);
-
- if (!_prefab)
- {
- return;
- }
-
- GameObjectPool _pool = RequestPool(_prefab);
-
- if (_pool != null)
- {
- _pool.Release(go);
- }
- }
-
- public void ReleaseDefaultFuncNPC(GameObject go)
- {
- GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralConfig.Instance.ModeDefaultConfig[0][0],
- GeneralConfig.Instance.ModeDefaultConfig[0][1]);
-
- if (!_prefab)
- {
- return;
- }
-
- GameObjectPool _pool = RequestPool(_prefab);
-
- if (_pool != null)
- {
- _pool.Release(go);
- }
- }
-
- public GameObject RequestNpcGameObject(int npcID)
- {
- string _assetName;
- string _assetBundleName;
-
- NPCConfig _m = ConfigManager.Instance.GetTemplate<NPCConfig>(npcID);
-
- if (_m == null || _m.MODE.Equals("0"))
- {
- return null;
- }
-
- if (GAMgr.Instance.s_NpcID2Assetname.TryGetValue(npcID, out _assetName))
- {
- _assetBundleName = GAMgr.Instance.s_NpcID2BundleName[npcID];
- }
- else
- {
- _assetName = StringUtility.Contact(InstanceResourcesLoader.raceSuffix, _m.MODE);
- _assetBundleName = StringUtility.Contact(ResourcesPath.MOB_FOLDER_NAME, _assetName);
- GAMgr.Instance.s_NpcID2Assetname[npcID] = _assetName;
- GAMgr.Instance.s_NpcID2BundleName[npcID] = _assetBundleName;
- }
-
- GameObject _prefab = InstanceResourcesLoader.LoadMob(_assetBundleName, _assetName);
-
- if (!_prefab)
- {
- return null;
- }
-
- GameObjectPool _pool = RequestPool(_prefab);
-
- _pool.assetBundleName = _assetBundleName;
- _pool.assetName = _assetName;
-
- return _pool.Request();
- }
-
- public void ReleaseGameObject(GameObject prefab, GameObject go)
- {
- GameObjectPool _pool = RequestPool(prefab);
- if (_pool == null)
- {
- return;
- }
- _pool.Release(go);
- }
-
- public void Release(GameObject prefab)
- {
- int _prefabInstanceId = prefab.GetInstanceID();
-
- GameObjectPool _pool = null;
- if (m_PoolDict.TryGetValue(_prefabInstanceId, out _pool))
- {
- _pool.Clear();
-
- if (_pool.IsEmpty())
- {
- m_PoolDict.Remove(_pool.PrefabInstanceId);
- }
- }
- }
-
- public void UnLoadNPC(int npcID)
- {
- if (!AssetSource.mobFromEditor)
- {
- string _assetName;
- string _assetBundleName;
-
- if (!GAMgr.Instance.s_NpcID2Assetname.TryGetValue(npcID, out _assetName))
- {
- return;
- }
- _assetBundleName = GAMgr.Instance.s_NpcID2BundleName[npcID];
-
- if (!AssetBundleUtility.Instance.JudgeExistAssetBundle(_assetBundleName))
- {
- return;
- }
-
- GameObject _prefab = InstanceResourcesLoader.LoadMob(_assetBundleName, _assetName);
-
- if (!_prefab)
- {
- return;
- }
-
- if (!ExistPool(_prefab))
- {
- return;
- }
-
- GameObjectPool _pool = RequestPool(_prefab);
- _pool.Clear();
- m_PoolDict.Remove(_pool.PrefabInstanceId);
- }
- }
-
- public void UnLoadAll(bool force = false)
- {
- List<int> _removeList = new List<int>();
- foreach (var _pool in m_PoolDict.Values)
- {
- if (GAMgr.Instance.needDestroyPrefabList.Contains(_pool.Prefab))
- {
- _pool.Clear();
- _removeList.Add(_pool.PrefabInstanceId);
- }
- }
-
- for (int i = 0; i < _removeList.Count; ++i)
- {
- m_PoolDict.Remove(_removeList[i]);
- }
- }
-
- public class GameObjectPool
- {
- private GameObject m_Prefab = null;
- public GameObject Prefab
- {
- get
- {
- return m_Prefab;
- }
- }
- public int PrefabInstanceId
- {
- get; private set;
- }
-
- public List<GameObject> m_ActiveList = null;
- private List<GameObject> m_FreeList = null;
-
- Action<GameObject> releaseCallBack;
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
- private Transform m_DebugContainer;
- private Transform m_DebugActive;
- private Transform m_DebugFree;
-#endif
-
- public string assetBundleName;
- public string assetName;
-
- internal protected GameObjectPool(GameObject prefab)
- {
- m_Prefab = prefab;
- PrefabInstanceId = m_Prefab.GetInstanceID();
- m_ActiveList = new List<GameObject>();
- m_FreeList = new List<GameObject>();
-
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
- m_DebugContainer = new GameObject(prefab.name).transform;
- m_DebugActive = new GameObject("Active").transform;
- m_DebugFree = new GameObject("Free").transform;
- m_DebugActive.SetParent(m_DebugContainer);
- m_DebugFree.SetParent(m_DebugContainer);
- m_DebugContainer.SetParent(Instance.transform);
-#endif
- }
-
- public void AddReleaseListener(Action<GameObject> _callBack)
- {
- releaseCallBack = _callBack;
- }
-
- public void RemoveReleaseListener()
- {
- releaseCallBack = null;
- }
-
- public void Cache(int count, bool _prefabActive)
- {
- GameObject _go;
- for (int i = 0; i < count; ++i)
- {
- _go = Instantiate(m_Prefab, Constants.Special_Hide_Position, Quaternion.identity);
- m_FreeList.Add(_go);
- _go.transform.SetParent(Instance.m_TargetContainer);
- _go.transform.position = Constants.Special_Hide_Position;
-
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
-
- DebugItem _debugItem = new GameObject(_go.GetInstanceID().ToString()).AddMissingComponent<DebugItem>();
- _debugItem.transform.SetParent(m_DebugFree);
- _debugItem.target = _go;
- Instance.m_DebugInstIDDict[_go.GetInstanceID()] = _debugItem;
-#endif
- var animator = _go.GetComponent<Animator>();
- if (animator != null)
- {
- animator.enabled = false;
- }
- _go.SetActive(_prefabActive);
- }
- }
-
- public GameObject Request()
- {
- GameObject _go = null;
-
- while (m_FreeList.Count > 0)
- {
- if (m_FreeList[0] != null)
- {
- _go = m_FreeList[0];
-
- m_ActiveList.Add(_go);
- m_FreeList.RemoveAt(0);
-
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
- if (Instance.m_DebugInstIDDict.ContainsKey(_go.GetInstanceID()))
- {
- DebugItem _debugItem = Instance.m_DebugInstIDDict[_go.GetInstanceID()];
- _debugItem.transform.SetParent(m_DebugActive);
- }
-#endif
- break;
- }
- else
- {
- m_FreeList.RemoveAt(0);
- }
- }
-
- if (_go == null)
- {
- _go = Instantiate(m_Prefab, Constants.Special_Hide_Position, Quaternion.identity);
- m_ActiveList.Add(_go);
-
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
- DebugItem _debugItem = new GameObject(_go.GetInstanceID().ToString()).AddMissingComponent<DebugItem>();
- _debugItem.transform.SetParent(m_DebugActive);
- _debugItem.target = _go;
- Instance.m_DebugInstIDDict[_go.GetInstanceID()] = _debugItem;
-#endif
- }
-
- _go.transform.SetParent(null);
- _go.transform.localScale = Vector3.one;
-
- return _go;
- }
-
- public void Release(GameObject go)
- {
- if (go == null)
- {
- return;
- }
- if (m_ActiveList.Contains(go))
- {
- m_ActiveList.Remove(go);
- }
- if (m_FreeList.Contains(go))
- {
- return;
- }
-
- m_FreeList.Add(go);
- go.transform.SetParent(Instance.m_TargetContainer);
- go.transform.position = Constants.Special_Hide_Position;
-
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
- if (Instance.m_DebugInstIDDict.ContainsKey(go.GetInstanceID()))
- {
- DebugItem _debugItem = Instance.m_DebugInstIDDict[go.GetInstanceID()];
- _debugItem.transform.SetParent(m_DebugFree);
- }
-#endif
-
- if (releaseCallBack != null)
- {
- releaseCallBack(go);
- }
- }
-
- public void ReleaseAll()
- {
- for (int i = m_ActiveList.Count - 1; i >= 0; i--)
- {
- var _go = m_ActiveList[i];
- m_ActiveList.Remove(_go);
-
- if (!m_FreeList.Contains(_go))
- {
- m_FreeList.Add(_go);
- }
-
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
- DebugItem _debugItem = Instance.m_DebugInstIDDict[_go.GetInstanceID()];
- _debugItem.transform.SetParent(m_DebugFree);
-#endif
- _go.transform.position = Constants.Special_Hide_Position;
-
- if (releaseCallBack != null)
- {
- releaseCallBack(_go);
- }
- }
- }
-
- public void Clear()
- {
- for (int i = m_ActiveList.Count - 1; i >= 0; --i)
- {
- if (m_ActiveList[i] == null
- || Instance.dontDestoryGoInstIDList.Contains(m_ActiveList[i].GetInstanceID()))
- continue;
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
- Destroy(Instance.m_DebugInstIDDict[m_ActiveList[i].GetInstanceID()].gameObject);
-#endif
- Destroy(m_ActiveList[i]);
- m_ActiveList.RemoveAt(i);
- }
-
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
- if (m_ActiveList.Count != 0)
- {
- Debug.LogWarningFormat("{0} 姹犳竻鐞嗗悗, 杩樻湁 {1} 涓椿璺冨璞�. ", m_Prefab.name, m_ActiveList.Count);
- for (int i = 0; i < m_ActiveList.Count; ++i)
- {
- Debug.LogWarningFormat(" |-- {0}", m_ActiveList[i].name);
- }
- }
-#endif
-
- for (int i = m_FreeList.Count - 1; i >= 0; --i)
- {
- if (m_FreeList[i] == null
- || Instance.dontDestoryGoInstIDList.Contains(m_FreeList[i].GetInstanceID()))
- continue;
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
- Destroy(Instance.m_DebugInstIDDict[m_FreeList[i].GetInstanceID()].gameObject);
-#endif
- Destroy(m_FreeList[i]);
- m_FreeList.RemoveAt(i);
- }
-
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
- if (m_FreeList.Count != 0)
- {
- Debug.LogWarningFormat("{0} 姹犳竻鐞嗗悗, 杩樻湁 {1} 涓┖闂插璞�. ", m_Prefab.name, m_FreeList.Count);
- for (int i = 0; i < m_FreeList.Count; ++i)
- {
- Debug.LogWarningFormat(" |-- {0}", m_FreeList[i].name);
- }
- }
-#endif
- if (IsEmpty())
- {
- m_Prefab = null;
-#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
- Destroy(m_DebugContainer.gameObject);
-#endif
- }
-
- if (!string.IsNullOrEmpty(assetBundleName) && !string.IsNullOrEmpty(assetName))
- {
- InstanceResourcesLoader.UnloadAsset(assetBundleName, assetName);
- }
- }
-
- public bool IsEmpty()
- {
- return m_ActiveList.Count == 0 && m_FreeList.Count == 0;
- }
- }
-}
+锘縰sing System.Collections.Generic;
+using UnityEngine;
+using System;
+using TableConfig;
+
+[XLua.LuaCallCSharp]
+public class GameObjectPoolManager : SingletonMonobehaviour<GameObjectPoolManager>
+{
+#if UNITY_EDITOR
+ private Dictionary<int, DebugItem> m_DebugInstIDDict = null;
+#endif
+ private Dictionary<int, GameObjectPool> m_PoolDict = null;
+
+ // 涓嶉渶瑕侀攢姣佺殑瀵硅薄鍒楄〃
+ private List<int> dontDestoryGoInstIDList = null;
+
+ private Transform m_TargetContainer;
+
+ public void Initialize()
+ {
+ if (m_PoolDict == null)
+ {
+ m_PoolDict = new Dictionary<int, GameObjectPool>();
+ }
+
+ if (!m_TargetContainer)
+ {
+ m_TargetContainer = new GameObject("Container").transform;
+ m_TargetContainer.SetParent(transform);
+ }
+
+ if (dontDestoryGoInstIDList == null)
+ {
+ dontDestoryGoInstIDList = new List<int>();
+ }
+
+#if UNITY_EDITOR
+ if (m_DebugInstIDDict == null)
+ {
+ m_DebugInstIDDict = new Dictionary<int, DebugItem>();
+ }
+#endif
+ }
+
+ public void AddDontDestroyGoInstID(int id)
+ {
+ if (!dontDestoryGoInstIDList.Contains(id))
+ {
+ dontDestoryGoInstIDList.Add(id);
+ }
+ }
+
+ public bool ExistPool(GameObject prefab)
+ {
+ if (prefab == null)
+ {
+ return false;
+ }
+
+ if (m_PoolDict.ContainsKey(prefab.GetInstanceID()))
+ {
+ return true;
+ }
+
+ return false;
+ }
+
+ public GameObjectPool RequestPool(GameObject prefab)
+ {
+ if (prefab == null)
+ {
+ return null;
+ }
+
+ int _prefabInstanceId = prefab.GetInstanceID();
+
+ GameObjectPool _pool = null;
+ if (m_PoolDict.TryGetValue(_prefabInstanceId, out _pool))
+ {
+ return _pool;
+ }
+
+ _pool = new GameObjectPool(prefab);
+ m_PoolDict[_prefabInstanceId] = _pool;
+
+ return _pool;
+ }
+
+
+ public void CacheGameObject(GameObject prefab, int count, bool _prefabActive)
+ {
+ if (prefab == null)
+ {
+ return;
+ }
+
+ RequestPool(prefab).Cache(count, _prefabActive);
+ }
+
+ public void CacheNpc(int npcID, int count, bool prefabActive)
+ {
+ string _assetName;
+ string _assetBundleName;
+
+ NPCConfig _m = Config.Instance.Get<NPCConfig>(npcID);
+
+ if (_m == null || _m.MODE.Equals("0"))
+ {
+ return;
+ }
+
+ if (GAMgr.Instance.s_NpcID2Assetname.TryGetValue(npcID, out _assetName))
+ {
+ _assetBundleName = GAMgr.Instance.s_NpcID2BundleName[npcID];
+ }
+ else
+ {
+ _assetName = StringUtility.Contact(InstanceResourcesLoader.raceSuffix, _m.MODE);
+ _assetBundleName = StringUtility.Contact(ResourcesPath.MOB_FOLDER_NAME, _assetName);
+ GAMgr.Instance.s_NpcID2Assetname[npcID] = _assetName;
+ GAMgr.Instance.s_NpcID2BundleName[npcID] = _assetBundleName;
+ }
+
+ GameObject _prefab = InstanceResourcesLoader.LoadMob(_assetBundleName, _assetName);
+
+ if (!_prefab)
+ {
+ return;
+ }
+
+ GameObjectPool _pool = RequestPool(_prefab);
+
+ _pool.assetBundleName = _assetBundleName;
+ _pool.assetName = _assetName;
+
+ _pool.Cache(count, prefabActive);
+ }
+
+ public GameObject RequestGameObject(GameObject prefab)
+ {
+ if (prefab == null)
+ {
+ return null;
+ }
+
+ return RequestPool(prefab).Request();
+ }
+
+ public GameObject RequestDefaultPet()
+ {
+ GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralDefine.ModeDefaultConfig[2][0],
+ GeneralDefine.ModeDefaultConfig[2][1]);
+
+ if (!_prefab)
+ {
+ return null;
+ }
+
+ GameObjectPool _pool = RequestPool(_prefab);
+
+ _pool.assetName = GeneralDefine.ModeDefaultConfig[2][1];
+ _pool.assetBundleName = GeneralDefine.ModeDefaultConfig[2][0];
+
+ return _pool.Request();
+ }
+
+ public GameObject RequestDefaultFightNpc()
+ {
+ GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralDefine.ModeDefaultConfig[1][0],
+ GeneralDefine.ModeDefaultConfig[1][1]);
+
+ if (!_prefab)
+ {
+ return null;
+ }
+
+ GameObjectPool _pool = RequestPool(_prefab);
+
+ _pool.assetName = GeneralDefine.ModeDefaultConfig[1][1];
+ _pool.assetBundleName = GeneralDefine.ModeDefaultConfig[1][0];
+
+ return _pool.Request();
+ }
+
+ public GameObject RequestDefaultFuncNpc()
+ {
+ GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralDefine.ModeDefaultConfig[0][0],
+ GeneralDefine.ModeDefaultConfig[0][1]);
+
+ if (!_prefab)
+ {
+ return null;
+ }
+
+ GameObjectPool _pool = RequestPool(_prefab);
+
+ _pool.assetName = GeneralDefine.ModeDefaultConfig[0][1];
+ _pool.assetBundleName = GeneralDefine.ModeDefaultConfig[0][0];
+
+ return _pool.Request();
+ }
+
+ public void ReleaseDefaultPet(GameObject go)
+ {
+ GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralDefine.ModeDefaultConfig[2][0],
+ GeneralDefine.ModeDefaultConfig[2][1]);
+ if (!_prefab)
+ {
+ return;
+ }
+
+ GameObjectPool _pool = RequestPool(_prefab);
+
+ if (_pool != null)
+ {
+ _pool.Release(go);
+ }
+ }
+
+ public void ReleaseDefaultHorse(GameObject go)
+ {
+ GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralDefine.ModeDefaultConfig[3][0],
+ GeneralDefine.ModeDefaultConfig[3][1]);
+ if (!_prefab)
+ {
+ return;
+ }
+
+ GameObjectPool _pool = RequestPool(_prefab);
+
+ if (_pool != null)
+ {
+ _pool.Release(go);
+ }
+ }
+
+ public void ReleaseDefaultFightNPC(GameObject go)
+ {
+ GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralDefine.ModeDefaultConfig[1][0],
+ GeneralDefine.ModeDefaultConfig[1][1]);
+
+ if (!_prefab)
+ {
+ return;
+ }
+
+ GameObjectPool _pool = RequestPool(_prefab);
+
+ if (_pool != null)
+ {
+ _pool.Release(go);
+ }
+ }
+
+ public void ReleaseDefaultFuncNPC(GameObject go)
+ {
+ GameObject _prefab = InstanceResourcesLoader.LoadMob(GeneralDefine.ModeDefaultConfig[0][0],
+ GeneralDefine.ModeDefaultConfig[0][1]);
+
+ if (!_prefab)
+ {
+ return;
+ }
+
+ GameObjectPool _pool = RequestPool(_prefab);
+
+ if (_pool != null)
+ {
+ _pool.Release(go);
+ }
+ }
+
+ public GameObject RequestNpcGameObject(int npcID)
+ {
+ string _assetName;
+ string _assetBundleName;
+
+ NPCConfig _m = Config.Instance.Get<NPCConfig>(npcID);
+
+ if (_m == null || _m.MODE.Equals("0"))
+ {
+ return null;
+ }
+
+ if (GAMgr.Instance.s_NpcID2Assetname.TryGetValue(npcID, out _assetName))
+ {
+ _assetBundleName = GAMgr.Instance.s_NpcID2BundleName[npcID];
+ }
+ else
+ {
+ _assetName = StringUtility.Contact(InstanceResourcesLoader.raceSuffix, _m.MODE);
+ _assetBundleName = StringUtility.Contact(ResourcesPath.MOB_FOLDER_NAME, _assetName);
+ GAMgr.Instance.s_NpcID2Assetname[npcID] = _assetName;
+ GAMgr.Instance.s_NpcID2BundleName[npcID] = _assetBundleName;
+ }
+
+ GameObject _prefab = InstanceResourcesLoader.LoadMob(_assetBundleName, _assetName);
+
+ if (!_prefab)
+ {
+ return null;
+ }
+
+ GameObjectPool _pool = RequestPool(_prefab);
+
+ _pool.assetBundleName = _assetBundleName;
+ _pool.assetName = _assetName;
+
+ return _pool.Request();
+ }
+
+ public void ReleaseGameObject(GameObject prefab, GameObject go)
+ {
+ GameObjectPool _pool = RequestPool(prefab);
+ if (_pool == null)
+ {
+ return;
+ }
+ _pool.Release(go);
+ }
+
+ public void Release(GameObject prefab)
+ {
+ int _prefabInstanceId = prefab.GetInstanceID();
+
+ GameObjectPool _pool = null;
+ if (m_PoolDict.TryGetValue(_prefabInstanceId, out _pool))
+ {
+ _pool.Clear();
+
+ if (_pool.IsEmpty())
+ {
+ m_PoolDict.Remove(_pool.PrefabInstanceId);
+ }
+ }
+ }
+
+ public void UnLoadNPC(int npcID)
+ {
+ if (!AssetSource.mobFromEditor)
+ {
+ string _assetName;
+ string _assetBundleName;
+
+ if (!GAMgr.Instance.s_NpcID2Assetname.TryGetValue(npcID, out _assetName))
+ {
+ return;
+ }
+ _assetBundleName = GAMgr.Instance.s_NpcID2BundleName[npcID];
+
+ if (!AssetBundleUtility.Instance.JudgeExistAssetBundle(_assetBundleName))
+ {
+ return;
+ }
+
+ GameObject _prefab = InstanceResourcesLoader.LoadMob(_assetBundleName, _assetName);
+
+ if (!_prefab)
+ {
+ return;
+ }
+
+ if (!ExistPool(_prefab))
+ {
+ return;
+ }
+
+ GameObjectPool _pool = RequestPool(_prefab);
+ _pool.Clear();
+ m_PoolDict.Remove(_pool.PrefabInstanceId);
+ }
+ }
+
+ public void UnLoadAll(bool force = false)
+ {
+ List<int> _removeList = new List<int>();
+ foreach (var _pool in m_PoolDict.Values)
+ {
+ if (GAMgr.Instance.needDestroyPrefabList.Contains(_pool.Prefab))
+ {
+ _pool.Clear();
+ _removeList.Add(_pool.PrefabInstanceId);
+ }
+ }
+
+ for (int i = 0; i < _removeList.Count; ++i)
+ {
+ m_PoolDict.Remove(_removeList[i]);
+ }
+ }
+
+ public class GameObjectPool
+ {
+ private GameObject m_Prefab = null;
+ public GameObject Prefab
+ {
+ get
+ {
+ return m_Prefab;
+ }
+ }
+ public int PrefabInstanceId
+ {
+ get; private set;
+ }
+
+ public List<GameObject> m_ActiveList = null;
+ private List<GameObject> m_FreeList = null;
+
+ Action<GameObject> releaseCallBack;
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+ private Transform m_DebugContainer;
+ private Transform m_DebugActive;
+ private Transform m_DebugFree;
+#endif
+
+ public string assetBundleName;
+ public string assetName;
+
+ internal protected GameObjectPool(GameObject prefab)
+ {
+ m_Prefab = prefab;
+ PrefabInstanceId = m_Prefab.GetInstanceID();
+ m_ActiveList = new List<GameObject>();
+ m_FreeList = new List<GameObject>();
+
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+ m_DebugContainer = new GameObject(prefab.name).transform;
+ m_DebugActive = new GameObject("Active").transform;
+ m_DebugFree = new GameObject("Free").transform;
+ m_DebugActive.SetParent(m_DebugContainer);
+ m_DebugFree.SetParent(m_DebugContainer);
+ m_DebugContainer.SetParent(Instance.transform);
+#endif
+ }
+
+ public void AddReleaseListener(Action<GameObject> _callBack)
+ {
+ releaseCallBack = _callBack;
+ }
+
+ public void RemoveReleaseListener()
+ {
+ releaseCallBack = null;
+ }
+
+ public void Cache(int count, bool _prefabActive)
+ {
+ GameObject _go;
+ for (int i = 0; i < count; ++i)
+ {
+ _go = Instantiate(m_Prefab, Constants.Special_Hide_Position, Quaternion.identity);
+ m_FreeList.Add(_go);
+ _go.transform.SetParent(Instance.m_TargetContainer);
+ _go.transform.position = Constants.Special_Hide_Position;
+
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+
+ DebugItem _debugItem = new GameObject(_go.GetInstanceID().ToString()).AddMissingComponent<DebugItem>();
+ _debugItem.transform.SetParent(m_DebugFree);
+ _debugItem.target = _go;
+ Instance.m_DebugInstIDDict[_go.GetInstanceID()] = _debugItem;
+#endif
+ var animator = _go.GetComponent<Animator>();
+ if (animator != null)
+ {
+ animator.enabled = false;
+ }
+ _go.SetActive(_prefabActive);
+ }
+ }
+
+ public GameObject Request()
+ {
+ GameObject _go = null;
+
+ while (m_FreeList.Count > 0)
+ {
+ if (m_FreeList[0] != null)
+ {
+ _go = m_FreeList[0];
+
+ m_ActiveList.Add(_go);
+ m_FreeList.RemoveAt(0);
+
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+ if (Instance.m_DebugInstIDDict.ContainsKey(_go.GetInstanceID()))
+ {
+ DebugItem _debugItem = Instance.m_DebugInstIDDict[_go.GetInstanceID()];
+ _debugItem.transform.SetParent(m_DebugActive);
+ }
+#endif
+ break;
+ }
+ else
+ {
+ m_FreeList.RemoveAt(0);
+ }
+ }
+
+ if (_go == null)
+ {
+ _go = Instantiate(m_Prefab, Constants.Special_Hide_Position, Quaternion.identity);
+ m_ActiveList.Add(_go);
+
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+ DebugItem _debugItem = new GameObject(_go.GetInstanceID().ToString()).AddMissingComponent<DebugItem>();
+ _debugItem.transform.SetParent(m_DebugActive);
+ _debugItem.target = _go;
+ Instance.m_DebugInstIDDict[_go.GetInstanceID()] = _debugItem;
+#endif
+ }
+
+ _go.transform.SetParent(null);
+ _go.transform.localScale = Vector3.one;
+
+ return _go;
+ }
+
+ public void Release(GameObject go)
+ {
+ if (go == null)
+ {
+ return;
+ }
+ if (m_ActiveList.Contains(go))
+ {
+ m_ActiveList.Remove(go);
+ }
+ if (m_FreeList.Contains(go))
+ {
+ return;
+ }
+
+ m_FreeList.Add(go);
+ go.transform.SetParent(Instance.m_TargetContainer);
+ go.transform.position = Constants.Special_Hide_Position;
+
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+ if (Instance.m_DebugInstIDDict.ContainsKey(go.GetInstanceID()))
+ {
+ DebugItem _debugItem = Instance.m_DebugInstIDDict[go.GetInstanceID()];
+ _debugItem.transform.SetParent(m_DebugFree);
+ }
+#endif
+
+ if (releaseCallBack != null)
+ {
+ releaseCallBack(go);
+ }
+ }
+
+ public void ReleaseAll()
+ {
+ for (int i = m_ActiveList.Count - 1; i >= 0; i--)
+ {
+ var _go = m_ActiveList[i];
+ m_ActiveList.Remove(_go);
+
+ if (!m_FreeList.Contains(_go))
+ {
+ m_FreeList.Add(_go);
+ }
+
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+ DebugItem _debugItem = Instance.m_DebugInstIDDict[_go.GetInstanceID()];
+ _debugItem.transform.SetParent(m_DebugFree);
+#endif
+ _go.transform.SetParent(Instance.m_TargetContainer);
+ _go.transform.position = Constants.Special_Hide_Position;
+
+ if (releaseCallBack != null)
+ {
+ releaseCallBack(_go);
+ }
+ }
+ }
+
+ public void Clear()
+ {
+ for (int i = m_ActiveList.Count - 1; i >= 0; --i)
+ {
+ if (m_ActiveList[i] == null
+ || Instance.dontDestoryGoInstIDList.Contains(m_ActiveList[i].GetInstanceID()))
+ continue;
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+ Destroy(Instance.m_DebugInstIDDict[m_ActiveList[i].GetInstanceID()].gameObject);
+#endif
+ Destroy(m_ActiveList[i]);
+ m_ActiveList.RemoveAt(i);
+ }
+
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+ if (m_ActiveList.Count != 0)
+ {
+ Debug.LogWarningFormat("{0} 姹犳竻鐞嗗悗, 杩樻湁 {1} 涓椿璺冨璞�. ", m_Prefab.name, m_ActiveList.Count);
+ for (int i = 0; i < m_ActiveList.Count; ++i)
+ {
+ Debug.LogWarningFormat(" |-- {0}", m_ActiveList[i].name);
+ }
+ }
+#endif
+
+ for (int i = m_FreeList.Count - 1; i >= 0; --i)
+ {
+ if (m_FreeList[i] == null
+ || Instance.dontDestoryGoInstIDList.Contains(m_FreeList[i].GetInstanceID()))
+ continue;
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+ Destroy(Instance.m_DebugInstIDDict[m_FreeList[i].GetInstanceID()].gameObject);
+#endif
+ Destroy(m_FreeList[i]);
+ m_FreeList.RemoveAt(i);
+ }
+
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+ if (m_FreeList.Count != 0)
+ {
+ Debug.LogWarningFormat("{0} 姹犳竻鐞嗗悗, 杩樻湁 {1} 涓┖闂插璞�. ", m_Prefab.name, m_FreeList.Count);
+ for (int i = 0; i < m_FreeList.Count; ++i)
+ {
+ Debug.LogWarningFormat(" |-- {0}", m_FreeList[i].name);
+ }
+ }
+#endif
+ if (IsEmpty())
+ {
+ m_Prefab = null;
+#if UNITY_EDITOR && !UNITY_ANDROID && !UNITY_IOS
+ Destroy(m_DebugContainer.gameObject);
+#endif
+ }
+
+ if (!string.IsNullOrEmpty(assetBundleName) && !string.IsNullOrEmpty(assetName))
+ {
+ InstanceResourcesLoader.UnloadAsset(assetBundleName, assetName);
+ }
+ }
+
+ public bool IsEmpty()
+ {
+ return m_ActiveList.Count == 0 && m_FreeList.Count == 0;
+ }
+ }
+}
--
Gitblit v1.8.0