设计模式单件模式
其简洁的定义为单件模式确保一个类只有一个实例,并提供一个全局访问点。
它可以避免访问混乱,资源浪费和性能损耗,避免状态冲突与数据不一致,避免重复操作与资源竞争。
Unity游戏开发的单件模式设计:单例基类
单例基类属于游戏框架时的基础设施,为核心服务层提提供统一父类,避免重复书写单例模式。
这里我们将单例基类分为三种:继承自Unity的Monobehavior,纯C#,特殊的单例基类。
针对前两种单例基类还可以被写为带有以下优化特性:双重检查锁定,泛型,持久化,调节器,空对象。
其中双重检查锁定,泛型,空对象是两种单例都可以用,而持久化,调节器只有继承自Unity的Monobehavior
纯C#的单例基类
单例不同的实例化时机可以被叫做饿汉式和懒汉式。
- 饿汉式(Eager Initialization):在类被加载时就直接创建好实例。优点是简单且天然线程安全;缺点是即使不使用该实例也会占用内存资源。
- 懒汉式(Lazy Initialization):在第一次真正需要使用该实例时才进行创建。优点是延迟加载、节省内存;缺点是如果不加锁,在多线程环境下可能会出现线程安全问题。
还有利用C#提供的Lazy<T>类来实现的,由框架底层保证线程安全和延迟加载,代码更加简洁优雅。
继承自Unity的Monobehavior
不存在饿汉式的单例模式,因为Unity不允许通过 new 关键字来实例化继承自 MonoBehaviour 的类。MonoBehaviour 必须依附于游戏物体(GameObject),并通过 AddComponent 的方式添加到场景中才能生效。
特殊的单例基类
在大型现代游戏架构中,为了降低单例带来的强耦合,常采用以下方案替代传统的单例:
- ScriptableObject 单例:利用 Unity 的 ScriptableObject 特性,将配置数据作为资产(Asset)保存在项目中,通过
Resources.Load或 Addressables 全局读取,非常适合做游戏设置和持久化数据管理。 - 服务定位器模式(Service Locator):提供一个全局的注册与获取中心,比单例更灵活,便于在运行时动态替换服务实现,也更容易进行单元测试
代码实现
提供的代码可以经过删改来得到实际开发中需要的代码。
最基础式C#纯代码
1 | public class SingleCS |
C#纯代码
添加了多种优化方式可以根据实际要求修改
1 | using UnityEngine; |
继承Monobehavior的单例基类
1 | using UnityEngine; |
特殊的单例基类
1 | using UnityEngine; |
说些什么吧!