using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; namespace GameBase { public interface ISingleton { /// /// 激活接口,通常用于在某个时机手动实例化 /// void Active(); /// /// 释放接口 /// void Release(); } /// /// 框架中的全局对象与Unity场景依赖相关的DontDestroyOnLoad需要统一管理,方便重启游戏时清除工作 /// public static class SingletonSystem { private static List _singletons; private static Dictionary _gameObjects; public static void Retain(ISingleton go) { if (_singletons == null) { _singletons = new List(); } _singletons.Add(go); } public static void Retain(GameObject go) { if (_gameObjects == null) { _gameObjects = new Dictionary(); } if (_gameObjects.TryAdd(go.name, go)) { if (Application.isPlaying) { Object.DontDestroyOnLoad(go); } } } public static void Release(GameObject go) { if (_gameObjects != null && _gameObjects.ContainsKey(go.name)) { _gameObjects.Remove(go.name); Object.Destroy(go); } } public static void Release(ISingleton go) { if (_singletons != null && _singletons.Contains(go)) { _singletons.Remove(go); } } public static void Release() { if (_gameObjects != null) { foreach (var item in _gameObjects) { Object.Destroy(item.Value); } _gameObjects.Clear(); } if (_singletons != null) { for (int i = _singletons.Count -1; i >= 0; i--) { _singletons[i].Release(); } _singletons.Clear(); } Resources.UnloadUnusedAssets(); } public static GameObject GetGameObject(string name) { GameObject go = null; if (_gameObjects != null) { _gameObjects.TryGetValue(name, out go); } return go; } internal static bool ContainsKey(string name) { if (_gameObjects != null) { return _gameObjects.ContainsKey(name); } return false; } public static void Restart() { if (Camera.main != null) { Camera.main.gameObject.SetActive(false); } Release(); SceneManager.LoadScene(0); } internal static ISingleton GetSingleton(string name) { for (int i = 0; i < _singletons.Count; ++i) { if (_singletons[i].ToString() == name) { return _singletons[i]; } } return null; } } }