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得到单例对象

猜你喜欢

转载自blog.csdn.net/Raine_Yang/article/details/130498794
今日推荐