Unity_数据持久化_PlayerPrefs基础

Unity数据持久化

一、数据持久化基础概念

1.1 什么是数据持久化

定义:
数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。

通俗解释:
将游戏数据存储到硬盘,硬盘中数据读取到游戏中,也就是传统意义上的存盘。

核心概念:

  • 内存数据模型:游戏运行时在内存中的数据
  • 存储模型:保存在硬盘上的数据格式
  • 转换过程:序列化和反序列化

1.2 数据持久化的作用

1. 游戏进度保存

  • 保存玩家游戏进度
  • 记录关卡完成状态
  • 存储角色属性数据

2. 用户设置保存

  • 保存游戏设置选项
  • 记录用户偏好设置
  • 存储界面配置信息

3. 数据统计分析

  • 记录游戏统计数据
  • 保存用户行为数据
  • 用于游戏优化分析

1.3 Unity中的数据持久化方式

1. PlayerPrefs

  • 适合存储简单数据
  • 键值对存储方式
  • 自动加密存储

2. JSON序列化

  • 适合复杂数据结构
  • 可读性强的文本格式
  • 跨平台兼容性好

3. XML序列化

  • 结构化数据存储
  • 支持复杂数据类型
  • 可扩展标记语言

4. 二进制序列化

  • 存储效率高
  • 数据安全性好
  • 文件体积小

二、PlayerPrefs

2.1 PlayerPrefs基础概念

什么是PlayerPrefs:
PlayerPrefs是Unity自带的类,用于保存和读取玩家设置。它是Unity提供的最简单的数据持久化解决方案。

特点:

  • 键值对存储方式
  • 支持三种基本数据类型
  • 自动加密存储
  • 跨平台兼容性好

2.2 PlayerPrefs常用方法

1. 数据类型支持
PlayerPrefs只提供了三个数据类型的存取方法:

// 浮点数类型
PlayerPrefs.SetFloat(string key, float value);
PlayerPrefs.GetFloat(string key, float defaultValue);// 整数类型  
PlayerPrefs.SetInt(string key, int value);
PlayerPrefs.GetInt(string key, int defaultValue);// 字符串类型
PlayerPrefs.SetString(string key, string value);
PlayerPrefs.GetString(string key, string defaultValue);

2. 数据保存机制

// 重要:直接调用Set相关方法,只会把数据存到内存中,不会保存到本地
PlayerPrefs.SetInt("score", 100);// 当游戏结束时,Unity会自动把内存中的数据保存到本地
// 但是如果游戏不是正常结束,而是被强制退出,那么内存中的数据不会被保存到本地// 手动保存:只要调用了Save方法,那么内存中的数据就会被保存到本地
PlayerPrefs.Save();

3. 数据读取机制

// 运行时调用了Get相关方法,只要Set相关方法被调用过,就可以得到数据
int score = PlayerPrefs.GetInt("score");// 如果没有调用过Set相关方法,那么Get相关方法会返回默认值
int defaultValue = PlayerPrefs.GetInt("notExistKey"); // 返回0// Get方法还有一个重载,如果没有Set过可以手动设置默认值
int customDefault = PlayerPrefs.GetInt("notExistKey", 100); // 返回100

4. 数据删除方法

// 删除所有数据
PlayerPrefs.DeleteAll();// 删除指定数据
PlayerPrefs.DeleteKey("intKey");

2.3 PlayerPrefs数据存储位置

重要说明:
PlayerPrefs数据的存储位置因平台而异,不同操作系统有不同的存储方式。

Windows平台存储位置:

#region Windows
// PlayerPrefs数据存储在Windows注册表中
// 存储路径:HKCU\Software\[公司名称]\[产品名称]
// 其中[公司名称]和[产品名称]是在Unity的"Project Settings"中设置的名称// 查看方法:
// 运行 regedit
// HKEY_CURRENT_USER
// SOFTWARE
// Unity
// UnityEditor
// [公司名称]
// [产品名称]
#endregion

各平台存储位置对比:

平台存储位置说明
Windows注册表HKCU\Software\[公司名称]\[产品名称]
macOS属性列表文件~/Library/Preferences/[公司名称].[产品名称].plist
Linux配置文件~/.config/[公司名称]/[产品名称]
AndroidSharedPreferences/data/data/[包名]/shared_prefs/
iOSNSUserDefaults应用沙盒内的plist文件

查看存储数据的方法:

1. Windows平台:

// 使用注册表编辑器查看
// 1. 按Win+R,输入regedit
// 2. 导航到:HKEY_CURRENT_USER\SOFTWARE\Unity\UnityEditor\[公司名称]\[产品名称]
// 3. 可以看到所有保存的键值对

