Unity中的单例模式 和C#中的是一样的,
Unity中的类默认都是继承Monobehaviour类,但是一般情况下,建议不要这么做,而是自己写单例类。
单例的作用:在整个游戏过程中唯一一个单实例
using System.Collections; using System.Collections.Generic; using UnityEngine; //传统的单例模式 public class Singleton //不要继承Monobehaviour { private static Singleton instance; //唯一一个单实例,所以类中的这个字段是私有的 public static Singleton Instance //对应的属性 { get {if (instance == null) //如果实例是空的,就new 一个实例 instance = new Singleton(); //如果实例不是空的,就返回这个实例 return instance; //所以实例就只有一个,实现了单例的内容 } } private Singleton() //构造函数可以省略,没有程序员会new单例模式 { } }
Singleton类的构造函数:(可以省略)
private Singleton() {...}
因为不能在外部创造 new这个实例,所以需要把构造函数设置成私有的。
(在和别人合作的时候,有些人不写这个构造函数,没有设置成私有的,这个不需要纠结,因为实际的项目开发中,被告知此类是单例,一般都不要去New这个类了,所以写不写都可以,写了是锦上添花)。
问题:在一个游戏项目中可能有很多类,可能都是管理者角色的类,管理者角色的类在项目运行中要求都是单例,如果三个、四个都是单例,那么上面的 传统单例模式的代码 就要重复写好几遍。
提出解决方达:如果有泛型的单例类,如果有一个类是单例类,那么只要继承这个单例类就可以更方便。
//凡是单例模式类,都可以继承该类,实现单例 public class Singleton<T> where T : new() //泛型约束 必须有无参构造函数 { private static T instance; public static T Instance { get { if (instance == null) instance = new T(); return instance; } } }
public class Singleton<T> where T : new() //泛型约束 必须有无参构造函数
T类型并不是所有类型都可以,where用来对T进行约束,需要是能new出来的T才可以,泛型约束,必须有无参构造函数。
//访问示例 public class UIManager : Singleton<UIManager> { public void Say() { } } public class AudioManager : Singleton<AudioManager> { } public class Test { void Main() { UIManager.Instance.Say(); } }
UIManager直接通过.Instance进行实例化,然后通过实例化.Say() 调用类中的方法。