Unity3D仿星露谷物语开发56之保存角色位置到文件

article/2025/6/19 6:00:12

1、目标

游戏中通过Save Game保存角色位置,当重启游戏后,通过Load Game可以恢复角色的位置。

2、Player对象操作

(1)组件添加

给Hierarchy下的Player组件添加Generate GUID组件。

(2)修改SceneSave.cs脚本

添加2行代码:

using System.Collections.Generic;[System.Serializable]public class SceneSave
{public Dictionary<string, bool> boolDictionary; // string key is an identifier name we choose for this listpublic Dictionary<string, string> stringDictionary; public Dictionary<string, Vector3Serializable> vector3Dictionary; // 可以保存角色位置// string key is an identifier name we choose for this listpublic List<SceneItem> listSceneItem;public Dictionary<string, GridPropertyDetails> gridPropertyDetailsDictionary; // key是坐标信息,value是地面属性信息
}

(3)修改Settings.cs脚本

添加PersistentScene的常量,因为Player是在该Scene下。

添加1行代码如下:

(4)修改Player.cs脚本

添加以下代码:

using System;
using UnityEngine.SceneManagement;

修改Player类继承自ISaveable:

接下来就是实现ISaveable定义的属性。

    private string _iSaveableUniqueID;public string ISaveableUniqueID { get { return _iSaveableUniqueID; } set { _iSaveableUniqueID = value; } }private GameObjectSave _gameObjectSave;public GameObjectSave GameObjectSave { get { return _gameObjectSave; } set { _gameObjectSave = value; } }

在Awake方法中添加属性的初始化:

在OnDisable和OnEnable中各添加一个步骤:

添加这7个方法的实现:

public void ISaveableRegister()
{SaveLoadManager.Instance.iSaveableObjectList.Add(this);
}public void ISaveableDeregister()
{SaveLoadManager.Instance.iSaveableObjectList.Remove(this);
}public GameObjectSave ISaveableSave()
{// Delete saveScene for game object if it already existsGameObjectSave.sceneData.Remove(Settings.PersistentScene);// Create saveSave for game objectSceneSave sceneSave = new SceneSave();// Create Vector3 DictionarysceneSave.vector3Dictionary = new Dictionary<string, Vector3Serializable>();// Create String DictionarysceneSave.stringDictionary = new Dictionary<string, string>();  // Add Player position to Vector3 dictionaryVector3Serializable vector3Serializable = new Vector3Serializable(transform.position.x, transform.position.y, transform.position.z);sceneSave.vector3Dictionary.Add("playerPosition", vector3Serializable);// Add Current Scene Name to string dictionarysceneSave.stringDictionary.Add("currentScene", SceneManager.GetActiveScene().name);// Add Player Direction to string dictionarysceneSave.stringDictionary.Add("playerDirection", playerDirection.ToString());// Add sceneSave data for player game objectGameObjectSave.sceneData.Add(Settings.PersistentScene, sceneSave);return GameObjectSave;
}public void ISaveableLoad(GameSave gameSave)
{if(gameSave.gameObjectData.TryGetValue(ISaveableUniqueID, out GameObjectSave gameObjectSave)){// Get save data dictionary for sceneif(gameObjectSave.sceneData.TryGetValue(Settings.PersistentScene, out SceneSave sceneSave)){// Get player positionif(sceneSave.vector3Dictionary != null && sceneSave.vector3Dictionary.TryGetValue("playerPosition", out Vector3Serializable playerPosition)){transform.position = new Vector3(playerPosition.x, playerPosition.y, playerPosition.z);}// Get string dictionaryif(sceneSave.stringDictionary != null){// Get player sceneif(sceneSave.stringDictionary.TryGetValue("currentScene", out string currentScene)){SceneControllerManager.Instance.FadeAndLoadScene(currentScene, transform.position);}// Get player directionif(sceneSave.stringDictionary.TryGetValue("playerDirection", out string playerDir)){bool playerDirFound = Enum.TryParse<Direction>(playerDir, true, out Direction direction);if (playerDirFound){playerDirection = direction;SetPlayerDirection(playerDirection);}}}}}
}public void ISaveableStoreScene(string sceneName)
{// Nothing required here since the player is on a persistent scene;
}public void ISaveableRestoreScene(string sceneName)
{// Nothing required here since the player is on a persistent scene;
}private void SetPlayerDirection(Direction playerDirection)
{switch(playerDirection){case Direction.up:// set idle up triggerEventHandler.CallMovementEvent(0f, 0f, false, false, false, false, ToolEffect.none, false, false, false, false, false, false, false, false,false, false, false, false, false, false, false, false, true, false, false, false);break;case Direction.down:// set idle down triggerEventHandler.CallMovementEvent(0f, 0f, false, false, false, false, ToolEffect.none, false, false, false, false, false, false, false, false,false, false, false, false, false, false, false, false, false, true, false, false);break;case Direction.left:EventHandler.CallMovementEvent(0f, 0f, false, false, false, false, ToolEffect.none, false, false, false, false, false, false, false, false,false, false, false, false, false, false, false, false, false, false, true, false);break;case Direction.right:EventHandler.CallMovementEvent(0f, 0f, false, false, false, false, ToolEffect.none, false, false, false, false, false, false, false, false,false, false, false, false, false, false, false, false, false, false, false, true);break;default:// set idle down triggerEventHandler.CallMovementEvent(0f, 0f, false, false, false, false, ToolEffect.none, false, false, false, false, false, false, false, false,false, false, false, false, false, false, false, false, false, true, false, false);break;}
}

3、运行游戏

角色种植了Crop,然后进入另一个Scene后,选择Save Game。

重启游戏后,选择 Load Game,此时:

1)角色在另一个Scene中,并且direction保持一直

2)之前种植的Crop状态未变化