2. 其他平台:

// macOS: 使用Finder查看 ~/Library/Preferences/ 文件夹
// Linux: 查看 ~/.config/ 目录下的配置文件
// Android: 使用ADB工具查看 /data/data/[包名]/shared_prefs/
// iOS: 在Xcode中查看应用沙盒内的plist文件

项目设置影响:

// Unity项目设置中的公司名称和产品名称决定了存储路径
// Edit -> Project Settings -> Player
// Company Name: 公司名称
// Product Name: 产品名称// 例如:
// Company Name: "MyGameStudio"
// Product Name: "MyGame"
// Windows存储路径:HKCU\Software\MyGameStudio\MyGame

2.4 PlayerPrefs数据唯一性

核心概念:
PlayerPrefs中不同数据的唯一性是由key决定的,不同的key决定了不同的数据。

重要警告:
同一项目中如果不同数据key相同会造成数据丢失。

解决方案:
要保证数据不丢失就要建立一个保证key唯一的规则。

通过合理使用PlayerPrefs,可以为游戏提供基础的数据持久化功能,特别适合存储简单的用户设置和游戏进度数据。

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

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

相关文章

什么是列存储(Columnar Storage)?深度解析其原理与应用场景

列存储的基本概念:颠覆传统的数据组织方式列存储(Column Storage)是一种革命性的数据库存储技术,它通过按列而非按行组织数据,从根本上改变了数据的物理存储结构。与传统行存储数据库不同,列式数据库将每一…

机器人抓取流程介绍与实现——机器人抓取系统基础系列(七)

机器人抓取系统基础系列文章目录 1. UR机械臂的ROS驱动安装官方教程详解——机器人抓取系统基础系列(一) 2. MoveIt控制机械臂的运动实现——机器人抓取系统基础系列(二) 3. 机器人(机械臂)的相机选型与安装…

【Qt】QObject::startTimer: Timers cannot be started from another thread

QTimer对象的 start 函数调用必须和创建QTimer对象是同一个线程。 #include "QtTimerTest.h" #include <QDebug>QtTimerTest::QtTimerTest(QWidget *parent): QMainWindow(parent),m_timer(nullptr),m_timerThread(nullptr), m_workingThread(nullptr) {ui.set…

社会治安满意度调查:为城市安全治理提供精准参考(满意度调查公司)

在社会治理不断深化的背景下&#xff0c;公众对社会治安的感知与评价已成为衡量城市治理水平的重要维度&#xff08;社会治安满意度调查&#xff09;&#xff08;公众满意度调查&#xff09;&#xff08;满意度调查&#xff09;。为全面掌握市民对治安状况的真实反馈&#xff0…

Python篇--- Python 的加载、缓存、覆盖机制

要理解 import 与 if __name__ "__main__": 的关系&#xff0c;以及 Python 的加载、缓存、覆盖机制&#xff0c;我们可以从 “模块的两种身份” 和 “导入的全过程” 入手&#xff0c;用通俗的例子一步步拆解。一、核心&#xff1a;模块的 “双重身份” 与 __name_…

Java设计模式之行为型模式(访问者模式)应用场景分析

访问者模式&#xff08;Visitor Pattern&#xff09;作为Java设计模式中的“隐形冠军”&#xff0c;常被开发者低估其价值。这一模式通过“双分派”机制巧妙解耦数据结构与操作&#xff0c;为复杂系统的扩展提供了强大武器。在大厂项目中&#xff0c;访问者模式往往出现在业务逻…

【IDEA】JavaWeb自定义servlet模板

方法一&#xff1a;&#xff08;推荐去使用方法二&#xff0c;还能创建其它代码模板&#xff09;使用servlet模板创建Servlet类如果创建时找不到servlet模板&#xff1a;File -> Project Structure然后应用 -> OK&#xff0c;如果还是找不到Servlet模板&#xff0c;看看项…

Linux选择

在内存中运行着的进程称为&#xff08; 服务 &#xff09;。负责控制systemd系统和服务管理器的工具为&#xff08; systemctl &#xff09;命令。systemd管理系统服务的基本单位是&#xff08; unit &#xff09;。分配和管理资源的基本单位是&#xff08; 进程 &#xf…

【Redis学习路|第一篇】初步认识Redis

