Unity3D仿星露谷物語開發55之保存地面屬性到文件

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.pswp.cn/bicheng/83388.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83388.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83388.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java面試:企業協同SaaS中的技術挑戰與解決方案

Java面試&#xff1a;企業協同SaaS中的技術挑戰與解決方案 面試場景 在一家知名互聯網大廠&#xff0c;面試官老王正在對一位應聘企業協同SaaS開發職位的程序員謝飛機進行技術面試。 第一輪提問&#xff1a;基礎技術 老王&#xff1a;謝飛機&#xff0c;你好。首先&#xf…

SQL注入速查表(含不同數據庫攻擊方式與差異對比)

1. 字符串連接 字符串連接是SQL注入中常用的操作&#xff0c;用于將多個字符串拼接為一個&#xff0c;以構造復雜的注入語句。不同數據庫的字符串連接語法存在顯著差異&#xff0c;了解這些差異有助于精準構造payload。 Oracle&#xff1a;使用||操作符進行字符串連接&#xf…

uni-data-picker級聯選擇器、fastadmin后端api

記錄一個部門及部門人員選擇的功能&#xff0c;效果如下&#xff1a; 組件用到了uni-ui的級聯選擇uni-data-picker 開發文檔&#xff1a;uni-app官網 組件要求的數據格式如下&#xff1a; 后端使用的是fastadmin&#xff0c;需要用到fastadmin自帶的tree類生成部門樹 &#x…

Mac電腦上本地安裝 redis并配置開啟自啟完整流程

文章目錄 一、安裝 Redis方法 1&#xff1a;通過源碼編譯安裝&#xff08;推薦&#xff09;方法 2&#xff1a;通過 Homebrew 安裝&#xff08;可選&#xff09; 二、配置 Redis1. 創建配置文件和數據目錄2. 修改配置文件 三、配置開機自啟1、通過 launchd 系統服務&#xff08…

wsl安裝linux

安裝wsl 啟用適用于 Linux 的 Windows 子系統 以管理員身份打開 PowerShell &#xff08;> PowerShell > 右鍵單擊 > 以管理員身份運行&#xff09; 并輸入以下命令&#xff0c;然后重啟 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsyste…

OpenGL 3D 編程

OpenGL 是一個強大的跨平臺圖形 API,用于渲染 2D 和 3D 圖形。以下是 OpenGL 3D 編程的入門基礎。 一. 環境設置 安裝必要的庫 GLFW: 用于創建窗口和處理輸入 GLEW 或 GLAD: 用于加載 OpenGL 函數 GLM: 數學庫,用于 3D 變換 // 基本 OpenGL 程序結構示例 #include <GL/g…

Android基于LiquidFun引擎實現軟體碰撞效果

一、實現效果 Android使用LiquidFun物理引擎實現果凍碰撞效果 二、Android代碼 // 加載liquidfun動態庫static {System.loadLibrary("liquidfun");System.loadLibrary("liquidfun_jni");}class ParticleData {long id;ParticleSystem particleSystem;float…

Redis持久化機制詳解:RDB與AOF的深度剖析

一、為什么需要持久化&#xff1f; Redis作為內存數據庫&#xff0c;數據存儲在易失性內存中。持久化機制解決兩大核心問題&#xff1a; 數據安全&#xff1a;防止服務器宕機導致數據丟失災難恢復&#xff1a;支持數據備份與快速重建 二、RDB&#xff1a;內存快照持久化 ? …

Netty學習example示例

文章目錄 simpleServer端NettyServerNettyServerHandler Client端NettyClientNettyClientHandler tcp&#xff08;粘包和拆包&#xff09;Server端NettyTcpServerNettyTcpServerHandler Client端NettyTcpClientNettyTcpClientHandler protocolcodecCustomMessageDecoderCustomM…

ThreadLocal ,底層原理,強引用,弱引用,內存泄漏

目錄 ThreadLocal的基本概念 底層實現原理 強引用與弱引用 內存泄漏問題 內存泄漏的解決方案 示例代碼 ThreadLocal的基本概念 ThreadLocal是Java中的一個類&#xff0c;位于java.lang包下&#xff0c;它提供了線程局部變量的功能。每個使用該變量的線程都有自己獨立的初…

