U4S2SL4——单例模式化的获取数据

为什么要单例模式化的获取数据

对于只用不变并且要复用的数据,比如配置文件中的数据,我们往往需要在很多地方获取他们
如果我们直接通过在脚本中public​关联 或者 动态加载,如果在多处使用,会存在很多重复代码,效率较低
如果我们将此类数据通过单例模式化的去获取,可以提升效率,减少代码量

实现单例模式化获取数据

知识点
面向对象、单例模式、泛型等等

我们可以实现一个ScriptableObject​数据单例模式基类,让我们只需要让子类继承该基类,就可以直接获取到数据
而不再需要去通过public​关联 和 资源动态加载

这种基类比较适合配置数据的管理和获取****当我们的数据是只用不变,并且是唯一的时候,可以使用该方式提高我们的开发效率
在此基础上你也可以根据自己的需求进行变形,比如添加数据持久化的功能,将数据从json中读取,并提供保存数据的方法
但是不建议大家用ScriptableObject来制作数据持久化功能,除非你有这方面的特殊需求

首先实现​ScriptableObject​数据单例模式基类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using UnityEngine;
//这里的T是继承该基类的类,T用于根据子类类型来实例化派生类
public class SingleScriptableObject<T> : ScriptableObject where T : ScriptableObject
{
private static T instance;

//如果为空 首先应该去资源路径下加载对于的数据资源文件
public static T Instance
{
get
{
//下面这句代码的含义是,如果instance为null就通过Resources加载配置文件
instance ??= Resources.Load<T>("ScriptableObject/" + typeof(T).Name);
//如果还是为空,就创建一个默认的空配置对象
if (instance == null)
instance = CreateInstance<T>();
return instance;
}
}
}

之后让一个继承ScriptableObject​的类改为去继承它

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "RoleInfo", menuName = "ScriptableObject/角色信息")]
public class RoleInfo : SingleScriptableObject<RoleInfo>
{
[System.Serializable]
public class RoleData
{
public int id;
public string res;
public int atk;
public string tips;
public int lockMoney;
public int type;
public string hitEff;

public void Print()
{
Debug.Log(this.id);
Debug.Log(this.res);
Debug.Log(this.atk);
Debug.Log(this.tips);
Debug.Log(this.lockMoney);
Debug.Log(this.type);
Debug.Log(this.hitEff);
}
}

public List<RoleData> data;
}

之后我们就可以随时调用这个派生类了

1
2
3
4
5
6
7
8
9
10
using UnityEngine;

public class Lesson8 : MonoBehaviour
{
void Start()
{
print(RoleInfo.Instance.data[0].id);
print(RoleInfo.Instance.data[1].tips);
}
}