在使用Unity3d开发游戏或做客户端项目时,单例是最常见的模式之一,他简单了类的创建,在代码中可以直接调用。下面是两个例子,代码两种不同类型的单例,一个是基本类的单例基类,不是unity MonoBehaviour的类都继承它,一个是从MonoBehaviour派生的单例基类:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;/// <summary>
/// 游戏单例基类,泛型约束表示T必须是一个类,,且有一个无参的构造方法
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class BaseSingleton<T> where T : class,new () { private static T _instance = new();public static T GetInstance() {return _instance;}public static T Instance{get{return _instance;}}
}/// <summary>
/// 继承MonoBahaviour的单例基类,
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class BaseMonoBehaviourSingleton<T> : MonoBehaviour where T: MonoBehaviour{private static T _instance = null;public static T Instance {get { if(_instance == null){_instance = FindObjectOfType(typeof(T)) as T;if (_instance == null) {GameObject obj = new GameObject();_instance = (T)obj.AddComponent(typeof(T));obj.hideFlags = HideFlags.DontSave;obj.name = typeof(T).Name;DontDestroyOnLoad(obj);}}return _instance;}}}