【unity】学习制作2D横板冒险游戏-9-

人物数值和场景的保存加载

保存完人物的坐标后,还应保存的东西还有很多,例如人物的血量,当前的场景等等
首先是血量,数据类型应该是浮点数

对于这种类型,我们可以存储血量和能量,如何区分血量和能量呢
直接命名时进行区分就好了

能量条同理

读取代码如图

在读取时也要通知UI更新

经测试,血量和能量条保存成功

场景保存

要保存场景,就要添加一个新的场景的保存类型,但是场景的类型是什么呢
我们可以保存当前场景的名字,并将场景转换为String类型,加载时让SceneLoader脚本重新加载场景
加载场景名字为string类型

序列化转换
JsonUtility是Unity引擎提供的一个用于处理JSON数据的工具类,它包含ToJsonFromJson两个静态方法。ToJson方法的作用是将一个对象序列化为JSON格式的字符串。

再转换回场景
方法名称为 GetSavedScene,返回值类型是 GameSceneSO
使用 ScriptableObject.CreateInstance<GameSceneSO>() 创建了一个 GameSceneSO 的新实例,赋值给变量 newScene。调用了 JsonUtility.FromJsonOverwrite(sceneToSave, newScene),将存储在 sceneToSave(一个 JSON 格式的字符串)中的数据反序列化并覆盖到newScene对象上。sceneToSave 是一个包含场景数据的 JSON 字符串。JsonUtility.FromJsonOverwrite 是 Unity 提供的 JSON 工具,用于将 JSON 数据直接写入到已有的对象中。
返回结果:将反序列化后的 newScene 6对象返回。

在对应脚本中添加接口

注册注销

获取ID

安装ID脚本

保存的代码如下,直接运行data中封装的函数,由Data进行序列化转换
工厂模式:将对象的创建过程交给专门的工厂类Data处理,sceneLoader只需声明所需产品类型,无需关心具体实现细节。

读取的代码
读取时检测人物的ID就好

完成,经测试,修改场景后能够返回存储点

结束界面

在UI画布创建一个Panel

容器功能:
Panel可以作为其他UI元素的容器,如按钮、文本、图像等。它可以帮助你组织和布局UI,使界面更加清晰和易于管理。
背景和装饰:
Panel可以设置背景颜色、图像或材质,为其内部的UI元素提供一个背景或装饰效果。这可以增强UI的视觉吸引力,使其更加美观和专业。
裁剪和遮罩:
通过设置Panel的裁剪模式,可以实现对其内部UI元素的裁剪效果。例如,可以使用矩形裁剪或圆形裁剪来显示特定形状的区域,或者使用遮罩效果来隐藏部分UI元素。
层级管理:
Panel可以帮助管理UI元素的层级关系。通过将不同的UI元素放置在不同的Panel中,可以轻松地控制它们的显示顺序和遮挡关系。

将自带的图片删掉确保能完整的覆盖屏幕

创建文字

创建两个按钮

人物死亡后开启该面板

重新开始按钮事件如下

由DataManager执行,监听事件

注册事件

重新开始并加载场景后关闭面板

获得组件

在创建一个事件用来重新启动面板

事件注册

当该事件启动时,即游戏结束了,启动该面板

设置当前的游戏对象为该按钮(这样直接回车默认就是重新开始游戏)

创建游戏结束的事件(无返回值Void类型)

直接人物死了之后GAME OVER(可以把之前启动面板的事件删掉

实例化

默认将面板关掉,运行游戏

经测试,遇到两个问题

1)如果不存档被击败后,点击重新开始会出现实例化为空的问题

2)存档并重新开始后人物倒地不起

第一个问题的解决方式就是,优化地图逻辑,让人物开局进行存档

第二个问题的解决方式,在人物状态脚本监听重新开始的事件,将状态改为未死亡

注册事件和执行方法

经测试,问题解决

返回菜单按钮事件如下

添加事件

在场景加载中监听该事件

注册注销和方法

实例化

同样调用一下事件,关闭窗口

实例化

在调用一下事件让人物恢复状态

实例化

经测试,还是会出现如下问题
点击离开后,画面并没有关闭,且人物依旧倒地

在多次点击离开后,界面关闭,但是并没有回到最初的场景

代码错综复杂,用Debug进行问题的排除
在游戏结束时宣布死亡,在关闭界面时宣布关闭

经测试,在人物死亡后依然会受到伤害并且持续调用事件使GamOver界面打开,而关闭事件只执行一次因此,造成了需要点击多次才能关闭的局面

直接在死亡后将碰撞检测取消

经测试,这样会让人物的Rigidbody同步取消从而“掉入深渊”
进行第二种修改:在伤害检测时都是基于Player层级进行的伤害判断,因此,直接将人物的层级进行修改,使其不再参与伤害的计算

在代码中添加该层级的不会受伤的特性

成功,在死亡后只会受到一次伤害

复活后将层级修改过来

层级执行太快还是会出现之前重复打开的问题,最后执行改变图层

还是会出现问题,放在场景加载中执行

成功,现在只执行了一次,点一下离开就正常回到了菜单界面
但是场景并没有回到菜单场景

再次进行Debug,看看到达了哪个场景

确实回到了菜单场景

似乎是位置出现了问题

再debug一下人物的位置

与菜单中人物位置不符合

应该使用MenuPosition

修改代码

运行测试,成功回到了正确的位置

将debug语句删除

菜单的继续游戏按钮

给菜单的继续游戏按钮添加事件

测试流程如下:新的开始进入游戏 => 存档 => 死亡 => 回到菜单 => 继续游戏

成功!人物返回了存档点
但是游戏数据没有持久化,退出游戏后继续游戏无法回来

posted @ 2025-03-29 15:39  plusu  阅读(90)  评论(0)    收藏  举报