【unity小技巧】Unity 存储存档保存——PlayerPrefs、JsonUtility和MySQL数据库的使用
文章目录
- 前言
- PlayerPrefs
- 一、基本介绍
- 二、Demo
- 三、优缺点
- JsonUtility
- 一、基本使用
- 二、Demo
- 三、优缺点
- Mysql(扩展)
- 完结
前言
游戏存档不言而喻,是游戏设计中的重要元素,可以提高游戏的可玩性,为玩家提供更多的自由和控制权。看完这篇文章就可以构建属于自己的存储系统了。
PlayerPrefs
它是一个仅仅可以存储字符串、浮点数和整数值数据的类
一、基本介绍
保存
PlayerPrefs.SetString(string KeyName, string Value);
PlayerPrefs.SetFloat(string KeyName, float Value);
PlayerPrefs.SetInt(string KeyName, int Value);
# 最后调用Save函数将这些key存入磁盘
PlayerPrefs.Save()
查找
# HasKeyl函数中可以通过传入Key得到一个bool的返回值
PlayerPrefs.HasKey(string KeyName);
读取
string Value = PlayerPrefs.GetString(string KeyName);
float Value = PlayerPrefs.GetFloat(string KeyName);
int Value = PlayerPrefs.GetInt(string KeyName);
删除
# 删除某个key
PlayerPrefs.DeleteKey(KeyName);# 删除全部
PlayerPrefs.DeleteAll();
二、Demo
实现按下O键保存玩家的位置数据,并通过按下P键加载玩家的位置数据
using UnityEngine;
public class PlayerDataManager : MonoBehaviour
{public Transform player;private void Update(){if (Input.GetKeyDown(KeyCode.O)) Save();//当按下'o'键时保存玩家数据if (Input.GetKeyDown(KeyCode.P)) Load();//当按下'P'键时加载玩家数据}public void Save(){PlayerPrefs.SetFloat("PlayerPositionX", player.position.x);PlayerPrefs.SetFloat("PlayerPositionY", player.position.y);PlayerPrefs.SetFloat("PlayerPositionz", player.position.z);PlayerPrefs.Save();//保存玩家偏好设置Debug.Log("Save ok!");}public void Load(){if (PlayerPrefs.HasKey("PlayerPositionX")&&PlayerPrefs.HasKey("PlayerPositionY")&&PlayerPrefs.HasKey("PlayerPositionz")){float x = PlayerPrefs.GetFloat("PlayerPositionX");float y = PlayerPrefs.GetFloat("PlayerPositionY");float z = PlayerPrefs.GetFloat("PlayerPositionz");player.position = new Vector3(x,y,z);Debug.Log("Load ok!");}}
}
效果
三、优缺点
JsonUtility
它是Unty引擎中提供的一个用于序列化和反序列化JSON数据的工具类,该类提供了三个方法。
一、基本使用
第一个函数ToJson可以将可序列化的对象转换为JSON字符串
第二个可选参数表示是否花费更多的性能将字符转换为更适合阅读的方式
//通过JS0N表示形式创建对象
string json = JsonUtility.ToJson(object obj, bool prettyPrint);
第二个函数FromJson可以将字符转换为对象
Playerlnfo是一个泛型参数,用于指定要将JSoN字符串转换为的对象类型
//生成对象的公共字段的JS0N表示形式
PlayerInfo playerInfo = JsonUtility.FromJson<PlayerInfo>(string json);
第三个函数则可以传入新的数据覆盖到已有对象中,而不是创建新的对象,在频繁读取数据时可以节省开销
//通过读取对象的JS0N表示形式覆盖其数据
JsonUtility.FromJsonOverwrite(string json, object objectTooverwrite);
二、Demo
Application.persistentDataPath是一个持久化的数据路径
在不同的操作系统上,unity会为我们分配不同的持久化数据路径
这样可以确保应用程序在不同平台上都能正确保存和访问
using UnityEngine;
using System.IO;
public class PlayerDataManager : MonoBehaviour
{public Transform player;private string savePath;private void Awake(){//获取存档文件路径savePath = Path.Combine(Application.persistentDataPath, "saveData.json");}private void Update(){if (Input.GetKeyDown(KeyCode.O)) Save();//当按下'o'键时保存玩家数据if (Input.GetKeyDown(KeyCode.P)) Load();//当按下'P'键时加载玩家数据}public void Save(){PlayerGameData saveData = new PlayerGameData();saveData.playerPosition = player.position;string jsonData = JsonUtility.ToJson(saveData);File.WriteAllText(savePath, jsonData);Debug.Log("Save ok!");}public void Load(){//首先对路径做一个安全性检查if(File.Exists(savePath)){string jsonData = File.ReadAllText(savePath);//将JSON数据反序列化为游戏数据对象PlayerGameData loadedData = JsonUtility.FromJson<PlayerGameData>(jsonData);player.position = loadedData.playerPosition;Debug.Log("Load ok!");}else{Debug.Log("Load ok!");}}
}[System.Serializable]
public class PlayerGameData
{public Vector3 playerPosition;// 可以添加其他的游戏数据字段
}
效果
不同平台存储的路径不一样,我们可以打印savePath查看自己的存储路径
比如我的就是
三、优缺点
Mysql(扩展)
首先,您需要从官方MySQL网站下载MySQL Connector/NET。下载并安装后,您可以在Unity项目中添加对MySQL.Data.dll的引用。
如果您需要在整个应用程序中共享数据库连接,那么使用单例模式可能是一个好主意。这将确保只有一个MySQLConnector实例存在,并且可以在应用程序的任何部分使用它。
要实现这一点,您可以将MySQLConnector类的构造函数设置为私有,并添加一个静态GetInstance方法,该方法返回MySQLConnector类的单例实例。在GetInstance方法中,您可以检查是否已经创建了一个MySQLConnector实例,如果没有,则创建一个新实例并返回它。否则,返回现有实例。
using System.Data;
using MySql.Data.MySqlClient;public class MySQLConnector
{private static MySQLConnector instance;private MySqlConnection connection;private string server;private string database;private string uid;private string password;private MySQLConnector(string server, string database, string uid, string password){this.server = server;this.database = database;this.uid = uid;this.password = password;string connectionString = "SERVER=" + server + ";" + "DATABASE=" + database + ";" + "UID=" + uid + ";" + "PASSWORD=" + password + ";";connection = new MySqlConnection(connectionString);}public static MySQLConnector GetInstance(string server, string database, string uid, string password){if (instance == null){instance = new MySQLConnector(server, database, uid, password);}return instance;}public void OpenConnection(){connection.Open();}public void CloseConnection(){connection.Close();}public DataTable ExecuteQuery(string query){MySqlCommand cmd = new MySqlCommand(query, connection);MySqlDataAdapter adapter = new MySqlDataAdapter(cmd);DataTable dataTable = new DataTable();adapter.Fill(dataTable);return dataTable;}
}
现在,您可以在应用程序的任何部分使用MySQLConnector.GetInstance方法来获取MySQLConnector类的单例实例,并调用其方法来执行查询。例如:
MySQLConnector connector = MySQLConnector.GetInstance("localhost", "mydatabase", "username", "password");
connector.OpenConnection();
string query = "SELECT * FROM mytable";
DataTable dataTable = connector.ExecuteQuery(query);foreach (DataRow row in dataTable.Rows)
{Debug.Log(row["column1"] + " " + row["column2"]);
}connector.CloseConnection();
这段代码获取MySQLConnector类的单例实例,并使用适当的服务器、数据库、uid和密码值打开了数据库连接,在名为“mytable”的表上执行了一个SELECT查询,并为查询返回的每一行的“column1”和“column2”值打印到控制台。最后,它关闭了数据库连接。
完结
赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注
,以便我第一时间收到反馈,你的每一次支持
都是我不断创作的最大动力。点赞越多,更新越快哦!当然,如果你发现了文章中存在错误
或者有更好的解决方法
,也欢迎评论私信告诉我哦!
好了,我是向宇
,https://xiangyu.blog.csdn.net
一位在小公司默默奋斗的开发者,出于兴趣爱好,于是最近才开始自习unity。如果你遇到任何问题,也欢迎你评论私信找我, 虽然有些问题我可能也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
相关文章:

【unity小技巧】Unity 存储存档保存——PlayerPrefs、JsonUtility和MySQL数据库的使用
文章目录 前言PlayerPrefs一、基本介绍二、Demo三、优缺点 JsonUtility一、基本使用二、Demo三、优缺点 Mysql(扩展)完结 前言 游戏存档不言而喻,是游戏设计中的重要元素,可以提高游戏的可玩性,为玩家提供更多的自由和…...

2023-9-22 滑雪
题目链接:滑雪 #include <cstring> #include <algorithm> #include <iostream>using namespace std;const int N 310;int n, m; int h[N][N]; int f[N][N];int dx[4] {-1, 0, 1, 0}, dy[4] {0, 1, 0, -1};int dp(int x, int y) {int &v f…...

基于Yolov8的工业小目标缺陷检测(6):多检测头结合小缺陷到大缺陷一网打尽的轻量级目标检测器GiraffeDet,暴力提升工业小目标缺陷检测能力
💡💡💡本文改进:多头检测器结合大小缺陷一网打尽的GiraffeDet,进一步提升处理低分辨率图像和小物体等更困难的检测能力。 多头检测器+ GiraffeDet | 亲测在工业小目标缺陷涨点明显,原始mAP@0.5 0.679提升至0.734 收录专栏: 💡💡💡深度学习工业缺陷检测 :h…...

exe文件运行后无输出直接闪退如何找解决办法
一.搜索栏搜事件查看器 二.点开windows日志下的应用程序 三.找到错误处 四.搜索异常代码 点开有错误的详细信息,直接用搜索引擎搜索这个异常代码能大致判断是什么问题,给了一个解决思路,不至于不知道到底哪里出了问题...

OpenHarmony应用开发—ArkUI组件集合
介绍 本示例为ArkUI中组件、通用、动画、全局方法的集合。 效果预览 使用说明: 1.点击组件、通用、动画、全局方法四个按钮或左右滑动切换不同视图。 2.点击二级导航(如通用属性、通用事件等),若存在三级导航则展开三级导航&#…...

Linux(CentOS)安装msf
目录 一、安装MSF 1.1 在线安装 1.2 离线安装 二、安装Postgresql数据库 一、安装MSF 1.1 在线安装 需要挂梯子!挂完梯子需要reboot重启,多试几次就可以,国内网络我试了很久都不行。没条件没梯子的看1.2离线安装 cd /opt curl https://ra…...

工作几年还是悟不懂自动化测试的意义
【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) 有人问:自动化测试的成本高效果差,那么自动化测试的意义在哪呢? 我…...

Redis面试问题三什么是缓存雪崩怎么解决
定义 缓存雪崩是因为大量的key设置了同一过期时间的导致在同一时间类缓存同时过期,而这时因为请求过来已经没有缓存了,DB压力大数据库崩溃了。 解决方法 我可以在设置过期时间的时候加一个随机时间,在1-5分钟那样可以分散过期时间…...

【Unittest】自动化测试框架核心要素
【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程,刷完面试就稳了,你也可以当高薪软件测试工程师(自动化测试) 1、什么是Unittest框架? python自带一种单元测试框架 2、为什么使用UnitTest框架࿱…...

Hyperloglog
一,前言 在互联网行业中存在两个比较重要的指标:PV(页面访问量)和 UV(用户访问量) 如果有这样的一个业务: 统计PV,那么你会怎么做? 我们可以使用Redis的incr、incrby指…...

如何自动获取短信验证码?
点击下方关注我,然后右上角点击...“设为星标”,就能第一时间收到更新推送啦~~~ 这篇文章通过解决实际项目开发中遇到的如何自动获取短信验证码的问题,进一步讲述在Java中如何使用正则。 Java中如何使用正则 Java中正则相关类位于java.util.r…...

Linux 本地 Docker Registry本地镜像仓库远程连接【内网穿透】
Linux 本地 Docker Registry本地镜像仓库远程连接 文章目录 Linux 本地 Docker Registry本地镜像仓库远程连接1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址…...

基于Yolov8的工业小目标缺陷检测(4):SPD-Conv,低分辨率图像和小物体涨点明显
💡💡💡本文改进:SPD-Conv,处理低分辨率图像和小物体等更困难的任务时效果明显。 SPD-Conv | 亲测在工业小目标缺陷涨点明显,原始mAP@0.5 0.679提升至0.775 收录专栏: 💡💡💡深度学习工业缺陷检测 :http://t.csdn.cn/fVSgs ✨✨✨提供工业缺陷检测性能提升…...

平均精度(AP)
什么是平均精度(AP) 平均精度 (AP)并不是精度 (P)的平均值。 平均精度 (AP) 是按类别计算的。 mAP(mean average precision)是一个平均值,常用作目标检测中的检测精度指标mAP 指标通过对于一个平均目标来检测任务中多个目标所对应不同 AP&a…...

建议收藏《Verilog代码规范笔记_华为》(附下载)
华为verilog编程规范是坊间流传出来华为内部的资料,其贴合实际工作需要,是非常宝贵的资料,希望大家善存。至于其介绍,在此不再赘述,大家可看下图详细了解,感兴趣的可私信领取《Verilog代码规范笔记_华为》。…...

Nginx环境搭建、负载均衡测试
Nginx环境搭建、负载均衡测试 系统环境: win10,IDEA2020,JDK8 一、nginx环境搭建 1.ngxin下载 Nginx官网下载: http://nginx.org/en/download.html Nginx有三种版本,分别是Mainline version(开发版&…...

软件工程知识总结梳理
🔥🔥宏夏Coding网站,致力于为编程学习者、互联网求职者提供最需要的内容!网站内容包括求职秘籍,葵花宝典(学习笔记),资源推荐等内容。在线阅读:https://hongxiac.com&…...

Mybatis自动映射Java对象 与 MySQL8后的JSON数据
文章目录 Mybatis自动映射Java对象 与 MySQL8后的JSON数据1.转化成为正常Json类型1.1 JsonTypeHander1.2 ListJsonTypeHandler 负责List<T> 类型1.3 实体类1.4 mapper1.5 测试类 2. 存储为携带类型的Json Mybatis自动映射Java对象 与 MySQL8后的JSON数据 1.转化成为正常…...
【JavaScript】深拷贝和浅拷贝
在 JavaScript 中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象复制方法,它们涉及到如何复制对象的属性以及如何处理对象内部的嵌套引用。以下是它们的解释: 浅拷贝(S…...

【SLAM】10.纵观SLAM,对比方案和未来方向
"天下谁人配白衣” SLAM方案研究方向 SLAM方案 站在历史角度,看一下为SLAM的发展带来贡献的方案: 2007年—A.J.Davison—MonoSLAM 视觉SLAM的先驱,建立在EKF基础上,此前基本无法在线运行,意义较大;…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

MySQL:分区的基本使用
目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...