Unity备忘录模式

在游戏开发中,我们经常会遇到这样的需求:
在某个时间点保存角色的状态,并在之后将状态恢复回来

比如角色死亡后的复活点、检查点回溯、撤销操作,或是玩家手动存档与读档。

如果我们直接在代码里到处拷贝和还原数据,不仅逻辑分散,还容易破坏角色自身的封装性。
备忘录模式(Memento Pattern) 提供了一种更加安全、清晰的方式:

在不暴露对象内部实现的前提下,将状态"封存"为快照,并在需要时进行恢复。

下面通过一个简单的 Unity 示例,演示如何使用备忘录模式保存和恢复玩家的位置。

1.数据快照

定义你需要保存的数据类型。

cs 复制代码
public class Memento
{
    public float PositionX { get; }
    public float PositionY { get; }

    public Memento(float x, float y)
    {
        PositionX = x;
        PositionY = y;
    }
}

2.数据管理类

也叫做数据的看管者,当你有多分数据快照需要保存的时候这里可以存着。

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//看管者
public class SaveManager
{
    public Memento LastSave;
}

3.使用

这里写的是按下S保存玩家的位置,按下L读取保存的位置。

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public float postoin_x = 0f;
    public float postoin_Y = 0f;
    SaveManager manager;
    void Start() 
    {
        manager = new SaveManager();
    }
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.S)) 
        {
            manager.LastSave = SavePosition();
        }
        if (Input.GetKeyDown(KeyCode.L))
        {
            LoadPosition(manager.LastSave);
        }
    }
    public Memento SavePosition()
    {
        postoin_x = transform.position.x;
        postoin_Y = transform.position.y;
        //PlayerPrefs.SetFloat("postoin_x", postoin_x);
        //PlayerPrefs.SetFloat("postoin_Y", postoin_Y);//数据持久化操作,可选择
        Debug.Log("数据保存成功");
        return new Memento(postoin_x, postoin_Y);
    }
    public void LoadPosition(Memento memento)
    {
        float newpos_x = memento.PositionX;
        float newpos_y = memento.PositionY;
        Debug.Log("数据读取成功");
        transform.position = new Vector3(newpos_x, newpos_y, 0f);
    }
}

4.运行游戏

将玩家脚本加到场景中的一个方块上,然后按下S,看见左下角打印了数据保存成功。

做拽玩家到左上角。

按下L键,发现打印了数据读取成功,并且玩家也移动到了之前保存的位置。

5.总结

备忘录模式可以用来保存玩家在某一时刻的状态,比如玩家摔下悬崖死亡时,记录他最后一次离开地面的位置信息,用于复活时还原;也可以提前定义一份初始状态,作为玩家复活或重开的默认数据。除此之外,在玩家按下某个按键时保存背包数据、等级信息等,也同样适合使用备忘录模式,从而让玩家在下次进入游戏时能够继续之前的进度。

相关推荐
JAVA面经实录91712 小时前
Java企业级工程化·终极完整版背诵手册(无遗漏、全覆盖、面试+落地通用)
java·开发语言·面试
许彰午14 小时前
CacheSQL(二):主从复制——OpLog 环形缓冲区与故障自动恢复
java·数据库·缓存
Bat U15 小时前
JavaEE|多线程初阶(七)
java·开发语言
郝学胜-神的一滴17 小时前
罗德里格斯旋转公式(Rodrigues‘ Rotation Formula)完整推导
c++·unity·godot·图形渲染·three.js·unreal
掌心向暖RPA自动化18 小时前
如何获取网页某个元素在屏幕可见部分的中心坐标影刀RPA懒加载坐标定位技巧
java·javascript·自动化·rpa·影刀rpa
日取其半万世不竭18 小时前
Minecraft Java版社区服务器搭建教程(Linux,适合新手)
java·linux·服务器
TeamDev18 小时前
JxBrowser 9.0.0 版本发布啦!
java·前端·混合应用·jxbrowser·浏览器控件·跨平台渲染·原声输入
AI人工智能+电脑小能手19 小时前
【大白话说Java面试题】【Java基础篇】第24题:Java面向对象有哪些特征
java·开发语言·后端·面试
AI人工智能+电脑小能手19 小时前
【大白话说Java面试题】【Java基础篇】第25题:JDK1.8的新特性有哪些
java·开发语言·后端·面试
likerhood19 小时前
SLF4J: Failed to load class “StaticLoggerBinder“ 解决
java·log4j·maven