前篇链接:Unity之C#学习笔记(15):特化委托Action, Func和Lambda表达式
从这节开始,我们来讲几个在游戏设计中非常实用的设计模式,先看单例模式。还是从一个实例入手。
在游戏设计中,通常会采用模块化的设计思想,将游戏功能分解成多个具体的功能模块,并用一个Manager类脚本来管理实现该模块下的功能,比如总管全局的GameManager,管理UI的UIManager,管理声音的AudioManager等等。通常,这些脚本会绑定到一个作为载体的空物体上。既然是管理者,这些类只需要也只应该有一个实例存在,而且互相应该能方便的交互。
以GameManager和UIManager为例。通常,想让二者进行交互,做法是先用Find方法找到对方挂载的物体,再用GetComponent获得对方实例。
public class UIManager : MonoBehaviour
{
private GameManager _gm;
private void Start()
{
_gm = GameObject.Find("Game Manager").GetComponent<GameManager>();
// do something with _gm...
}
}
然而,对于Manager类,我们应该实现其只能有一个实例的特性,并利用该特性实现更简单的访问方式GameManager.Instance.CallSomeFunc(),类似于static(但我们不希望让GameManager成为static类,static会带来很多限制和问题)。单例模式就是针对这个问题的一种创建型设计模式。
为了保证GameManager类只有一个实例,先写private构造函数,覆盖掉默认的public构造函数,防止外部创建实例。然后用一个private static变量_instance承载该类唯一实例,对外暴露public static Instance属性,只提供get访问器:
using System;
using System