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;
public class SingleScriptableObject<T> : ScriptableObject where T : ScriptableObject { private static T instance;
public static T Instance { get { 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); } }
|