您现在的位置是:首页 >技术教程 >unity进阶学习笔记:单例模式网站首页技术教程
unity进阶学习笔记:单例模式
游戏框架:
游戏框架一般包括消息框架,状态机,管理器,工具类。
消息框架指游戏物体之的通信框架,虽然unity引擎自带一套消息框架,但该框架只能用于父子物体之间通信,无法实现大部分非父子关系的物体间通信。因此我们要在后续自己完成一套消息框架
状态机用于管理每一个物体不同状态,如对于一个人物可能有移动,攻击,死亡等多个状态。使用状态机可以更好进行状态管理和切换
管理器用于完成一个特定游戏功能。如角色管理器,背包管理器,任务系统管理器等
工具类用于封装一些会反复出现的函数或功能,如创建随机数,生成伤害,加密内容等
单例类:
单例只一个类只生成一个对象。一般来说,游戏内容的管理类,如消息管理类,网络管理类都只应有一个对象,这时就要使用单例实现。
游戏中每将一个脚本挂载到一个游戏物体上作为组件时,就会生成一个该脚本类的对象。因此要实现单例必须保证只挂载一个物体
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TestMonobehavior : MonoBehaviour
{
private static TestMonobehavior instance;
public static TestMonobehavior Instance {
get {
return instance;
}
}
void Awake()
{
instance = this;
}
// Update is called once per frame
void Update()
{
}
}
在该实例中,我们创建一个单例对象instance(一般单例对象常用名)用于给外界访问。并定义一个静态方法用于返回该单例对象。这样外界就可以通过TestMonobehavior.Instance对单例进行访问
我们考虑到一个游戏中可能有多个单例对象(如多个管理类)。因此我们可以编写一个泛型单例类基类,然后让后续的单例类继承该基类
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SingletonBase<T> : MonoBehaviour where T : MonoBehavior
{
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;
}
}
这里我们的程序和上面基本一致,只不过将instance设为泛型对象。另外注意以下几点:
public class SingletonBase<T> : MonoBehaviour where T : MonoBehavior
在类定义中,where T : MonoBehavior指泛型T必须是MonoBehavior(unity游戏对象类)子类
protected virtual void Awake()
这里Awake()和Destroy()的方法可能会在子类重写。因此我们将其设为protected权限(不可外部访问,但可以被继承)的抽象方法
对于普通类(非unity脚本),可以使用以下方法实现单例
public class Test : MonoBehaviour
{
private static Test instance;
public static Test Instance {
get {
if (instance == null) {
instance = new Test();
}
return instance;
}
}
这里我们在Instance方法里先判断instance是否被创建,用于在第一次调用单例方法时创建单例。之后我们就正常使用return instance得到单例对象