【Unity】使用ScriptableObject存储数据

1.为什么要用ScriptableObject?

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

2.什么是 ScriptableObject?

ScriptableObject 是一个类,继承自 UnityEngine.Object 。要想使用它,需要我们写个脚本去继承 。
ScriptableObject 类的实例会被保存为资源文件(.asset文件),和其他预制体、材质球、图片等文件类似。如下图
在这里插入图片描述

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)]

在这里插入图片描述点击文件夹空白处,选择创建

在这里插入图片描述方法二:静态方法创建数据对象
新建一个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();
    }
}

此时在菜单栏可以看到多了刚刚定义的按钮,点击即可创建
在这里插入图片描述
创建完就长这样,刚刚申明的成员也到可以看到。
在这里插入图片描述

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教程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/431732.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 面向对象编程——类的使用

一、学习目标 1&#xff0e;掌握类的定义和实例化对象。 2&#xff0e;熟练掌握类的构造函数__init__使用。 3&#xff0e;掌握类的继承机制和使用。 二、相关练习 1、定义一个玩具类Toy()&#xff0c;创建名字为“小汽车”、“手枪”和“积木”的玩具实例&#xff0c;计…

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:多态样式)

设置组件不同状态下的样式。 说明&#xff1a; 从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 从API Version 11开始支持另一种写法attributeModifier&#xff0c;可根据开发者需要动态设置属性。 stateStyles stateStyl…

微信报修小程序源码

源码获取方式&#xff1a; 1、搜一搜 万能工具箱合集 然后点击资料库&#xff0c;即可获取资源 一、先看Demo&#xff08;已更新至4.0.0&#xff09; 想看界面图片的&#xff0c;辛苦你爬一下楼&#xff0c;点击下方查看资源&#xff0c;进入官方demo 二、功能介绍 1、当前版…

二路归并排序的算法设计和复杂度分析and周记

数据结构实验报告 实验目的: 通过本次实验&#xff0c;了解算法复杂度的分析方法&#xff0c;掌握递归算法时间复杂度的递推计算过程。 实验内容&#xff1a; 二路归并排序的算法设计和复杂度分析 实验过程&#xff1a; 1.算法设计 第一步&#xff0c;首先要将数组进行…

计算机网络-第3章 数据链路层

主要内容&#xff1a;两个信道及对应的协议&#xff1a;点对点信道和广播信道&#xff0c;扩展以太网和高速以太网 本章的分组转发为局域网内的转发&#xff0c;不经过路由&#xff0c;网络层分组转为为网络与网络之间的转发&#xff0c;经过路由。局域网属于网络链路层的范围…

苹果群控功能解析与代码分享!

随着移动互联网的飞速发展&#xff0c;智能设备日益普及&#xff0c;苹果设备因其出色的用户体验和稳定的性能受到了广大用户的喜爱&#xff0c;然而&#xff0c;对于开发者而言&#xff0c;如何有效地管理和控制大量的苹果设备成为了一个亟待解决的问题。 一、苹果群控功能概…

00. Nginx总结-错误汇总

/www/wangmingqu/index.html" is forbidden (13: Permission denied) 错误图片 错误日志 2024/01/09 22:26:27 [error] 1737#1737: *1 "/www/wangmingqu/index.html" is forbidden (13: Permission denied), client: 192.169.1.101, server: www.wangmingqu.c…

回收小程序开发,降低企业成本,提高回收利润

近年来&#xff0c;人们的回收意识逐渐强烈&#xff0c;废品回收行业发展非常迅猛&#xff0c;促进了我国的资源回收再利用&#xff0c;我国回收行业也将迎来新的发展机遇。 随着市场规模的扩大&#xff0c;回收行业也正在逐步进行创新。在互联网的支持下&#xff0c;行业中也…

只会Vue的我,用两天学会了react,这个方法您也可以

公众号&#xff1a;需要以下pdf&#xff0c;关注下方 2023已经过完了&#xff0c;让我们来把今年的面试题统计号&#xff0c;来备战明年的金三银四&#xff01;所以&#xff0c;不管你是社招还是校招&#xff0c;下面这份前端面试工程师高频面试题&#xff0c;请收好。 背景 由…

基于springboot实现保险信息网站系统项目【项目源码+论文说明】

