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类的合理的初始化方式,或者可以不用做这个单例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值