Unity中保存数据的方法

news2024/9/20 20:39:34

一、概述

Unity中可用于持久化的方式有:

1)通过ScriptableObject在可编辑模式下保存数据

2)通过excel、json等文件实现数据的可持久化

二、ScriptableObject的使用

1、使用背景

假如需要制作子弹预设体,每个子弹上有speed速度和damage伤害力的参数。

按照现有的方法,这两个参数设置为public或者[SerializedField] private的属性,那么就可以在Inspector界面中配置两个参数的具体值。

当游戏运行的时候,每生成一个实例都会复制一份这个数据,实际上复制的都是同一份数据,这样就造成了内存的浪费。

通过ScriptableObject方法可以实现编辑模式下的数据存储,针对这种复制同一份数据的情况,比excel、json等更加方便。

2、ScritableObject介绍

2.1 定义

1)ScriptableObject是Unity的一个数据配置存储基类,类似于MonoBehaviour的基类,继承自UnityEngine.Object。它是一个可以用来保存大量数据的数据容器,实例化后可以将它保存为自定义的数据资源文件

2)ScriptableObject本身是一个类,ScriptableObject实例化后被保存为.asset资源文件,和预设体、材质球、音频文件等类似,存放在Assets文件夹下。

2.2 作用

1)编辑模式下的数据持久化

编辑模式下会保存数据,但是游戏运行时修改ScriptableObject的数据是不会保存到本地的,重新打开运行时数据还是配置的的初始数据。

2)配置文件(配置游戏中的数据)

配置文件的数据在游戏发布前定义好规则,运行时只会读出使用而不会修改数据的内容。传统配置文件是放在xml、json、excel等里面,ScriptableObject直接在Inspector中进行配置更加方便。

3)数据复用(多个对象共用一套数据)

三、使用示例

1、效果

unity配置:

2、创建ScriptableObject类的BulletData.cs:

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

[CreateAssetMenu(fileName ="BulletData", menuName ="ScritableObject/子弹数据")]
public class BulletData : ScriptableObject
{
    public int speed;
    public int damage;
}

fileName表示数据资源文件创建出来的文件名

menuName表示在Assets/Create下的名字

创建后命名为BulletData,并放在Assets/ScriptableObject目录下,并配置speed和damage的值。

3、创建PanelOperator.cs文件,并挂载到Panel对象上

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