基于springboot实现保险信息网站系统演示 摘要 随着互联网的不断发展&#xff0c;现在人们获取最新资讯的主要途径来源于网上新闻&#xff0c;当下的网上信息宣传门户网站的发展十分的迅速。而保险产品&#xff0c;作为当下人们非常关注的一款能够给人们带来医疗、生活、养老或…

保护模式笔记九 中断门和IDT(中断描述符表)

段选择子&#xff1a; 先直观认识一下GDT和段选择子在逻辑地址转换为线性地址中的作用&#xff0c;例如&#xff1a; 给出逻辑地址&#xff1a;21h:12345678h&#xff0c;需要将其转换为线性地址 a. 选择子SEL21h0000000000100 0 01b&#xff0c;他代表的意思是&#xff1a…

操作系统--绪论

这里写目录标题 什么是操作系统&#xff08;OS&#xff09;硬件工作示例引入操作系统目标计算机的产生图灵机通用图灵机计算机 启动电源键开启后&#xff0c;计算机干了什么二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目录二级目录二级目录 一级目录二级目…

洛谷P8888(吉利题) 实验基地

今天来水一期吉利题。 提醒一下&#xff0c;虽然编号很吉利&#xff0c;但内容可不吉利&#xff0c;做好心理准备&#xff01;&#xff01;&#xff01; 题目背景 小 A 和小 B 用实验基地全新的装备进行了一场世纪蒟蒻之战。 题目描述 众所周知&#xff0c;实验基地的武器…

静态时序分析:SDC约束命令set_disable_timing详解

静态时序分析https://blog.csdn.net/weixin_45791458/category_12567571.html 目录 指定对象列表 指定源、目的引脚 指定恢复 简单使用 写在最后 上一章中&#xff0c;我们学习了如何使用set_case_analysis模式分析命令&#xff0c;它通过指定某个端口或引脚为固定值&…

B3619 10 进制转 x 进制

题目描述 给定一个十进制整数 n 和一个小整数 x。将整数 n 转为 x 进制。对于超过十进制的数码&#xff0c;用 A&#xff0c;B ... 表示。 输入格式 第一行一个整数 n&#xff1b; 第二行一个整数 x。 输出格式 输出仅包含一个整数&#xff0c;表示答案。 输入输出样例 …

三星成功研发出业界首款12层堆叠HBM3E

三星电子有限公司成功研发出业界首款12层堆叠HBM3E DRAM——HBM3E 12H&#xff0c;这是迄今为止容量最大的HBM产品。这款新型HBM3E 12H内存模块提供了高达1,280GB/s的史上最高带宽&#xff0c;并拥有36GB的存储容量&#xff0c;相较于之前的8层堆叠HBM3 8H&#xff0c;在带宽和…

鸿蒙 Stage模型-应用组件-配置、UIAbility

前提&#xff1a;基于官网3.1/4.0文档。参考官网文档 基于Android开发体系来进行比较和思考。&#xff08;或有偏颇&#xff0c;自行斟酌&#xff09; 一、概念 可以看到分为运行期、编译器&#xff0c;主要关注UIAbility&#xff08;类似Activity&#xff0c;UI相关&#xff0…

MySQL面试题纯享版

基础内容 1、MySQL的架构分层 2、一条 SQL 查询语句的执行流程 3、如何查看 MySQL 服务被多少个客户端连接了&#xff1f; 4、 空闲连接会一直占用着吗&#xff1f; 5、MySQL 的连接数有限制吗&#xff1f; 6、 怎么解决长连接占用内存的问题&#xff1f; 7、执行器与存储引擎…

AI大模型让你体验未来科技之美

在未来的世界里&#xff0c;AI大模型扮演着越来越重要的角色&#xff0c;它们不仅可以让我们感受到科技之美&#xff0c;更能够改变我们的生活方式和工作方式。通过AI大模型的运用&#xff0c;我们可以实现无人驾驶汽车、智能家居、智能医疗等各种领域的创新应用。 首先说到无…

Android:BitmapFactory.decodeStream Bitmap的内存优化OutOfMemory异常以后Crash闪退

自己项目中使用如下方法&#xff0c;有的手机上会奔溃报错&#xff0c;原因是BitmapFactory.decodeStream部分没有使用options参数改变内存大小 改成如下形式后正常了&#xff1b;正确解决方案&#xff1a;设置inSampleSize 一&#xff09;Android BitmapFactory.decodeStream(…