概要: 深入探讨NoSQL数据库的核心特性&#xff0c;对比传统关系型数据库的差异&#xff0c;重点介绍Redis作为内存数据库的优势与应用场景。 文章目录认识 NoSQLNoSQL vs SQL 对比1️⃣ 结构化 vs 非结构化2️⃣ 关联 vs 非关联3️⃣ 查询方式对比4️⃣ 事务特性5️⃣ 存储方式…

java局域网聊天室小项目架构思路

java局域网聊天室小项目架构思路 项目需求 创建一个局域网聊天系统&#xff0c;要求&#xff1a;用户在登录界面登录后进入聊天窗口界面&#xff0c;能实现多用户同时在线聊天&#xff0c;并且用户之间可以进行私聊 项目用到的技术栈 java网络编程java多线程java面向对象编…

vulhub-corrosion2靶机

1.安装靶机 https://download.vulnhub.com/corrosion/Corrosion2.ovahttps://download.vulnhub.com/corrosion/Corrosion2.ova 2.扫描IP 3.扫描端口 4.访问端口 首先访问一下80端口 访问一个8080端口发现是一个apache的页面 5.扫描目录与漏洞探测 那么我们扫描一下目录 80…

Mysql深入学习:慢sql执行

目录 慢查询日志 慢查询主要步骤 11种慢查询的场景分析 场景一&#xff1a;SQL 没有建立索引 场景二&#xff1a;索引未生效的典型原因 场景三&#xff1a;LIMIT 深分页导致性能下降 场景四&#xff1a;单表数据量过大导致 SQL 性能下降 场景五&#xff1a;ORDER BY 出现…

李宏毅深度学习教程 第8-9章 生成模型+扩散模型

【2025版】12 生成式对抗网络GAN 一 – 基本概念介紹_哔哩哔哩_bilibili 目录 1. GAN生成式对抗网络 2. GAN的训练 散度差异 3.WGAN 4.训练GAN 5. 如何客观评估GAN 6. 条件型生成&#xff08;按照要求&#xff09; 7. Cycle GAN&#xff08;互转配对&#xff09; 8. d…

1.8 axios详解

Axios的定义与核心特性Axios是一个基于Promise的现代化HTTP客户端库&#xff0c;主要用于在浏览器和Node.js 环境中发送HTTP请求&#xff0c;旨在简化异步数据交互流程。其核心特性如下&#xff1a;跨平台支持&#xff1a;在浏览器中通过XMLHttpRequest对象发送请求&#xff0c…

41.安卓逆向2-frida hook技术-过firda检测(五)-利用ida分析app的so文件中frida检测函数过检测

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 工具下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwdzy89 提取码&#xff1…

安卓调javaScript Not find method “forceLogout“ implementatidsignature or namesp

核对一下是否实现对应的javaScript或者javaScript的方法参数对不对&#xff0c; 在这里插入图片描述我这里一开始实现了这个方法但是没有给参数&#xff0c;一直报异常&#xff0c;后台说token没给就查token的问题&#xff0c;最后发现是搞偏了&#xff0c;两个原因&#xff0c…

【Linux网络】:UDP(传输层协议)

目录 一、铺垫知识 1、传输层 2、端口号 2.1、五元组表示 一个进程通信 2.2、端口号范围划分 2.3、知名端口 2.4、查看端口号 2.5、问题 3、pidof & netstat 命令 ①netsate 命令 ②pidof命令 二、UDP协议 1、UDP协议格式 2、UDP报文 1.1、UDP数据封装的过…

Effective C++ 条款19: 设计class犹如设计type

Effective C 条款19&#xff1a;设计class犹如设计type核心思想&#xff1a;设计新的class时&#xff0c;应当像语言设计者设计内置类型一样慎重&#xff0c;考虑对象的创建、销毁、初始化、拷贝、类型转换等所有方面。 ⚠️ 1. 类设计的关键问题域 对象生命周期管理&#xff1…

《汇编语言:基于X86处理器》第11章 MS-Windows编程(3)

本章展示的是如何用32 位Microsoft Windows API进行控制台窗口编程。应用编程接口(API:ApplicationProgramming Interface)是类型、常数和函数的集合体&#xff0c;它提供了一种用计算机代码操作对象的方式。本章将讨论文本I/O、颜色选择、时间与日期、数据文件I/O&#xff0c;…

在 macOS 上通过 Docker 部署DM8 (ARM 架构)

概述 达梦数据库 (DM8) 无法直接在 Apple macOS 操作系统上原生安装&#xff0c;通常需要通过虚拟机&#xff08;如 Parallels Desktop、VMware Fusion&#xff09;进行部署。另一种更轻量级且受 macOS 支持的方案是利用 Docker 容器技术来构建开发与测试环境。本文档将详细介…