http://www.hkcw.cn/article/DwxbDHYdVg.shtml

相关文章

AI书签管理工具开发全记录(八):Ai创建书签功能实现

文章目录 AI书签管理工具开发全记录&#xff08;八&#xff09;&#xff1a;AI智能创建书签功能深度解析前言 &#x1f4dd;1. AI功能设计思路 &#x1f9e0;1.1 传统书签创建的痛点1.2 AI解决方案设计 2. 后端API实现 ⚙️2.1 新增url相关工具方法2.1 创建后端api2.2 创建crea…

【计算机网络】第3章:传输层—概述、多路复用与解复用、UDP

目录 一、概述和传输层服务 二、多路复用与解复用 三、无连接传输&#xff1a;UDP 四、总结 &#xff08;一&#xff09;多路复用与解复用 &#xff08;二&#xff09;UDP 一、概述和传输层服务 二、多路复用与解复用 三、无连接传输&#xff1a;UDP 四、总结 &#xff08…

leetcode hot100刷题日记——30.两数之和

解答&#xff1a; 方法一&#xff1a;迭代 迭代大致过程就是&#xff1a; 算两条链表的当前位的和&#xff0c;加上上一位留下来的进位&#xff0c;就是新链表的当前位的数字。计算当前的进位。 这样&#xff0c;我们迭代需要的东西是&#xff1a;链表1&#xff0c;链表2&…

飞腾D2000与FPGA结合的主板

UD VPX-404是基于高速模拟/数字采集回放、FPGA信号实时处理、CPU主控、高速SSD实时存储架构开发的一款高度集成的信号处理组合模块&#xff0c;采用6U VPX架构&#xff0c;模块装上外壳即为独立整机&#xff0c;方便用户二次开发。 UD VPX-404模块的国产率可达到100%&#xff0…

Baklib知识中台驱动服务升级

知识中台架构升级路径 在数字化转型背景下&#xff0c;Baklib通过重构知识中台的技术底座与服务体系&#xff0c;形成了分层解耦的模块化架构。该架构以四库体系为核心支撑&#xff0c;通过分布式存储引擎与语义分析算法的深度耦合&#xff0c;实现了多源异构数据的标准化接入…

NHANES指标推荐:ALI

文章题目&#xff1a;A cross-sectional study examining the relationship between the advanced lung cancer inflammation index and prostate cancer 中文标题&#xff1a;一项检查晚期肺癌炎症指数与前列腺癌之间关系的横断面研究 发表杂志&#xff1a;Journal of Health…

Python训练打卡Day38

Dataset和Dataloader类 知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 在遇到大规模数据集时&#xff0c;显存常常无法一次性存储所有数据&#xff0c;所以需要使用分批训练的…

leetcode付费题 353. 贪吃蛇游戏解题思路

贪吃蛇游戏试玩:https://patorjk.com/games/snake/ 问题描述 设计一个贪吃蛇游戏,要求实现以下功能: 初始化游戏:给定网格宽度、高度和食物位置序列移动操作:根据指令(上、下、左、右)移动蛇头规则: 蛇头碰到边界或自身身体时游戏结束(返回-1)吃到食物时蛇身长度增加…

NLP学习路线图(十三):正则表达式

在自然语言处理&#xff08;NLP&#xff09;的浩瀚宇宙中&#xff0c;原始文本数据如同未经雕琢的璞玉。而文本预处理&#xff0c;尤其是其中至关重要的正则表达式技术&#xff0c;正是将这块璞玉转化为精美玉器的核心工具集。本文将深入探讨正则表达式在NLP文本预处理中的原理…

