Unity3D仿星露谷物语开发55之保存地面属性到文件

article/2025/7/16 18:16:45

1、目标

将游戏保存到文件,并从文件中加载游戏。

Player在游戏中种植的Crop,我们希望保存到文件中,当游戏重新加载时Crop的GridProperty数据仍然存在。这次主要实现保存地面属性(GridProperties)信息。

我们要做的是实现一个我们可以点击的方式,将游戏保存到一个文件中,然后点击加载按钮,它将获取该文件,然后将数据带回游戏中。

2、创建GameSave.cs脚本

在Assets/Scripts/SaveSystem下创建新的脚本命名为:GameSave.cs。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[System.Serializable]
public class GameSave
{// string key - GUID gameobject IDpublic Dictionary<string, GameObjectSave> gameObjectData;public GameSave(){gameObjectData = new Dictionary<string, GameObjectSave>();}
}

3、修改ISaveable.cs脚本

添加2行代码:

    GameObjectSave ISaveableSave();void ISaveableLoad(GameSave gameSave);

ISaveableSave: 保存变量和游戏对象,这一步是获取数据,后续会写入文件

ISaveableLoad:将游戏保存数据对象(从文件中读取的数据)作为它的参数

4、修改GridPropertiesManager.cs脚本

添加新的引用:

using UnityEngine.SceneManagement;

添加ISaveableLoad函数实现:

