您现在的位置是:首页 >其他 >Unity中使用单例模式时候的注意事项网站首页其他
Unity中使用单例模式时候的注意事项
简介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类的合理的初始化方式,或者可以不用做这个单例。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。