10.Unity进阶ScriptableObject总结

10.总结


10.1 知识点

学习的主要内容

总结讲什么

优点

何时使用ScriptableObject

注意


10.2 核心要点速览

ScriptableObject数据文件的创建

注意:需要继承ScriptableObject类

  1. 为类添加CreateAssetMenu通过菜单创建资源特性

    [CreateAssetMenu(fileName ="MrTangData", menuName ="ScriptableObject/我的数据", order = 0)]
    public class MyData : ScriptableObject
    {
    }
    
    csharp复制代码
  2. 添加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();
     }
    
    csharp复制代码

ScriptableObject数据文件的使用

  • 方法一:通过Inspector中的public变量进行关联
  • 方法二:通过资源加载的信息关联
    myData = Resources.Load<MyData>("MyDataTest");
    
    csharp复制代码

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);
    ``` |
    
    csharp复制代码
  • 利用Json结合ScriptableObject读取数据 示例代码如下:
    //从本地读取Json字符串:
    str = File.ReadAllText(Application.persistentDataPath + "/testJson.json");
    //根据json字符串反序列化出数据将内容覆盖到数据对象中:
    JsonUtility.FromJsonOverwrite(str, myData);
    // FromJsonOverwrite方法是将JSON数据覆盖到现有对象
    // FromJson方法JSON数据转换为新的对象实例用一个新对象来接(就算用老对象来接 也是引用新的实例)
    myData.PrintInfo();
    
    csharp复制代码
  • 总结 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;
        }
    }
}
csharp复制代码

继承示例

public class RoleInfo : SingleScriptableObject<RoleInfo>
csharp复制代码
[CreateAssetMenu]
public class TestData : SingleScriptableObject<TestData>
{
    public int i;
    public bool b;
}
csharp复制代码

使用示例

print(RoleInfo.Instance.roleList[0].id);
print(RoleInfo.Instance.roleList[1].tips);

print(TestData.Instance.i);
print(TestData.Instance.b);
csharp复制代码


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