Unity自定义框架(1)-----------单例模式

前言:

Unity作为一款强大的游戏开发引擎,其基础框架的设计对于项目的结构和性能有着重要的影响。其中,单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。

什么是单例模式?

单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并提供一个全局访问点。在Unity中,单例模式常用于管理全局数据、游戏状态或者资源管理。通过单例模式,我们可以在整个应用程序中方便地访问特定的对象。

一、Unity中的单例模式实现(不继承Mono的)

1. 创建Singleton

首先,我们需要创建一个BaseSingleton类,该类负责管理单例实例的创建和访问。以下是一个简单的BaseSingleton类示例:

cs 复制代码
//单例模式基类,泛型约束为:存在无参构造函数,非抽象类
//为什么约束,因为使用了instance = new T();
public class BaseSingleton<T> where T:new()
{
    private static T instance;
    //保护构造函数,保证单例只能在内部创建
    protected BaseSingleton() { }
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new T();
            }
            return instance;
        }
    }
}

2. 应用到Unity中的管理器

假设我们要创建一个GameManager作为全局的游戏管理器。我们可以通过继承BaseSingleton类来实现GameManager的单例模式:

cs 复制代码
public class GameManager : BaseSingleton<GameManager>
{
    // 在这里定义GameManager的其他属性和方法


 public void StartGame()
 {
  
 }


}

3. 在其他类中访问单例

现在,我们可以在其他类中轻松地访问GameManager的单例实例:

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    
    void Start()
    {// 通过GameManager.Instance访问GameManager的单例实例
        GameManger.Instance.StartGame();
        //StartGame()是在GameManager类里定义的一个方法
    }


  
}

通过这种方式,我们可以方便地管理全局的游戏状态,而无需担心多个实例的创建。

二、Unity中的单例模式实现(继承Mono的)

在Unity中,经常会使用MonoBehaviour作为游戏对象的脚本组件,会需要使用MonoBehaviour的相关方法。因此将单例模式与MonoBehaviour结合可以更好地适应游戏开发的需求。

1. 创建Singleton类

以下是一个继承MonoBehaviour的单例模式基类的实现:

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour
{
    private static T instance;
    public static T Instance
    {
        get
        {




            instance = FindObjectOfType<T>();
            ///判断场景中存不存在 该T 类型的的实例,如果不存在 则在场景中创建一个空物体,并加上该T组件

            if (instance == null)
            {

                GameObject singletonObject = new GameObject(typeof(T).Name + "_Singleton");

                singletonObject.AddComponent<T>();

                DontDestroyOnLoad(singletonObject);


            }
            return instance;

        }
    }

    //使用virtual虚函数,子类继承可能还需要用Awake()
    protected virtual void Awake()
    {
        // 确保在场景切换时不会销毁该实例
        DontDestroyOnLoad(gameObject);
        // 检查是否存在重复的实例
        if (instance == null)
        {
            instance = this as T;
        }
        else
        {
            Debug.LogWarning("存在重复的单例" + typeof(T).Name + "删除");
            Destroy(gameObject);
        }
    }
}

2. 应用到Unity中的管理器

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameManger : SingletonMono<GameManger>
{

    // 在这里定义GameManager的其他属性和方法


    public void StartGame()
    {
        Debug.LogError("调用单例!");
     
    }


}

3. 在其他类中访问单例

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    
    void Start()
    {// 通过GameManager.Instance访问GameManager的单例实例
        GameManger.Instance.StartGame();
        //StartGame()是在GameManager类里定义的一个方法
    }

}

4.运行效果

当调用该单例中StartGame方法时, 先创建了一个GameManger_Singleton物体并挂载了 GameManger组件 如下图:

执行顺序如上图, 1 创建空物体,2 挂载组件 3 执行方法

总结

单例模式是Unity中常用的设计模式之一,特别适用于需要全局访问点的情况。通过创建一个Singleton类,我们可以轻松地将其应用到不同的管理器或者全局性的对象中,提高代码的可维护性和灵活性。在实际项目中,根据具体需求可以对单例模式进行扩展和优化。

Unity自定义框架开发-CSDN博客

相关推荐
向宇it9 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
九鼎科技-Leo9 小时前
什么是 WPF 中的依赖属性?有什么作用?
windows·c#·.net·wpf
Heaphaestus,RC10 小时前
【Unity3D】获取 GameObject 的完整层级结构
unity·c#
芋芋qwq10 小时前
Unity UI射线检测 道具拖拽
ui·unity·游戏引擎
baivfhpwxf202310 小时前
C# 5000 转16进制 字节(激光器串口通讯生成指定格式命令)
开发语言·c#
直裾10 小时前
Scala全文单词统计
开发语言·c#·scala
tealcwu11 小时前
【Unity服务】关于Unity LevelPlay的基本情况
unity·游戏引擎
ZwaterZ12 小时前
vue el-table表格点击某行触发事件&&操作栏点击和row-click冲突问题
前端·vue.js·elementui·c#·vue
大眼睛姑娘13 小时前
Unity3d场景童话梦幻卡通Q版城镇建筑植物山石3D模型游戏美术素材
unity·游戏美术
ZwaterZ14 小时前
el-table-column自动生成序号&&在序号前插入图标
前端·javascript·c#·vue