如何改进Player单例实现?解决多层引用繁琐问题
优化方案:单例实现完善 + 简化引用层级
你的现有单例实现存在基础缺陷,同时可以通过设计优化解决引用层级过多的问题,分两部分说明:
一、完善单例本身的实现
当前单例代码缺少场景切换时的持久化处理,且写法不够严谨,优化后的单例代码如下:
public class Player : MonoBehaviour { // 私有字段+公共只读属性封装,避免外部直接修改实例 private static Player _instance; public static Player Instance { get { if (_instance == null) { // 实例不存在时自动查找或创建 _instance = FindObjectOfType<Player>(); if (_instance == null) { GameObject singletonObj = new GameObject(nameof(Player)); _instance = singletonObj.AddComponent<Player>(); DontDestroyOnLoad(singletonObj); } } return _instance; } } private void Awake() { if (_instance == null) { _instance = this; DontDestroyOnLoad(gameObject); } else if (_instance != this) { Destroy(gameObject); } } }
优化点说明:
- 用私有字段+只读属性替代公开静态字段,防止外部代码意外覆盖单例实例
- 添加
DontDestroyOnLoad,确保场景切换时单例不会被销毁 - 在属性getter中增加兜底逻辑,实例意外销毁时可自动查找或重建
二、解决引用层级过多的问题
针对Player.instance.another.blank=0这类多层引用的问题,有三种常用优化方式:
1. 在Player类中封装直接访问器
在Player类里添加对目标成员的直接属性或方法,把多层调用简化为一层:
public class Player : MonoBehaviour { public AnotherClass another; // 封装对blank的直接访问 public int BlankValue { get => another.blank; set => another.blank = value; } // 单例实现代码... }
调用时简化为:
Player.Instance.BlankValue = 0;
2. 合并强绑定的成员
如果another类的核心功能和Player强绑定,可以直接将blank这类成员提升到Player类中,彻底消除中间层级:
public class Player : MonoBehaviour { public int blank; // 单例实现代码... }
调用时直接写成:
Player.Instance.blank = 0;
3. 静态辅助类封装(可选)
如果不想修改Player类,可以创建静态辅助类封装访问逻辑:
public static class PlayerHelper { public static int PlayerBlank { get => Player.Instance.another.blank; set => Player.Instance.another.blank = value; } }
调用时:
PlayerHelper.PlayerBlank = 0;
内容的提问来源于stack exchange,提问作者ys143112
相关产品推荐
相关产品推荐

