您现在的位置是:首页 >其他 >Unity中使用单例模式时候的注意事项网站首页其他

Unity中使用单例模式时候的注意事项

Elysia ovo 2025-09-21 12:01:04
简介Unity中使用单例模式时候的注意事项

如果在Unity中一个类确定使用单例时,在另一个类中进行初始化的时候就不能只是单纯的new了
用一个弹幕系统举例子
现在有一个弹幕类,使用的单例模式

public class BarrageClass
{
    public static BarrageClass instance;
    public BarrageJson[] barrageJson;//配置
    public BarrageItemsJson[] barrageItemsJson;//配置
    private List<BarrageItemJson> curbarrages = new List<BarrageItemJson>();
    static public Dictionary<BarrageType, List<BarrageItemsJson>> TYPE_Barrage = new Dictionary<BarrageType, List<BarrageItemsJson>>{};
    public BarrageClass()
    {
        if(instance != null){
            return;
        }
        instance = this;
        Debug.Log("弹幕类初始化");
        LoadByJson();
        Debug.Log("弹幕类加载完成mmmmmmmmmmmmmmmmmm");
        reset();
    }

那么在另一个类中初始化这个类的时候,也就是拿到这个类的实例的时候就不能用一般类的初始化方式,必须对他的唯一静态实例进行初始化,所以初始化的时候不能像下面这样写

void Start()
    {
        Debug.Log("弹幕UI初始化");
        // 只需要创建一次实例
        barrageClass = new BarrageClass();
        userNameClass = new UserNameClass();
        
        // 确保实例化成功
        if (barrageClass == null)
        {
            Debug.LogError("弹幕类初始化失败");
            return;
        }
        
        Debug.Log("弹幕类初始化成功");
    }

userNameClass = new UserNameClass();

这句会初始化出来另一个实例,但是是空的(或许,反正不能用,也不会报错,但是你调用这个实例中的任何方法都容易报错NullReference)

所以应该如下初始化

void Start()
    {
        Debug.Log("弹幕UI初始化");
        // 只需要创建一次实例
        
        userNameClass = new UserNameClass();
        if (BarrageClass.instance == null)
        {
            BarrageClass.instance = new BarrageClass();  // 确保初始化
        }
        // 确保实例化成功
        if (barrageClass == null)
        {
            Debug.LogError("弹幕类初始化失败");
            return;
        }
        
        Debug.Log("弹幕类初始化成功");
    }

对这个类的单例进行new初始化,这样是单例非Monobehavior类的合理的初始化方式,或者可以不用做这个单例。

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。