文章目录 泛型单例类 泛型单例类(不带组件版) 对象池管理器 数据管理器 场景管理器
泛型单例类
using System. Collections ;
using System. Collections. Generic ; public abstract class ManagersSingle< T> where T : new ( )
{ private static T instance; public static T Instance{ get { if ( instance == null ) { instance = new T ( ) ; } return instance; } }
}
泛型单例类(不带组件版)
using System. Collections ;
using System. Collections. Generic ;
using UnityEngine ; public class MyrSingletonBase< T> : MonoBehaviour where T : MonoBehaviour
{ private static T instance; public static T Instance { get { return instance; } } protected virtual void Awake ( ) { instance = this as T ; } protected virtual void OnDestroy ( ) { instance = null ; }
}
对象池管理器
using System. Collections ;
using System. Collections. Generic ;
using UnityEngine ;
public class PoolStack { public Stack < UnityEngine. Object> stack = new Stack< Object> ( ) ; public int MaxCount = 100 ; public void Push ( UnityEngine. Object go) { if ( stack. Count < MaxCount) stack. Push ( go) ; else GameObject. Destroy ( go) ; } public UnityEngine. Object Pop ( ) { if ( stack. Count > 0 ) return stack. Pop ( ) ; return null ; } public void Clear ( ) { foreach ( UnityEngine. Object go in stack) GameObject. Destroy ( go) ; stack. Clear ( ) ; } } public class PoolManager : ManagersSingle< PoolManager>
{ Dictionary< string , PoolStack> poolDic = new Dictionary< string , PoolStack> ( ) ; public UnityEngine. Object Spawn ( string poolName, UnityEngine. Object prefab) { if ( ! poolDic. ContainsKey ( poolName) ) poolDic. Add ( poolName, new PoolStack ( ) ) ; UnityEngine. Object go = poolDic[ poolName] . Pop ( ) ; if ( go == null ) go = GameObject. Instantiate ( prefab) ; return go; } public void UnSpawn ( string poolName) { if ( poolDic. ContainsKey ( poolName) ) { poolDic[ poolName] . Clear ( ) ; poolDic. Remove ( poolName) ; } } }
数据管理器
场景管理器
using System. Collections ;
using System. Collections. Generic ;
using UnityEngine ;
using UnityEngine. SceneManagement ; public class SceneManager : MyrSingletonBase< SceneManager>
{ public List< string > sceneList = new List< string > ( ) ; public int CurrentIndex = 0 ; private System. Action< float > currentAction; private AsyncOperation operation; public void LoadScene ( string sceneName, System. Action< float > action) { currentAction = action; if ( sceneList. Contains ( sceneName) ) { CurrentIndex = sceneList. IndexOf ( sceneName) ; operation = UnityEngine. SceneManagement. SceneManager. LoadSceneAsync ( sceneName, UnityEngine. SceneManagement. LoadSceneMode. Single) ; } } void Update ( ) { if ( operation != null ) { currentAction ( operation. progress) ; if ( operation. progress >= 1 ) operation = null ; } } public void LoadPre ( System. Action< float > action) { CurrentIndex-- ; LoadScene ( sceneList[ CurrentIndex] , action) ; } public void LoadNext ( System. Action< float > action) { CurrentIndex++ ; LoadScene ( sceneList[ CurrentIndex] , action) ; }
}