public void ISaveableLoad(GameSave gameSave)
{if(gameSave.gameObjectData.TryGetValue(ISaveableUniqueID, out GameObjectSave gameObjectSave)){GameObjectSave = gameObjectSave;// Restore data for current sceneISaveableRestoreScene(SceneManager.GetActiveScene().name);}
}

其中,ISaveableUniqueID是通过GetComponent<GenerateGUID>().GUID生成的。

在GenerateGUID的实现中,它的属性是[ExecuteAlways],即运行/编译时都会执行,实际上是需要编译时生成_gUID信息。_gUID是[SerializeField]属性,而[SerializeField] 标记的字段会被 Unity 自动序列化到场景文件或预制体中。

所以一个游戏中,GenerateGUID的值是不会变化的。

另外,GameObjectSave是属性变量,其定义为:

    public GameObjectSave GameObjectSave { get { return _gameObjectSave; } set { _gameObjectSave = value; } }
 

添加ISaveableSave方法的实现:

 public GameObjectSave ISaveableSave(){// Store current scene dataISaveableStoreScene(SceneManager.GetActiveScene().name);return GameObjectSave;}

5、修改SceneItemsManager.cs脚本 

 添加新的引用:

using UnityEngine.SceneManagement;

添加如下2个方法的实现:

 public void ISaveableLoad(GameSave gameSave){if(gameSave.gameObjectData.TryGetValue(ISaveableUniqueID, out GameObjectSave gameObjectSave)){GameObjectSave = gameObjectSave;// Restore data for current sceneISaveableRestoreScene(SceneManager.GetActiveScene().name);}}public GameObjectSave ISaveableSave(){// Store current scene dataISaveableStoreScene(SceneManager.GetActiveScene().name);return GameObjectSave;}

6、修改SaveLoadManager.cs脚本

SaveLoadManager有2个方法:StoreCurrentSceneData / RestoreCurrentSceneData。

在SceneControllerManager中,当场景切换和Start中会使用RestoreCurrentSceneData方法。

接下来就是改造SaveLoadManager,从文件中读写信息。

添加2个引用:

using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

接着添加2个函数:

public void LoadDataFromFile()
{BinaryFormatter bf = new BinaryFormatter();if(File.Exists(Application.persistentDataPath + "/WildHopeCreek.data")){gameSave = new GameSave();FileStream file = File.Open(Application.persistentDataPath + "/WildHopeCreek.data", FileMode.Open);gameSave = (GameSave)bf.Deserialize(file);  // loop through all ISaveable obvjects and apply save datafor(int i = iSaveableObjectList.Count - 1; i > -1; i--){if (gameSave.gameObjectData.ContainsKey(iSaveableObjectList[i].ISaveableUniqueID)){iSaveableObjectList[i].ISaveableLoad(gameSave);}else{// else if iSaveableObject unique ID is not in the game object data then destroy objectComponent component = (Component)iSaveableObjectList[i];Destroy(component.gameObject);}}file.Close();}UIManager.Instance.DisablePauseMenu();
}public void SaveDataToFile()
{gameSave = new GameSave();// loop through all ISaveable objects and generate save dataforeach(ISaveable iSaveableObject in iSaveableObjectList){gameSave.gameObjectData.Add(iSaveableObject.ISaveableUniqueID, iSaveableObject.ISaveableSave());}BinaryFormatter bf = new BinaryFormatter();FileStream file = File.Open(Application.persistentDataPath + "/WildHopeCreek.data" , FileMode.Create);bf.Serialize(file, gameSave);file.Close();UIManager.Instance.DisablePauseMenu();
}

可以通过如下代码查看存储的路径:

Debug.Log("dataPath:" + Application.persistentDataPath);

我的地址是:C:\Users\benbe\AppData\LocalLow\DefaultCompany\XingluValley

7、编辑UI界面

(1)设置界面元素

将PauseMenuPanel下的Tab2修改为Tab2SaveGame,

将SelectionTabButtonsPanel -> SelectionButton(2) -> Text的输入改为"Save/Load"。

给Tab2SaveGame对象添加Vertical Layout Group组件,相关配置如下:

在Tab2SaveGame下右击 -> UI -> Button(TextMeshPro),命名为SavevGameButton。再创建一个同样的Button命名为LoadGameButton。

分别点击SaveGameButton及LoadGameButton两个对象,修改Button属性的Normal Color为87775D  ,Highlighed Color为D8DB84   。

最后界面呈现的样式为:

(2)添加点击事件

SaveGameButton对应的点击事件:

LoadGameButton对应的点击事件:

8、运行游戏

运行游戏,收集地面上的item,并且种植了Crop,点击Esc -> Save Game。

退出游戏后重新进入,点击Esc -> Load Game。之前地面上已经被收集掉的item没有再次出现,Crop仍然保持之前的状态。


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

相关文章

18万人口德国小城为何吸引樊振东 再续乒乓缘

2016年,19岁的樊振东在德国小镇萨尔布吕肯赢得男子世界杯乒乓球赛男单冠军,这是他职业生涯首个三大赛世界冠军,也让他与这座欧洲小城结下不解之缘。九年后,萨尔布吕肯再次掀起“乒乓热浪”。近日,萨尔布吕肯乒乓球甲级俱乐部宣布,中国乒乓球运动员樊振东正式加盟,新赛季…

Bin称闹剧结束了 BLG横扫晋级

TES在LPL淘汰赛中以0-3的战绩不敌BLG,跌入败者组。BLG则晋级胜者组决赛,再赢下一个BO5即可拿到通往MSI的资格。这场比赛结束得很快,双方实力差距明显,赛后引发了不少争议。TES官博遭到粉丝猛烈抨击,辅助刘青松成为众矢之的。不少粉丝要求更换辅助,甚至建议将二队辅助提上…

新造车5月再洗牌:小米守第五,市场格局趋稳

最近的新能源汽车市场再次陷入混乱,价格战和舆论战再度兴起。网络上出现了诸如“0公里二手车”、“车圈恒大论”等言论,反映出一些人对于市场固化的焦虑。一旦市场格局固定,落后者可能会持续落后,看不到未来的希望,因此开始采取内斗和乱战策略,试图搅浑局势。实际上,整个…

进阶日记(一)大模型的本地部署与运行

目录 一、背景知识 为什么要在本地部署大模型&#xff1f; 在本地部署大模型需要做哪些准备工作&#xff1f; &#xff08;1&#xff09;硬件配置 &#xff08;2&#xff09;软件环境 有哪些部署工具可供选择&#xff1f; 二、Ollma安装 Ollama安装完之后&#xff0c;还…

网易游戏转型能否突破天花板 端游接棒成新增长点

2024年对网易游戏来说是充满挑战与变革的一年。这一年,网易游戏经历了业务调整、人事变动以及市场竞争的多重压力,业绩增速放缓,多款游戏停服。这些现象背后,反映出网易游戏在复杂多变的游戏市场中为适应新环境、寻求新突破而做出的艰难抉择。从业绩数据来看,2024年是网易…

韩大选冲刺 四位前总统“出手” 各阵营使出浑身解数

6月3日,韩国将迎来新一届总统选举。距离大选仅剩最后一天,共同民主党总统候选人李在明、国民力量党总统候选人金文洙和改革新党总统候选人李俊锡基本形成“三分”格局。候选人们都在全力冲刺。除了参选的候选人,四位韩国前总统也纷纷表达对各自阵营候选人的支持。据韩联社报…

【速通RAG实战:进阶】19、如何有效评估与改进RAG应用

一、RAG应用评估的核心体系构建 (一)三维度量化评估框架 RAG(检索增强生成)系统的性能评估需从检索、生成、系统级三个维度切入,建立覆盖全链路的量化指标体系,避免单一维度优化导致的系统失衡。 1. 检索模块:精准性与效率双驱动 指标名称定义计算方式健康阈值工具链…

乌克兰这次将特洛伊木马玩明白了 无人机战术震撼亮相

在俄乌第二轮停火谈判即将举行之际,乌克兰突然宣布了一项名为“蛛网”的特别行动,声称袭击了俄罗斯境内的5座战略轰炸机基地,摧毁了41架图-95MS和图-22M3等主力机型,给俄罗斯造成了70亿美元的损失。这一消息震惊了世界。特约评论员石宏认为,乌克兰公布的数字明显夸大,但保…

“涨工资”又一次出现在中央文件 推动居民收入增长

5月26日,中办、国办联合印发文件提出推动企业健全工资合理增长机制。此前,2025年开年的第一场国务院常务会议上,总理李强在部署工作时也提到要提高居民收入,包括支持居民增收,促进工资性收入合理增长,拓宽财产性收入渠道。这些措施针对的是不同群体,既惠及打工人,也考虑…

deepseek api密钥用于其它软件接口调用deepseek

例如这个软件是deepmat,可以调用deepseek,首先需要下载至少MATLAB2024B版本&#xff0c;相关安装详见网站介绍&#xff0c;不愿意花钱的话&#xff0c;这个大家都懂的。接着&#xff0c;是配置相关API接口&#xff0c;需要用到API KEY.有以下几种&#xff1a; &#xff08;1&am…

律师回应女子为4只宠物狗立遗嘱 专款专用引发热议

近日,广州一名52岁女子立遗嘱,将10多万元留给家中的四只宠物狗,此事引发热议。这名陈姓女子离异后与儿子相依为命近20年。她在中华遗嘱库订立遗嘱,将主要财产指定由儿子继承,并从存款中划出专项份额给家中的四只宠物犬,指定儿子作为遗产管理人,负责爱宠生活的费用支出。…

95后手工达人手搓“歼-20”模型 创意飞行器点亮蓝天梦

刘祥强是一位95后手工达人,今年28岁,来自江西赣州。他从小就喜欢发明创造,从科幻飞行器到歼-20模型,都被他亲手制作出来,并成功飞向蓝天。刘祥强的老家在南康区龙华镇的一栋民房里,现在也是他的专职航模工作室。楼下是裁切和生产车间,楼上是设计和测试区域。这段时间,他…

河北秦皇岛市卢龙县发生地震 2.5级震源深10公里

据中国地震台网正式测定,6月2日17时35分在河北秦皇岛市卢龙县发生2.5级地震,震源深度10公里,震中位于北纬39.96度,东经118.88度。震中5公里范围内平均海拔约50米。根据中国地震台网速报目录,震中周边200公里内近5年来共发生3级以上地震14次,其中最大一次是2020年7月12日在…

外卖员不用办健康证了?网友吵翻 食安封签普及引发争议

点外卖已成为很多人的生活习惯,而网络订餐配送过程中的食品安全问题也备受关注。去年底,四川省卫生健康委与市场监管局联合发布新规,明确外卖送餐人员及预包装食品销售从业者无须办理传统健康证即可上岗,并要求体检机构停止为外卖员提供健康证服务。这一消息得到不少外卖小…

重庆和赵丽颖《在人间》适配度超高 首播成绩惨淡引发热议

5月28日,赵丽颖领衔主演的《在人间》上线播出。这部剧没有避开风头正劲的《藏海传》,而是选择正面PK,这也是肖战和赵丽颖两大顶流的巅峰对决。《在人间》上线首日的成绩单出炉,可以用“惨败”来形容。专业平台给出的网播热度显示,《在人间》首日开播并没有太大声响,热度不…

湖南机场撤下邱继兴职务信息 新领导已上任

今年4月,湖南省机场管理集团党委书记、董事长,湖南省机场管理局局长邱继兴因涉嫌性侵一女子被警方刑拘一事引发广泛关注。6月2日,该集团官网已撤下邱继兴的职务信息,集团官方微信公众号中大量关于他的内容也已消失。邱继兴案发源于一次饭局。知情者透露,2025年4月11日,邱…

男子将放学女童拖进小巷被拘,现场视频曝光

太吓人了!湖南娄底,6岁小女孩在放学的路上,被一位强壮的陌生男子强行拉拽进小巷。女孩吓得撕心裂肺的哭喊着一边喊着爸爸救命,一边挣扎着不愿意进小巷。庆幸的是,楼上的一位爷爷听到了孩子的哭喊声,于是下楼看一看发生了什么?还侥幸的救下了这个小女孩。事后,孩子的妈妈…

免陪照护服务6月起全国推广 缓解家庭陪护压力

俗话说“久病床前无孝子”,这句话反映了家庭在面对病人陪护时面临的无奈与压力。尤其是在老龄化社会背景下,独生子女家庭中父母住院时的陪护问题更加突出。如果医院能提供标准化的照护服务,许多人会感到轻松许多。国家卫健委等三部委已印发方案,将在全国范围内开展免陪照护…

18万人口德国小城为何吸引樊振东加盟 乒乓热浪再起

2016年,19岁的樊振东在德国小镇萨尔布吕肯赢得男子世界杯乒乓球赛男单冠军,这是他职业生涯的首个三大赛世界冠军。九年后的这个夏天,萨尔布吕肯再次掀起“乒乓热浪”。俱乐部宣布中国乒乓球运动员樊振东正式加盟,新赛季将代表俱乐部参加德国乒乓球甲级联赛和欧冠的比赛。中…

男子开着收割机冲进起火麦田抢收 新时代青年的责任担当

当20多亩麦田被大火包围时,湖北天门的一位00后收割机司机小王给出了最好的答案——他毫不犹豫地驾驶收割机冲进火海,在浓烟滚滚中抢收小麦。这一幕比任何超级英雄电影都要震撼人心。这不仅是一个救火的故事,更是新时代年轻人责任担当的真实写照。那天下午,湖北天门某村庄发…