【Unity】使用ScriptableObject存储数据

这篇具有很好参考价值的文章主要介绍了【Unity】使用ScriptableObject存储数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.为什么要用ScriptableObject?

在游戏开发中,有大量的配置数据需要存储,这个时候就需要ScriptableObject来存储数据了。
很多人会说我可以用json、xml、txt,excel等等
但是你们有没有想过,假设你使用的是json,那你在加载json后,还要去解析,还需要把它转换为合适的数据结构。
但是ScriptableObject就可以“免”去这一步,因为我可以把配置数据解析放在游戏启动之前。
而且ScriptableObject可以添加一些自定义的方法,十分方便。

2.什么是 ScriptableObject?

ScriptableObject 是一个类,继承自 UnityEngine.Object 。要想使用它,需要我们写个脚本去继承 。
ScriptableObject 类的实例会被保存为资源文件(.asset文件),和其他预制体、材质球、图片等文件类似。如下图
【Unity】使用ScriptableObject存储数据,Unity 程序设计,unity,游戏引擎

3.如何创建 ScriptableObject?

①声明自定义的数据容器
新建一个脚本ItemData.cs,继承 ScriptableObject,然后声明成员。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ItemData : ScriptableObject
{
    //道具ID
    public int id;
    //道具名称
    public string strName;
    //道具图标
    public string icon;
    //道具类型
    public int type;
}

②创建数据文件
方法一:为类添加 CreateAssetMenu 特性

[CreateAssetMenu(fileName = "ItemData", menuName = "ScriptableObject/道具数据", order = 0)]

【Unity】使用ScriptableObject存储数据,Unity 程序设计,unity,游戏引擎点击文件夹空白处,选择创建

【Unity】使用ScriptableObject存储数据,Unity 程序设计,unity,游戏引擎方法二:静态方法创建数据对象
新建一个EditorTool 脚本。不用继承 MonoBehavoiur,也不用挂载到游戏物体上。
引入 UnityEditor 命名空间:
需要特别注意:引入 UnityEditor 命名空间的脚本,必须放入任意一个命名为“Editor”的文件夹下,以便打包过滤

using UnityEngine;
using UnityEditor;
public class EditorTool  
{
    [MenuItem("Tool/创建道具数据")]
    public static void CreateMyData()
    {
        //得到需要创建的数据结构类型
        ItemData asset = ScriptableObject.CreateInstance<ItemData>();
        //创建一个数据资源文件,第二个参数为存储路径
        AssetDatabase.CreateAsset(asset, "Assets/Resources/Data/ItemData.asset");
        //保存创建的资源
        AssetDatabase.SaveAssets();
        //刷新界面
        AssetDatabase.Refresh();
    }
}

此时在菜单栏可以看到多了刚刚定义的按钮,点击即可创建
【Unity】使用ScriptableObject存储数据,Unity 程序设计,unity,游戏引擎
创建完就长这样,刚刚申明的成员也到可以看到。
【Unity】使用ScriptableObject存储数据,Unity 程序设计,unity,游戏引擎

4.项目中的 ScriptableObject

ScriptableObject已经创建完毕了,但实际开发中,数据结构可能很复杂,所以都会根据不同的功能,有所改变。
①比如,这是一个存储地形数据的配置,那么数据量就可能非常大,可能有几万行。这时候我们可以加HideInInspector来隐藏面板显示。隐藏的好处是选择当前配置不卡顿,不然数据多,选中会非常卡。

[HideInInspector]
public int[] data;

②嵌套使用,正常的配置可能都是数组,那可能就需要使用如下这种结构了

using UnityEngine;
 
public class ItemData : ScriptableObject
{
    public Item[] list;

}
[System.Serializable]
public class Item
{
    //道具ID
    public int id;
    //道具名称
    public string strName;
    //道具图标
    public string icon;
    //道具类型
    public int type;

    [HideInInspector]
    public int[] data;
}

③封装一些方法,方便其他功能使用

public class ItemData : ScriptableObject
{
    public Item[] list;

    //根据道具ID获取数据
    public Item GetSheet(int id)
    {
        for (int i = 0;i < list.Length;i++)
        {
            if (list[i].id == id)
            {
                return list[i];
            }
        }
        return null;
    }
}
[

5.加载 ScriptableObject

    void Start()
    {
        string path = "Data/ItemData";
        Object obj = Resources.Load(path, typeof(ScriptableObject));
        if (obj != null)
        {
            ItemData mItemData = obj as ItemData;
        }

    }

6.与exce配合使用

在正常开发中,肯定不可能手动配置ScriptableObject
正常的策划配置文件都是excel,我们可以写个方法,直接读取excel的数据然后生成ScriptableObject
双剑合并,效率翻倍!

不会Excel读取的,可以参考这篇文章
Unity读取Excel教程文章来源地址https://www.toymoban.com/news/detail-837487.html

到了这里,关于【Unity】使用ScriptableObject存储数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包