public class PanelOperator : MonoBehaviour
{
    public BulletData bulletData;
    // Start is called before the first frame update
    void Start()
    {
        this.transform.Find("SpeedInfo").GetComponent<Text>().text = bulletData.speed.ToString();
        this.transform.Find("DamageInfo").GetComponent<Text>().text = bulletData.damage.ToString(); 
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

配置Panel的BulletData对象的值

4、编写Button的操作类ButtonOperator.cs并挂载到ButtonOperator上

using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class ButtonOperator : MonoBehaviour
{
    public Text speedText;
    public Text damageText;
    public BulletData bulletData;

    public void addSpeed()
    {
        int currentValue = int.Parse(speedText.text);
        currentValue += 1;
        speedText.text = currentValue.ToString(); 
    }

    public void addDamage()
    {
        int currentValue = int.Parse(damageText.text);
        currentValue += 1;
        damageText.text = currentValue.ToString();
    }

    public void storeData()
    {
        bulletData = ScriptableObject.CreateInstance<BulletData>();
        bulletData.speed = int.Parse(speedText.text);
        bulletData.damage = int.Parse(damageText.text);

        string dataStr = JsonUtility.ToJson(bulletData);
        Debug.Log(Application.streamingAssetsPath);
        // 一定要在Assets下创建StreamingAssets目录
        File.WriteAllText(Application.streamingAssetsPath + "/testJson.json", dataStr); 
    }

    public void recoverData()
    {
        string dataStr = File.ReadAllText(Application.streamingAssetsPath + "/testJson.json");
        Debug.Log(dataStr);
        // 否则报错:ArgumentNullException: Value cannot be null Parameter name: objectToOverwrit
        bulletData = ScriptableObject.CreateInstance<BulletData>();  
        JsonUtility.FromJsonOverwrite(dataStr, bulletData); 
        speedText.text = bulletData.speed.ToString();
        damageText.text = bulletData.damage.ToString(); 
    }
}

然后配置SpeedButton、DamageButton、Store、Recover的事件。

配置ButtonOperator的参数如下:

5、JSON持久化解读

5.1 保存数据

bulletData = ScriptableObject.CreateInstance<BulletData>();
bulletData.speed = int.Parse(speedText.text);
bulletData.damage = int.Parse(damageText.text);

string dataStr = JsonUtility.ToJson(bulletData);
Debug.Log(Application.streamingAssetsPath);
File.WriteAllText(Application.streamingAssetsPath + "/testJson.json", dataStr); 

如果保存在Application.streamingAssetsPath路径下,一定要在Assets下创建StreamingAssets目录

5.2 读取数据

string dataStr = File.ReadAllText(Application.streamingAssetsPath + "/testJson.json");
Debug.Log(dataStr);
bulletData = ScriptableObject.CreateInstance<BulletData>();  
JsonUtility.FromJsonOverwrite(dataStr, bulletData); 
speedText.text = bulletData.speed.ToString();
damageText.text = bulletData.damage.ToString(); 

如果使用FromJsonOverwrite把数据保存到类的实例中,一定要确保类已经实例化了。否则会报错:“ArgumentNullException: Value cannot be null Parameter name: objectToOverwrite"。

6、生成ScriptableObject非持久化数据

利用ScriptableObject类的静态方法CreateInstance<>()可以生成非持久化的数据,此时相当于BulletData继承于MonoBehaviour时的效果。使得ScriptableObject的类做到了两种用法。

该方法可以在运行时创建出指定继承自ScriptableObject的对象,该对象只存在于内存中,可以被GC垃圾回收,调用依次就创建一次。

方法见:bulletData = ScriptableObject.CreateInstance<BulletData>();  

四、总结

对于只用不变的数据,就是和用ScriptableObject做数据配置文件,再加上编辑模式下实现数据持久化的特点,我们可以在Inspector面板中进行数据的配置与调试,有的时候是更加方便的,并且可以达到数据复用的目的,减少内存消耗。但是它无法在游戏打包发布后将数据的变动存储到磁盘中。

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

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

相关文章

windows 10安装GPU版本pytorch

一、下载Anaconda 1.由于anaconda的服务器都在国外&#xff0c;推荐大家使用镜像源进行下载&#xff0c;清华的conda镜像链接&#xff1a;​​​​​​ anaconda | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirrora 2.使用命令新建一个虚拟环境&#…

一个简单的 NLP 神经网络

如何搭建一个简单的 NLP 神经网络&#xff1f; 假设我们一个变量名列表&#xff0c;根据这个变量名列表&#xff0c;学习其中的特征并生成新的变量名。训练一个模型用于预测下一个字符并生成新的变量名。使用一个单层的神经网络实现&#xff0c;假设我们的变量名只能用英文字母…

Python爬虫02

xml 和html 区别 jsonpath模块 场景 多层嵌套的复杂字典直接提取数据 安装 pip install jsonpath使用 from jsonpath import jsonpathret jsonpath(dict, jaonpath语法规则字符串)语法规则 eg: lxml模块&xpath语法 谷歌浏览器 xpath helper 插件 作用对当前页面…

d3dcompiler_47.dll缺失的可能原因多种多样,那么d3dcompiler_47.dll缺失怎么修复

在数字世界的深处&#xff0c;d3dcompiler_47.dll文件扮演着至关重要的角色&#xff0c;它是Direct3D编译器的一部分&#xff0c;负责处理图形渲染和游戏运行中的关键任务。然而&#xff0c;当用户启动某个程序或游戏时&#xff0c;屏幕上突然弹出的错误提示“d3dcompiler_47.d…

DevOps学习笔记

记录以下DevOps学习笔记&#xff0c;这里是笔记的入口汇总&#xff0c;可以直观的看到所有的笔记&#xff0c;还没有入口的部分&#xff0c;在下正在努力编写中。 gitlab jenkins docker docker安装 artifactory 1.artifactory安装 2.artifactory使用 计算机网络 1.dn…

世界上最快的端口扫描器masscan,如何使用?如何进行分布式使用部署?如何集成到web系统?

世界上最快的端口扫描器masscan,如何使用?如何进行分布式使用部署?如何集成到web系统? Masscan是一个高速的端口扫描工具,其主要功能和特点包括: 高速扫描:Masscan采用异步扫描技术,能够以非常快的速度扫描大量的主机和端口。 支持大规模扫描:Masscan可以同时扫描数十…

获得SSH秘钥和SSL环境的可见性和控制权

未经管理的密钥和证书如何损害分层安全防御系统 多年来&#xff0c;由于技术的不断发展和演变&#xff0c;网络威胁和安全漏洞也在不断变化。企业大多都在精心研究各种解决方案和战略&#xff0c;以加强其安全基础设施。但是&#xff0c;安全问题是没有灵丹妙药的。 目前&…

自动化工程案例01:8工位插针装配机01

机器主要作用是对充电枪中的插头进行加工&#xff0c;主要实现对插头进行压橡胶帽和安装密封圈。主要对两种不同的工件进行装配 旋转盘工位&#xff1a; 控制旋转盘每次旋转角度是2个气动夹爪之间的角度。 1.旋转盘共有10个气动夹爪和10个安装密封圈辅助固定工位。 2.通过接…

谷器数据产品入选《沈阳市工业领域大规模设备更新供给设备清单》

近日&#xff0c;沈阳市举行了工业领域大规模设备更新产需对接暨制造业新型技术改造城市试点启动大会&#xff0c;旨在促进制造业企业扩大需求、拓展市场、抢抓订单&#xff0c;推动制造业高端化、智能化、绿色化发展。 会上&#xff0c;沈阳市工信局首次对外发布了《沈阳市工…

43款最新泛微Ecology9精品应用(一键导入,轻松上手)

泛微E9精品应用建模——高效管理从这里开始,支持二次开发 简介 在现代企业管理中&#xff0c;系统化、标准化的流程管理已成为各类企业提升竞争力的必经之路。为了帮助企业快速搭建并优化业务流程&#xff0c;我们推出了泛微E9的精品应用建模Demo。这款Demo展示了从业务需求…

甜羊浏览器:抖店多店铺管理与自动回复的最佳解决方案

随着短视频平台的蓬勃发展&#xff0c;抖音旗下的电商平台——抖店&#xff0c;已成为许多商家的重要销售渠道。然而&#xff0c;对于拥有多个抖店店铺的商家而言&#xff0c;如何高效管理这些店铺以及处理大量的客户咨询&#xff0c;成为了亟待解决的问题。此时&#xff0c;甜…

audiocraft - 免费文本转音乐、AI音乐生成、AI音乐创作工具,Facebook开源,本地一键整合包下载

AudioCraft 是一个由Facebook Research开发的PyTorch库&#xff0c;专注于深度学习在音频生成领域的研究。这个强大的工具包集成了两个最新的AI音频生成模型&#xff1a;AudioGen和MusicGen&#xff0c;能够产生高质量的声音和音乐。 今天的一键包也包含了 AudioGen 和 MusicG…

x264 编码器 AArch64汇编系列:quant 量化相关汇编函数

quant x264_quant_init函数中初始化时指向不同的具体实现: 以4x4块量化为例 c 语言版本实现 4x4 块量化:quant_4x4#define QUANT_ONE( coef, mf, f ) \

SprinBoot+Vue校园活动报名微信小程序的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平…

c# checkbox的text文字放到右边

checkbox的text文字放到右边 实现方法如下图 特此记录 anlog 2024年9月2日

【Python学习手册(第四版)】学习笔记23-模块包

个人总结难免疏漏&#xff0c;请多包涵。更多内容请查看原文。本文以及学习笔记系列仅用于个人学习、研究交流。 本文主要介绍模块包&#xff0c;介绍了包导入&#xff08;基础、__init__.py包文件&#xff09;、包绝对导入&#xff08;import string/from dr1 import xxx&…

绿色物流:TMS在节能减排中的角色

绿色物流&#xff1a;TMS在节能减排中的角色 随着全球气候变化的严峻挑战&#xff0c;节能减排已成为各行各业不可回避的议题。物流行业作为连接生产与消费的重要桥梁&#xff0c;其碳排放量不容忽视。在追求经济效益的同时&#xff0c;如何实现绿色、可持续的物流发展&#x…

AI真“卷出天际”!我国发布全球首个月球专业大模型;0代码可做游戏,谷歌发布世界首个AI游戏引擎|AI日报

文章推荐 OpenAI“草莓项目”最快今年秋季发布&#xff01;苹果将于9月10号推出首款AI iPhone&#xff5c;AI日报 吴恩达辞任Landing AI CEO&#xff0c;专注AI投资&#xff1f;数学家斯蒂芬预言哲学家引领AI未来&#xff5c;AI日报 今日热点 中国科学院地球化学研究所与阿…

不到一元!新手用ToDesk云电脑体验《黑神话:悟空》

游戏小白们&#xff0c; 你们 是不是也眼馋《黑神话悟空》那炫酷的画面和刺激的战斗&#xff0c;但一想到要升级电脑配置就头疼&#xff1f;别怕&#xff0c; 小埋 有个超赞的秘籍要分享给你们——ToDesk云电脑&#xff0c;让你不到一块钱就能尝鲜&#xff01; ToDesk云电脑&am…

【微信小程序入门】2、微信小程序开发前准备

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…