在游戏开发过程中,我们会创建各种各样的类,再用new生成实例,有些时候我们需要这个类在整个游戏中是唯一出现的,比如一些管理器比如声音管理器等,没必要创建很多实例,就算有很多模块需要各种声音功能,但我们只需要用这个声音管理器中的各种方法进行实现就好了。再比如UI管理器,网络管理器等等,比如说我们在制作单机游戏时,需要用到的人物管理器可以设置成单例模式,
首先我们在unity中创建一个脚本 人物管理器PlayerController
我们可以先简单自定义一个字段与方法
再创建一个敌人类
在不使用单例模式之前我们可以这样创建敌人类,
定义一个私有的 GameObject游戏对象类型 变量储存到 player变量中,
在Start()函数中 调用GameObject.Find()函数将再unity场景中查找到的名为Player的物体 存储到player变量中,
在Update()函数中,我们这里调用打印Debug.Log()函数代表作用到了 玩家的位置坐标
player.transform.position,
最后用场景中物体变量player 打点. 调用GetComponent<>()函数 打点. 二次调用人物控制器PlayerController 类的 SayHello()函数
但这样做在Update()每帧函数中持续获取组件十分耗费内存,
所以我们需要再定义一个私有 人物控制器类PlayerController 类型的变量 存储到 playerController变量中,
在Start()函数中调用的意思就是在游戏一开始运行就
player = player.GetComponent<PlayerController>();
获取人物身上的人物控制器组件 存储到 人物控制器组件变量中,
最后在Update()每帧函数中不用获取组件,直接用人物控制器变量 打点. 调用SayHello()函数即可
显然在编写敌人类代码时十分麻烦,不仅要创建私有字段,还要在Start()函数中获取组件,
如果我们采取单例模式,很容易就能解决这个问题
下面我们修改PlayerController代码:
首先在人物控制器类 添加私有静态字段 代表 人物控制器的实例 存储到 instance变量中,
再调用生命周期的第一个函数Awake() 调用自己;
这样我们扩展敌人类时就十分方便如下:
只需要静态类 调用自己的实例化对象 打点.调用后续函数即可
但这样编写不适用于Awake()函数有多个的情况
最后我们进行优化:
首先定义一个私有的静态类实例,
然后公开一个静态类方法 判断 将这个类的类型 存储到 instance变量中 最后返回到 Instance字段中,
在扩展敌人类时我们只需要 用 人物控制器类PlayerController 打点. 调用 大写Insatnce字段即可
End.