【Unity】使用ScriptableObject存储数据

news2024/10/5 16:22:11

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.coloradmin.cn/o/1492206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS全局样式的设置,JavaScript运算符

面试题&#xff1a; Html 1&#xff0c;html语义化 2&#xff0c;meta viewport相关 3&#xff0c;canvas 相关 CSS 1&#xff0c;盒模型 1.1&#xff0c;ie盒模型算上border、padding及自身&#xff08;不算margin&#xff09;&#xff0c;标准的只算上自身窗体的大小 c…

相机类型的分辨率长宽、靶面尺寸大小、像元大小汇总

镜头的靶面尺寸大于等于相机靶面尺寸。 相机的芯片长这样&#xff0c;绿色反光部分&#xff08;我的手忽略&#xff09;&#xff1a; 基本所有像素的相机的靶面大小都可以在这个表格里面找到。 镜头的靶面尺寸在镜头外表上可以找到&#xff0c;选型很重要&#xff01;

Android logcat系统

一 .logcat命令介绍 android log系统: logcat介绍 : logcat是android中的一个命令行工具&#xff0c;可以用于得到程序的log信息. 二.C/Clogcat访问接口 Android系统中的C/C日志接口是通过宏来使用的。在system/core/include/android/log.h定义了日志的级别&#xff1a; /…

信息安全系列04-安全启动介绍

本文框架 1. 基本概念1.1 基本概念回顾1.2 数字签名及验签流程 2. 安全启动实施2.1 信任根选择2.1.1 使用HSM作为信任根2.1.2 使用最底层Bootloader作为信任根 2.2 校验方法确认2.2.1 基于非对称加密算法&#xff08;数字签名&#xff09;2.2.2 基于对称加密算法 2.3 安全启动方…

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

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

Java代码审计安全篇-常见Java SQL注入

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计&#xff0c;记录自己的学习过程&#xff0c;还希望…

怎么把一段音频的人声和背景音乐分开?3种方法分享

怎么把一段音频的人声和背景音乐分开&#xff1f;随着技术的不断发展进步&#xff0c;将音频中的人声和背景音乐分离已成为现实。这种技术不仅提升了音频编辑的效率和准确性&#xff0c;更为我们提供了无限的可能性。例如&#xff0c;音乐制作人可以更容易地提取出纯净的人声或…

【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp操作数据】操作批量新增、分页查询(四)

orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query、mybatis-mp操作数据 环境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本编码方式mybatis☑️☑️3.5.4lambda xml 优化sq…

SAR ADC学习笔记(3)

一、SAR ADC采样电路 1.采样网络的时域响应&#xff1a;采保信号 2.采样网络的KT/C噪声 3.采样抖动 采样开关的种类 1.单MOS管开关 2.传输门开关 3.栅极自举&#xff08;Bootstrap&#xff09;开关 结论&#xff1a;M4的衬底需要和B点短接&#xff0c;保证B点能够到达高压&…

Linux系统的服务/进程

系统守护进程&#xff08;服务&#xff09; •服务就是运行在网络服务器上监听用户请求的进程 •服务是通过端口号来区分的 常见的服务及其对应的端口 1.ftp&#xff1a;21 FTP指的是文件传输协议&#xff0c;它是用于在计算机网络上进行文件传输的标准网络协议。通过FTP&am…

为什么MySQL中多表联查效率低,连接查询实现的原理是什么?

MySQL中多表联查效率低的原因主要涉及到以下几个方面&#xff1a; 数据量大: 当多个表通过连接查询时&#xff0c;如果这些表的数据量很大&#xff0c;那么查询就需要处理更多的数据&#xff0c;这自然会降低查询效率。 连接操作复杂性: 连接查询需要对参与连接的每个表中的数…

ES入门三:全文搜索Api实践

ES是一个强大的搜索引擎&#xff0c;它提供了非常丰富的数据检索Api来满足用户各种各样的需求。我们今天要介绍的是部分非常基础的全文搜索Api&#xff0c;这部分Api我们会在日常使用中经常用到。 在我们查询一些文本内容的时候&#xff0c;一般不会做精确匹配&#xff0c;一来…

Docker Compose实战指南:让容器管理变得简单而强大

&#x1f9e8;个人主页&#xff1a;明明跟你说过 &#x1f6a9;欢迎&#x1f397;️点赞&#x1f638;关注❤️分享 &#x1f638;希望本文能够对您有所帮助&#xff0c;如果本文有不足之处&#xff0c;或您有更好的建议、见解&#xff0c;欢迎在评论区留下您的看法&#xff0c…

界面控件DevExpress WinForms 2024产品路线图预览(一)

DevExpress WinForm拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForm能完美构建流畅、美观且易于使用的应用程序&#xff0c;无论是Office风格的界面&#xff0c;还是分析处理大批量的业务数据&#xff0c;它都能轻松胜任…

用Java在Spring Boot项目中,如何传递来传递一个对象(多个参数??

前言&#xff1a; 在前面我们已经了解到&#xff0c;Spring Boot项目中&#xff0c;可以传递一个参数&#xff0c;或者多个参数&#xff0c;但是&#xff0c;随着参数的增加&#xff0c;咱们总不能每增加一个参数&#xff0c;就重新写一段代码吧&#xff1f;&#xff1f;这样显…

剑指offer》15--二进制中1的个数[C++]

1. 题目描述 输入一个整数&#xff0c;输出该数二进制表示中 1 的个数。 2. 解题思路 如果对负数直接右移&#xff0c;会导致最高位一直补1&#xff0c;最终变成0xFFFF死循环。 常规做法&#xff1a; 3. 代码实现 #include<iostream> #include<vector> using…

Express学习(一)

Express Express简介 什么是Express 官方给出的概念&#xff1a;Express是基于Node.js平台&#xff0c;快速、开放、极简的web开发框架。 通俗的理解&#xff1a;Express的作用和Node.js内置的http模块类似&#xff0c;是专门用来创建Web服务器的。进一步理解Express 不使用E…

GIS之深度学习10:运行Faster RCNN算法

&#xff08;未完成&#xff0c;待补充&#xff09; 获取Faster RCNN源码 &#xff08;开源的很多&#xff0c;论文里也有&#xff0c;在这里不多赘述&#xff09; 替换自己的数据集&#xff08;图片标签文件&#xff09; &#xff08;需要使用labeling生成标签文件&#xf…

Spring MVC 面试题及答案整理,最新面试题

Spring MVC中的DispatcherServlet是什么&#xff0c;它如何工作&#xff1f; DispatcherServlet是Spring MVC中的核心组件&#xff0c;负责协调不同的请求处理器。它的工作流程包括&#xff1a; 1、请求接收&#xff1a; 接收HTTP请求&#xff0c;并将其转发到相应的处理器。…

14:Hadoop数据分析|节点管理|搭建NFS网关服务

数据分析&#xff5c;节点管理&#xff5c;搭建NFS网关服务 HDFS文件系统的使用调用Hadoop集群分析数据Hadoop集群的维护增加修复节点删除节点 搭建NFS网关服务创建账户并授权在nfsgw上运行网关服务NFSGW测试 HDFS文件系统的使用 访问文件系统的两种方式&#xff1a; web页面…