PlayerPrefs 类

简介

PlayerPrefs类是 Unity 给我们提供的内置的数据存储类,是以键值对的形式存储数据的(具体可以去Unity官网的文档中看:UnityEngine.PlayerPrefs - Unity 脚本 API),这里存储的数据是独立于游戏的,因此可以实现场景切换的数据保留。这里我的理解是,在场景切换的时候,我们的内存条会读取下一个场景,抛弃当前场景,因此所有变量会重置,比如人物的血条,当场景切换时,人物被重新加载,是无法保留血条数据的,所以我们不能将数据存在内存中,而是要把数据存到硬盘中,下面的静态函数就是做到了这一点,读取也是从硬盘中读取到内存中。(理解可能有误,欢迎批评指正)

常用的一些静态函数

使用实例

场景:我们假设这样一个熟悉的例子——角色血条(假设角色血量最高为100)。在这里,要求是在切换场景时,下一场景的初始血量要和上一场景的最后血量相等,简单来说,就是血量这个数据在场景之间可以传递。那么我们就用上面 Unity 给我们提供的 API 来写一下代码。

直接使用:如果你对这个场景的实现已经有了一定的想法,那么就直接用上面的静态方法就可以,我也将这个例子中最核心的代码写在下方。

// 存入数据(第一个参数 Blood 是你自己取的,主要目的就是标识数据,方便提取;第二个参数是在这个场景中的变量blood)
// 这里因为血量是 Int 型,所以用SetInt,如果是其他类型就要调用不同的函数哦!这样我们就将内存中的数据成功存入了硬盘中!
PlayerPrefs.SetInt("Blood",blood);
// 读取数据(上面存的这个标识,就可以拿到下面来读取数据了,我们就将硬盘中的数据成功拿到了内存中!)
blood = PlayerPrefs.GetInt("Blood");

--------------------------------------------------------分割线-------------------------------------------------------

浅浅分析一下:如果你对这个例子还没有什么思路,那我们就来简单分析一下这个场景。

1、什么时候需要保存血量?

答:当切换场景时需要保存血量,或者当我们保存退出一个游戏时。(当然保存退出不止要保存血量,还有各种角色的各种信息,所以这里我们只写第一种情况——切换场景保存血量)

2、什么时候需要读取血量?

答:当场景切换时,或者当游戏加载时需要读取血量,并且我们要将血量显示到 UI 上。

好的,那么我们就来写脚本吧。

首先是我们的角色脚本 PlayerMove:

private int blood; // 血量暂存变量
private Text Blood; // UI Text变量,用来显示信息到界面上
​
// Start 函数在每次场景切换时都会重新执行一次,那么场景切换后血量就会重新读取一次
void Start() {// 拿到 Unity 中的 BloodText(我这里只是一种方法,方法是很多的)Blood = GameObject.FindGameObjectWithTag("BloodText").GetComponent<Text>();// 进入游戏实例化对象后读取blood = PlayerPrefs.GetInt("Blood");// 显示到UI上Blood.text = blood.ToString();
}
​
// 接下去我们就可以根据角色的动作对 blood 进行各种操作了

现在产生了一个问题:我们刚上来就使用了 PlayerPrefs.GetInt("Blood") ,但是如果从来没有执行过 PlayerPrefs.SetInt("Blood"); 怎么办呢?这里我提供一个解决方案。

首先作为一个游戏,会有一个主菜单,主菜单上有个按钮,<开始新游戏>,那么我们就可以给这个开始新游戏的按钮的脚本上加上Set的代码,来进行游戏的血条初始化。代码如下:

// 按钮上挂载的方法
public void StartNewGame() {// 载入时初始化 BloodPlayerPrefs.SetInt("Blood", 100);// 加载场景SceneManager.LoadScene("Scene0");
}

好的解决了这个问题,那么接下去就是最后一步,场景切换时保存当前血量了。

场景切换的讲究

场景切换这边,其实也有点讲究,比如我们设计的是一个闯关类游戏,那么我们的场景就是线性的,就是一关接着一关,没有选择的余地;如果我们设计的是一个探索类游戏,那么一个场景可以根据选择的不同,跳转至多个场景,甚至可以回跳场景。那么可想而知,第二种情况会比第一种情况复杂很多,那么在这里我就讲一下两种情况的实现思路,并着重写一下第一种情况下场景切换保存血量的代码,如果同时也想要看第二种情况下保存数据,可以参考我的另一篇博客:【Unity】一个场景跳转到多个场景的解决方案

线性场景下的血量保存:

思路:由于场景的切换是线性的,所以我们无需考虑场景的名称等,只需要编排好场景的顺序(也就是索引),每次遇到门的时候,我们就跳转到下一个索引场景即可。那么这串代码,我们就可以写入角色 PlayerMove 的脚本中。

PlayerMove:

