10.总结
10.1 知识点

学习的主要内容

总结讲什么

优点

何时使用ScriptableObject

注意

10.2 核心要点速览
ScriptableObject数据文件的创建
注意:需要继承ScriptableObject类
为类添加CreateAssetMenu通过菜单创建资源特性
[CreateAssetMenu(fileName ="MrTangData", menuName ="ScriptableObject/我的数据", order = 0)] public class MyData : ScriptableObject { }
添加MenuItem特性,利用ScriptableObject的静态方法创建数据对象,然后将数据对象保存在工程目录下
[MenuItem("ScriptableObject/CreateMyData")] public static void CreateMyData() { //书写创建数据资源文件的代码 <T>中一定要继承ScriptableObject MyData myDataAsset = ScriptableObject.CreateInstance<MyData>(); //通过编辑器API 根据数据创建一个数据资源文件 AssetDatabase.CreateAsset(myDataAsset, "Assets/Unity进阶ScriptableObject教程/Lesson02_ScriptableObject数据文件的创建/MyDataTest.asset"); //保存创建的资源 AssetDatabase.SaveAssets(); //刷新界面 AssetDatabase.Refresh(); }
ScriptableObject数据文件的使用
- 方法一:通过Inspector中的public变量进行关联
- 方法二:通过资源加载的信息关联
myData = Resources.Load<MyData>("MyDataTest");
ScriptableObject非持久数据和持久化
分类 | 详情 |
---|---|
回顾创建非持久化数据 | MyData myData = ScriptableObject.CreateInstance(); |
回顾数据持久化 | 数据在硬盘和内存之间交互,使用时从硬盘读取,改变后保存到硬盘,游戏退出或程序关闭后数据存储在硬盘实现持久化。已讲授的数据持久化方案包括PlayerPrefs、XML、Json、二进制等 |
- 利用Json结合ScriptableObject存储数据 示例代码如下:
myData.PrintInfo(); myData.i = 9999; myData.f = 6.6f; myData.b = true; //将数据对象序列化为json字符串: string str = JsonUtility.ToJson(myData); print(str); //把数据序列化后的结果存入指定路径当中: File.WriteAllText(Application.persistentDataPath + "/testJson.json", str); print(Application.persistentDataPath); ``` |
- 利用Json结合ScriptableObject读取数据 示例代码如下:
//从本地读取Json字符串: str = File.ReadAllText(Application.persistentDataPath + "/testJson.json"); //根据json字符串反序列化出数据将内容覆盖到数据对象中: JsonUtility.FromJsonOverwrite(str, myData); // FromJsonOverwrite方法是将JSON数据覆盖到现有对象 // FromJson方法JSON数据转换为新的对象实例用一个新对象来接(就算用老对象来接 也是引用新的实例) myData.PrintInfo();
- 总结 ScriptableObject的数据在游戏发布运行过程中无法持久化,可借助PlayerPrefs、XML、Json、二进制等方式实现持久化,但不建议用ScriptableObject做数据持久化
ScriptableObject单例
实现单例模式化获取数据需要运用到面向对象、单例模式、泛型等知识。我们可以创建一个ScriptableObject数据单例模式基类,这样一来,只要让子类继承这个基类,就可以直接获取到数据,而无需再使用public关联或者资源动态加载的方式。
单例基类实现:
public class SingleScriptableObject<T> : ScriptableObject where T : ScriptableObject
{
private static T instance;
public static T Instance
{
get
{
// 如果为空 首先应该去资源路径下加载 对应的 数据资源文件
if (instance == null)
{
// 我们定两个规则
// 1.所有的 数据资源文件都放在 Resources文件夹下的ScriptableObject中
// 2.需要复用的 唯一的数据资源文件名 我们定一个规则:和类名是一样的
instance = Resources.Load<T>("ScriptableObject/" + typeof(T).Name);
}
// 如果没有这个文件 为了安全起见 我们可以在这直接创建一个数据
if (instance == null)
{
instance = CreateInstance<T>();
}
// 甚至可以在这里 从json当中读取数据,但是我不建议用ScriptableObject来做数据持久化
return instance;
}
}
}
继承示例:
public class RoleInfo : SingleScriptableObject<RoleInfo>
[CreateAssetMenu]
public class TestData : SingleScriptableObject<TestData>
{
public int i;
public bool b;
}
使用示例:
print(RoleInfo.Instance.roleList[0].id);
print(RoleInfo.Instance.roleList[1].tips);
print(TestData.Instance.i);
print(TestData.Instance.b);
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com