TomSolver 庫 | config詳解及其測試

一、C 關鍵特性解析 1. enum class 強類型枚舉 enum class LogLevel { OFF, FATAL, ERROR, WARN, INFO, DEBUG, TRACE, ALL }; enum class NonlinearMethod { NEWTON_RAPHSON, LM };核心特性&#xff1a; 類型安全&#xff1a;禁止隱式轉換為整數作用域限定&#xff1a;必須…

【DB2】ERRORCODE=-4499, SQLSTATE=08001

客戶在連接DB2壓測時報錯ERRORCODE-4499, SQLSTATE08001&#xff0c;連接失敗&#xff0c;主要是因為通信失敗 在本地進行復現&#xff0c;用DBeaver代替java程序&#xff0c;將DB2COMM從TCPIP置為空&#xff0c;重啟后重新連接&#xff0c;報一樣的錯誤 而將防火墻開啟&…

MicroPython+L298N+ESP32控制電機轉速

要使用MicroPython控制L298N電機驅動板來控制電機的轉速&#xff0c;你可以通過PWM&#xff08;脈沖寬度調制&#xff09;信號來調節電機速度。L298N是一個雙H橋驅動器&#xff0c;可以同時控制兩個電機的正反轉和速度。 硬件準備&#xff1a; 1. L298N 電機控制板 2. ESP32…

WPF 全局加載界面、多界面實現漸變過渡效果

WPF 全局加載界面與漸變過渡效果 完整實現方案 MainWindow.xaml <Window x:Class"LoadingScreenDemo.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml&quo…

RabbitMQ深度解析:從基礎實踐到高階架構設計

引言?? 在分布式系統與微服務架構主導的現代軟件開發中&#xff0c;服務間通信的可靠性、異步處理能力及流量管控成為核心挑戰。??RabbitMQ??作為基于AMQP協議的企業級消息中間件&#xff0c;憑借其靈活的路由機制、高可用架構與豐富的擴展能力&#xff0c;成為異步通信…

華為OD機試真題——矩形相交的面積(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 100分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

基于隨機函數鏈接神經網絡(RVFL)的鋰電池健康狀態(SOH)預測

基于隨機函數鏈接神經網絡(RVFL)的鋰電池健康狀態(SOH)預測 一、RVFL網絡的基本原理與結構 隨機向量功能鏈接(Random Vector Functional Link, RVFL)網絡是一種單隱藏層前饋神經網絡的隨機化版本,其核心特征在于輸入層到隱藏層的權重隨機生成且固定,輸出層權重通過最…

阿里云國際站,如何通過代理商邀請的鏈接注冊賬號

阿里云國際站&#xff1a;如何通過代理商邀請鏈接注冊&#xff0c;解鎖“云端超能力”與專屬福利&#xff1f; 渴望在全球化浪潮中搶占先機&#xff1f;想獲得阿里云國際站的海量云資源、遍布全球的加速節點與前沿AI服務&#xff0c;同時又能享受專屬折扣、VIP級增值服務支持或…

PMOS以及電源轉換電路設計

PMOS的使用 5V_EN5V時&#xff0c;PMOS截止&#xff1b; 5V_EN0V時&#xff0c;PMOS導通&#xff1b; 電源轉換電路 當Vout0V時&#xff0c;Vg0V, Vgs>Vth, PMOS導通&#xff0c;只有電池供電&#xff1b; 當Vout5V時&#xff0c;Vg4.9V, Vs4.8V?, Vgs<Vth, PMOS截止&am…

云時代:DMZ安全架構的演進與實踐

隨著云計算的普及,傳統的DMZ安全邊界正在經歷根本性變革。本文探討如何在云環境中重新設計和實現DMZ架構,以應對現代安全挑戰。 1. 傳統DMZ與云DMZ的對比 傳統DMZ(隔離區)是網絡安全的經典架構,但云環境帶來了新的挑戰: 特性傳統DMZ云DMZ物理邊界明確的物理網絡分區虛擬網…