【算法】动态规划

一、动态规划的基本思想 动态规划算法与分治法类似&#xff0c;其基本思想也是将待求解的较大规模问题分解为若干个较小的子问题&#xff0c;先求解子问题&#xff0c;再从这些子问题的解得到原问题的解。 但动态规划法有自己的特点。分治法的子问题相互独立&#xff0c;适合动…

设计模式——原型设计模式(创建型)

摘要 本文详细介绍了原型设计模式&#xff0c;这是一种创建型设计模式&#xff0c;通过复制现有对象&#xff08;原型&#xff09;来创建新对象&#xff0c;避免使用new关键字&#xff0c;可提高性能并简化对象创建逻辑。文章阐述了其优点&#xff0c;如提高性能、动态扩展和简…

java程序从服务器端到Lambda函数的迁移与优化

source&#xff1a;https://www.jfokus.se/jfokus24-preso/From-Serverful-to-Serverless-Java.pdf 从传统的服务器端Java应用&#xff0c;到如今的无服务器架构。这不仅仅是技术名词的改变&#xff0c;更是开发模式和运维理念的一次深刻变革。先快速回顾一下我们熟悉的“服务…

57、IdentityServer4概述

IdentityServer4是一个基于ASP.NET Core的开源身份认证和授权框架&#xff0c;实现了OpenID Connect和OAuth 2.0协议。它为现代应用程序提供集中式的身份验证和授权服务&#xff0c;支持单点登录&#xff08;SSO&#xff09;、令牌颁发与验证、会话管理等功能&#xff0c;广泛应…

2025.5.29 学习日记 docker概念以及基本指令

Docker&#xff1a; Docker 是一种开源的容器化平台&#xff0c;用于快速部署应用程序&#xff0c;实现开发、测试和生产环境的一致性。 一、Docker 核心概念 镜像&#xff08;Image&#xff09; 只读的模板文件&#xff0c;用于创建容器&#xff0c;类似虚拟机的镜像&#x…

AI与智能驾驶的关系和原理:技术融合与未来展望-优雅草卓伊凡一、AI大模型基础原理与智能驾驶

AI与智能驾驶的关系和原理&#xff1a;技术融合与未来展望-优雅草卓伊凡 一、AI大模型基础原理与智能驾驶 1.1 AI大模型的核心架构 本内容由优雅草木心为卓伊凡提供技术辅助讲解&#xff0c;毕竟木心目前正在比亚迪。 人工智能大模型是基于深度学习的复杂神经网络系统&#…

企业AI部署热潮下的安全隐忧:速度与安全的博弈

数据来源&#xff1a;企业网D1net 企业AI部署热潮下的安全隐忧&#xff1a;速度与安全的博弈 近年来&#xff0c;生成式人工智能&#xff08;GenAI&#xff09;的迅猛发展让企业趋之若鹜。然而&#xff0c;在这场技术竞赛中&#xff0c;不少企业却因盲目追求速度而忽视了安全…

分析XSSstrike源码

#用于学习web安全自动化工具# 我能收获什么&#xff1f; 1.XSS漏洞检测机制 学习如何构造和发送XSS payload如何识别响应中的回显&#xff0c;WAF&#xff0c;过滤规则等如何使用词典&#xff0c;编码策略&#xff0c;上下文探测等绕过过滤器 2.Python安全工具开发技巧 使…

通过mqtt 点灯

1 解析mqtt 传过来的json 用cjson 解析。 2 类似mvc的结构&#xff0c;调用具体的动作函数 定义设备处理结构体&#xff1a;使用结构体数组映射设备名称与处理函数&#xff0c;实现可扩展的指令分发分离设备逻辑&#xff1a;为每个设备&#xff08;如 LED、Motor&#xff0…

解锁技术世界的“秘密知识库”:The Book of Secret Knowledge 深度解析

在浩如烟海的技术文档中,你是否渴望一个集中式宝库,收录那些资深工程师口耳相传的“秘密武器”?GitHub 上爆火的 The Book of Secret Knowledge 正是这样一个令人惊叹的集合。今天我们来深入探索这个项目,挖掘它的核心价值。 🔍 项目核心:不是什么,而是什么 不是一本传…

M4Pro安装ELK(ElasticSearch+LogStash+Kibana)踩坑记录

ElasticSearch安装&#xff0c;启动端口9200&#xff1a; docker pull elasticsearch:8.13.0 新增配置文件elasticsearch.yml&#xff1a; cd /opt/homebrew/etc/ mkdir elasticsearch_config cd elasticsearch_config vi elasticsearch.yml cluster.name: "nfturbo…