// 在上面PlayerMove代码的下面写
// 下面这个函数就是 当角色碰到门时,就保存血量,并加载下一个场景
private void OnTriggerEnter2D(Collider collision) {if(collision.tag == "Door") {// 获取当前场景的对象Scene scene = SceneManager.GetActiveScene();// 保存血量PlayerPrefs.SetInt("Blood", blood);// 加载下一个场景( 本场景的索引+1 就是下一个场景)SceneManager.LoadScene(scene.buildIndex + 1);}
}

非线性场景下的血量保存:

思路:如果场景切换是非线性的,那么我们就要去使用场景的名称来进行精准的切换了,因此把代码写在 角色的身上是不现实的,那将会造成角色身上代码的堆积,因此我们需要将代码挂载到门的上面,从而实现不同的门,使用不同代码,加载进不同的场景,具体的实现代码可以参考我上面给出的文章。

【Unity】场景切换保留数据的解决方案相关推荐

  1. 手把手教会你Unity场景切换进度条制作

    30秒教会你Unity场景切换进度条 首先问一个问题:为什么要用进度条,以及什么情况下才用进度条呢? 一. 创建游戏场景及搭建面板UI 二 .添加代码 (1)加载完成后进入场景完整代码 (2)加载完成 ...

  2. unity 场景切换fade的实现

    学习内容: unity 场景切换fade的实现 具体操作 1.创建canvas 2.canvas下面创建一个panel.image点击眼睛,选择square 添加group public Canvas ...

  3. 【转】 [Unity3D]手机3D游戏开发:场景切换与数据存储(PlayerPrefs 类的介绍与使用)...

    http://blog.csdn.net/pleasecallmewhy/article/details/8543181 在Unity中的数据存储和iOS中字典的存储基本相同,是通过关键字实现数据存储 ...

  4. 关于unity场景切换后模型变黑问题

    unity5系列的 点击window-lighting-setting 取消勾选自动烘焙(auto),将模式改为build, unity2017-以后 取消勾选后,点击Generate Lightin ...

  5. unity多个场景切换保存数据_Unity 场景间切换传递保存数据的方法

    单例模式 围内 保存用到的数据. 方法:创建一个GlobalObject,这个GlobalObject需要满足的条件如下: 在整个游戏中只有一个,并且是同一个 保证只被初始化一次 在任何脚本中都可以访 ...

  6. Unity 场景切换间的内存清理

    今天在看项目框架之时看到空场景清理内存的相关操作,有些不明,故查了资料,看到一篇文章,链接:https://gameinstitute.qq.com/community/detail/106992 U ...

  7. 主流大数据存储解决方案评析

    EMC Isilon:横向扩展 性能突出 大数据存储不是一类单独的产品,它有很多实现方式.EMC Isilon存储事业部总经理杨兰江概括说,大数据存储应该具有以下一些特性:海量数据存储能力,可轻松管理 ...

  8. Unity(13)-场景切换,保留资源

    文章目录 前言 其他介绍 上一篇笔记 一.项目结构 二.脚本 [1]. 场景切换 [2]. 资源保留 前言 在切换场景的时候会删除上一个场景的所有资源,所以需要给需要的游戏对象上挂载脚本,从而保留游戏 ...

  9. 【Unity3D 灵巧小知识点】 ☀️ | 切换场景后保留上个场景中的游戏物体不被销毁

    Unity 小科普 老规矩,先介绍一下 Unity 的科普小知识: Unity是 实时3D互动内容创作和运营平台 . 包括游戏开发.美术.建筑.汽车设计.影视在内的所有创作者,借助 Unity 将创意 ...

最新文章

  1. 安装PHP7.3.2make编译出现报错,内存不足导致,临时解决方法
  2. Git简介以及与SVN的区别
  3. 大盘点|YOLO 系目标检测算法总览
  4. 《Adobe Acrobat DC经典教程》—第1章1.11节在阅读模式下查看PDF文件
  5. 2015快捷键在哪里设置_炒股软件的选择通达信软件的基本设置
  6. 信息系统项目管理师为什么不建议自学
  7. 什么是formal method的invarient
  8. Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler
  9. spring-boot基础概念与简单应用
  10. 第10组-通信2班-011-抓包分析
  11. 清理神器CleanMyMac 6.18“粽”级优惠
  12. Android 系统(44)---多语言
  13. Flutter 开源社交电商项目Flutter_Mycommunity_App
  14. 使用Advanced Installer制作IIS安装包(一:配置IIS和Web.config)
  15. css3中-moz、-ms、-webkit、-o分别代表的意思
  16. #Cprove7-9 函数应用
  17. c语言课设菜单,c语言课程设计菜单
  18. 1.2.1 python中的函数
  19. Linux socket网络编程实现FTP服务器
  20. Arduino基础入门篇17—四位数码管的驱动

热门文章

  1. [vijos] 遭遇战
  2. ubuntu18.04安装bazel
  3. HTML——基础知识点总结
  4. 数据库课设----新型药店管理系统
  5. 计算机专业浪漫告白,不同专业的人怎样“表白”?化学系最浪漫,计算机系“活该”单身...
  6. 原淘宝 npm 域名即将停止解析,请切换至新域名(npm无响应)
  7. 2014.09.13 周六-html-xhtml-正则表达式-html总结-css
  8. README规范总结
  9. 国际化开发的各国语言标识(i18n)
  10. 新势力 | 赛宁工控安全产品体系——护航工业网络安全