单例模式(Singleton) 时最常用的射击模式之一, 核心作用: 让一个类再游戏里 只存在唯一一个实例, 且能全局访问它.
简单说: 整个项目中, 有且只有一个这个对象, 谁都能直接调用它.
一 单例模式在 Unity 里的经典用途
你在 Unity 里一定会用到这些场景:
- 游戏管理器(GameManager)
- 音频管理器(AudioManager)
- 场景管理器(SceneManager)
- 玩家管理器(PlayerManager)
- UI管理器(UIManager)
这些东西只需要一个, 不能重复创建, 所以必须用单例
二 最简单的 Unity 单例实现(最常用)
我们做一个游戏管理器 GameManager, 让它变成全局唯一
- 完整代码
- 代码关键点解释
- public static GameManager Instance 静态实例, 全局唯一, 外部脚本可以直接用 GameManager.Instance 调用
- if(Instance ≠ null) Destroy(gameObject) 防止重复创建, 保证单例
- DontDestroyOnLoad(gameObject) 切换场景不销毁这个单例, 让它贯穿整个游戏.
三 怎么在其他脚本使用单例?
任何脚本, 任何地方, 直接调用, 不需要拖拽\不需要找对象!
运行结果:
四 进阶: 通用单例基类(推荐)
如果你有很多管理器(AudioManager\UIManager…), 可以写一个通用单例父类, 所有管理器直接继承, 不需要重复写代码
- 通用单例基类
- 子类使用
- 调用方式
五 必须注意的坑(Unity 单例易错点)
- 不要再 Awake 之前调用单例 会报空引用, 尽量在 Start() 或之后调用.
- 一个脚本只能挂在一个物体上 否则会自动销毁多余, 只留第一个
- DontDestroyOnLoad 会让物体跨场景存在 适合全局管理器, 不适合场景内临时物体
- 静态实例 = 全局唯一 不能随便 new, 必须通过 Instance 访问
六 总结: 单例模式一句话
一个类, 只实例化一次, 全局可访问, 方便管理共享功能(音频\游戏状态\UI).
你在Unity开发中, 90%的管理器都应该用单例.
总结
- 单例母体: 保证类唯一实例, 全局访问
- 核心代码: 静态 Instance + Awake 判断重复 + DontDestroyOnLoad
- 使用方式: 类名.Instance.方法();
- 进阶用法: 泛型基类, 所有管理器一键继承
- 通用对象: GameManager\AudioManager\UIManager等全局管理器