<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網易首頁 > 網易號 > 正文 申請入駐

      《火拼24》系列教程三:游戲闖關進度的云端存檔

      0
      分享至

      在《火拼24》的精彩游戲世界里,每一關的突破都凝聚著玩家的智慧與努力。然而,如何確保這些來之不易的闖關進度不會因設備更換或意外情況而丟失,成為了眾多玩家關注的焦點。

      別擔心!在本節教程里,我們將為大家深度揭秘一項超實用的強大功能——基于 CRUD Save 打造的游戲闖關進度云端存檔,讓玩家們能安心暢玩,闖關進度永不丟失!

      教程視頻

      項目工程獲取與學習指引

      1. 初始項目工程下載

      • 倉庫地址:

      https://cnb.cool/unity/uos/Rush24Tutorial/-/tree/lesson3-start

      • 分支名稱:lesson3-start 分支

      • 分支說明:請先下載 lesson3-start 分支的項目工程,該分支是本節學習的起點。

      2.完整示例工程參考
      • 倉庫地址:

      https://cnb.cool/unity/uos/Rush24Tutorial/-/tree/lesson3-end

      • 分支名稱:lesson3-end 分支

      • 分支說明:lesson3-end 分支包含本節所有功能的完整實現代碼,建議在學習完成后參考或用于調試對照。

      3.將項目工程克隆到本地

      可以在命令行窗口中直接輸入 Git 命令拉取項目工程到本地,也可以借助其它的可視化工具(如 Sourcetree)將倉庫克隆到本地。

      例如,輸入以下命令即可拉取名為 lesson3-start 的分支對應的項目工程:git clone -b lesson3-start https://cnb.cool/unity/uos/Rush24Tutorial.git

      教程學習大綱

      1. 項目的準備工作

      2. 分析:原有的本地文件存儲的方式保存闖關進度

      3. 實現:使用 CRUD-Save 方式保存闖關進度

      4. 自動云存檔功能(AutoSave)

      教程操作步驟

      接下來我們要開始本節課的學習啦!

      1. 項目的準備工作1.1 下載并打開項目工程

      請先通過上面提供的 git 倉庫鏈接,下載初始狀態(lesson3-start 分支)的項目工程。

      然后通過 Unity Hub,打開剛剛下載好的項目工程。在教程中,我們是使用Unity 2022.3.42 f1c1版本來打開項目工程的,該教程同樣適用于團結引擎,請大家自行選擇想要使用的版本來開始你的學習。

      打開項目工程以后,首先確保你的項目已經綁定了第一章節教程中設置過的同一個 UOS App。

      1.2 開通 CRUD-Save 服務并安裝 SDK

      在 UOS Launcher 的下拉服務窗口列表中,找到「CRUD-Save」,點擊「Enable」開啟服務。

      然后點擊「Install SDK」,安裝 CRUD-Save SDK。

      2.分析:原有的本地文件存儲的方式保存闖關進度

      在原有代碼中,我們是通過 Unity 提供的 Application.persistentDataPath(用于獲取持久化數據存儲路徑的接口),將闖關進度存儲于該路徑下的本地文件 stage_progress.dat 中的。

      接下來,我們首先將分析這種基于本地文件存儲的傳統存檔方式的實現原理,隨后再將存檔功能的實現方案調整為基于 CRUD-Save 的云存檔方式。

      • 可以看到在 LoadGameData.cs 腳本中,加載完遠端 RemoteConfig 配置的數據后,會調用 UOSSave.cs 腳本中的 Init 方法來加載本地存檔的關卡數據,最后才進入游戲的主場景。

      namespace TwentyFour.Scripts.Gameplay.HomePage
      {
          public class LoadGameData : MonoBehaviour
          {
              //......
      
              // Start is called before the first frame update
              IEnumerator Init()
              {
                  yield return StartCoroutine(InitRemoteConfig());
                  yield return StartCoroutine(InitStage());
                  yield return StartCoroutine(InitSave());
                  GameRouter.LoadHomeSceneFirst();
              }
      
              IEnumerator InitSave()
              {
                  coverPageHintText.text = "正在...了解過去...";
                  UOSSave.Init();
                  yield break;
              }
      
              //......
          }
      }

      • 找到 Scripts/Features/Save 文件夾路徑下的 UOSSave.cs 腳本并打開。

      2.1 使用 File 類將闖關進度存儲至本地文件中

      打開 UOSSave.cs 腳本,它主要用來實現關卡進度的本地存儲和讀取,具體思路如下:

      • 存儲關卡進度(SavePlayerProgress 方法):將關卡成績列表轉換為字符串(如 [1,0,0...] → "100..."),賦值給 scoreString 變量。然后調用 File.WriteAllText 方法,將數據寫入 Unity 提供的 Application.persistentDataPath 路徑下,并由用戶自定義的 stage_progress.dat 文件中。如果某一關卡闖關成功,我們將會使用「1」來表示,如果闖關沒通過的話,用默認的「0」來表示

      • 讀取關卡進度(FetchPlayerProgress 方法):從 stage_progress.dat 文件中讀取保存的字符串,再通過調用 ConvertStringToList 方法,將字符串類型的關卡進度轉換為集合列表,恢復為關卡數據。最后通過 StageManager.cs 腳本,來加載實際的關卡進度。代碼中可以添加一行 Log:打印輸出下本地存儲的關卡進度信息。

      • 初始化流程(Init 方法):游戲啟動時會檢查存檔文件是否存在,有存檔則加載關卡進度,無存檔則初始化空的闖關進度,也就是從第一關開始來解鎖。


      namespace TwentyFour.Scripts.Features.Save
      {
          public class UOSSave
          {
              private static string SaveFilePath => Path.Combine(Application.persistentDataPath, "stage_progress.dat");
      
              static List
      
        ConvertStringToList(string str)         {             List
      
       list = new List
      
       ();             foreach (char c in str)             {                 // 將字符轉換為整數并添加到列表中                 int number = int.Parse(c.ToString());                 list.Add(number);             }             return list;         }         public static void Init()         {             if (File.Exists(SaveFilePath))             {                 FetchPlayerProgress();             }             else             {                 Logger.Log("not found existed score save");                 StageManager.LoadEmptyStageScore();             }         }         private static void FetchPlayerProgress()         {             try             {                 string scores = File.ReadAllText(SaveFilePath);                 Logger.Log("本地存儲的關卡進度為:" + scores);                 StageManager.LoadStageScores(ConvertStringToList(scores));             }             catch (Exception e)             {                 Logger.LogError($"Failed to load player progress: {e.Message}");                 StageManager.LoadEmptyStageScore();             }         }         public static void SavePlayerProgress(List
      
       scores)         {             try             {                 string scoreString = string.Join("", scores);                 File.WriteAllText(SaveFilePath, scoreString);             }             catch (Exception e)             {                 Logger.LogError($"Failed to save player progress: {e.Message}");             }         }         public static void Dispose()         {             // 如果需要清理資源可以在這里實現         }     } } 
      
      
      
      

      2.2 運行游戲,查看本地存檔文件中的數據

      運行游戲,進入「闖關」頁面后,可以看到打印輸出的 Log 信息:1100,已經通過的關卡就是數字「1」表示的第一關和第二關,未通過的關卡就是數字「0」表示的第三關和第四關。

      進入 Application.persistentDataPath 路徑對應的文件夾,可以看到路徑下的 stage_progress.dat 存檔文件。

      但是,如果大家此時更換了一臺設備,運行你的當前項目工程的話,由于新設備路徑中沒有存檔文件 stage_progress.dat,運行后在 Game 窗口中會看到每一關都是未被解鎖的狀態。

      3. 實現:使用 CRUD-Save 方式保存闖關進度

      我們接下來將實現:基于 CRUD-Save 打造的游戲闖關進度云端存檔功能,它能實現當前登錄用戶闖關進度的云端保存,讓用戶更換設備后再次進入仍可無縫銜接。

      3.1 什么是 CRUD-Save

      • CRUD-Save 是 UOS 提供的全面而專業的玩家數據存儲、檢索及管理服務。開發者能夠極為便捷地為廣大游戲玩家打造出一個:跨越不同平臺與設備的、安全且高度可用的游戲存檔系統

      • 這一服務不僅確保了玩家能夠在任何時間、任何地點,無縫地繼續他們的游戲進程,而且通過嚴格的數據安全保障措施,讓玩家的游戲數據始終處于嚴密的保護之下。同時,其高可用性的設計也保證了玩家數據的實時同步與持久存儲,為玩家帶來了更加流暢、穩定的游戲體驗。

      3.2 初始化 CRUD-Save SDK

      將原來的 Init 方法,修改為使用 async 修飾的異步方法。然后方法中調用 SDK 提供的 InitializeAsync 方法,來初始化 CRUD-Save SDK,確保后續有關云存儲的操作可以正常進行。并使用 try...catch... 機制,捕獲客戶端和服務端遇到的異常。

      using System;
      using System.Collections.Generic;
      using UnityEngine;
      using System.IO;
      using Logger = TwentyFour.Scripts.Utilities.Logger;
      using TwentyFour.Scripts.Gameplay.GameMode.StageMode;
      using System.Linq;
      using Unity.UOS.CloudSave;
      using Unity.UOS.CloudSave.Exception;
      using Unity.UOS.CloudSave.Model.Files;
      
      namespace TwentyFour.Scripts.Features.Save
      {   
          public class UOSSave
          {
              //......
      
              public static async void Init()
              {
                  try
                  {
                      // 異步初始化 CRUD-Save SDK
                      await CloudSaveSDK.InitializeAsync();
                  }
                  catch (CloudSaveClientException e)
                  {
                      Debug.Log($"clientEx: {e.Message}");
                  }
                  catch (CloudSaveServerException e)
                  {
                      Debug.Log($"serverEx: {e.Message}");
                  }
      
                  if (File.Exists(SaveFilePath))
                  {
                      FetchPlayerProgress();
                  }
                  else
                  {
                      Logger.Log("not found existed score save");
                      StageManager.LoadEmptyStageScore();
                  }
              }
          }

      3.3 修改存檔方法 SavePlayerProgress

      修改保存玩家存檔進度的方法(SavePlayerProgress),實現將玩家的闖關進度存檔到云端,該方法也需要添加 async 修飾符:

      public static async void SavePlayerProgress(List
      
       scores) {     //......     } 
      

      然后根據是否創建過云存檔文件,分為以下兩種情況來處理:

      3.3.1 首次創建存檔文件

      如果當前沒有存檔 ID(即 _stageScoresSaveId 為空),說明還沒有創建過存檔。我們將調用 SDK 提供的 CreateAsync 方法,來創建一個新的云端存檔來保存闖關數據。

      在 CreateAsync 方法中我們通過字節數組的方式來創建一個存檔,傳入三個參數:

      • 存檔名稱:使用變量 name 的值;

      • 字節數組類型的存檔文件:將闖關成績列表 scores 序列化為字節數組,賦值給變量 bytes;

      • 存檔選項:傳入 CreateOptions 類型的變量,設置存檔所屬的命名空間(Namespace);

      • 方法的返回值:表示當前存檔 ID,賦值給了變量 _stageScoresSaveId ;

      • 如果在創建存檔過程中,出現客戶端異常(如網絡問題、參數錯誤等),或者服務端異常(如服務器故障、權限問題等),會捕獲并記錄錯誤日志。


      namespace TwentyFour.Scripts.Features.Save
      {
          public class UOSSave
          {
              private static string _stageScoresSaveId;
              private const string SAVE_NS_STAGE_SCORES = "StageScores";
      
              //......
              public static async void SavePlayerProgress(List
      
       scores)         {             byte[] bytes = SerializeList.Serialize(scores);             // 如果當前沒有存檔ID,說明還沒有創建過存檔             if (string.IsNullOrEmpty(_stageScoresSaveId))             {                 string name = SAVE_NS_STAGE_SCORES; // 存檔名稱                 try                 {                     // 創建存檔時的選項,指定命名空間                     CreateOptions  options = new CreateOptions ()                     {                         Namespace = SAVE_NS_STAGE_SCORES                     };                     // 異步創建新存檔,并獲取存檔ID                     _stageScoresSaveId = await CloudSaveSDK.Instance.Files.CreateAsync(name, bytes, options);                 }                 // 捕獲客戶端異常并記錄錯誤日志                 catch (CloudSaveClientException e)                 {                     Logger.LogError($"failed to save file, name {name}, clientEx: {e.Message}");                 }                 // 捕獲服務端異常并記錄錯誤日志                 catch (CloudSaveServerException e)                 {                     Logger.LogError($"failed to save file, name {name}, serverEx: {e.Message}");                 }             }         }     } } 
      

      3.3.2 更新已創建的存檔文件

      第二種情況是:當存檔 ID 不為空,也就是已經有了存檔文件的情況下,我們只需要更新同一個存檔文件即可。

      調用 UpdateAsync 方法來更新存檔文件,方法中傳入兩個參數:

      • 已創建的存檔 ID:使用之前 _stageScoresSaveId 變量保存的值;

      • 更新存檔選項:傳入 UpdateOptions 類型的變量,指定要更新的文件內容(FileBytes),更新文件的方式為ByFileBytes;

      • 同樣的使用 try...catch... 來捕獲,更新存檔的過程中出現的客戶端或者服務端的異常信息。


          public static async void SavePlayerProgress(List
      
       scores)     {         byte[] bytes = SerializeList.Serialize(scores);         // 如果當前沒有存檔ID,說明還沒有創建過存檔         if (string.IsNullOrEmpty(_stageScoresSaveId))         {             //......         }         else         {             // 更新已有存檔             try             {                 // 更新存檔選項, 可以通過該方法更新存檔文件,也可以僅更新存檔配置                 UpdateOptions options = new UpdateOptions()                 {                     File = new Unity.UOS.CloudSave.Model.Files.FileOptions()                     {                         FileBytes = bytes,                         UpdateFileWay = UpdateFileWay.ByFileBytes                     }                 };                  await CloudSaveSDK.Instance.Files.UpdateAsync(_stageScoresSaveId, options);             }             catch (CloudSaveClientException e)             {                 Logger.LogError($"failed to update file, saveId {_stageScoresSaveId}, clientEx: {e.Message}");             }             catch (CloudSaveServerException e)             {                 Logger.LogError($"failed to update file, saveId {_stageScoresSaveId}, serverEx: {e.Message}");             }         }           } 
      

      3.3.3 運行游戲,查看創建的存檔文件

      運行游戲進行測試,比如完成第一關卡闖關后,進入 CRUD-Save 的「存檔管理」頁面,可以看到已經有一條存檔信息了。

      存檔文件名、命名空間,都是代碼中傳入的變量名 StageScores。

      然后再次運行第二關、第三關的游戲進行測試,可以看到闖關進度更新時,CRUD-Save 的「存檔管理」頁面會實時更新存檔文件的信息。

      但是,如果我們現在停止游戲后,再次重新運行的話,發現「闖關」界面的進度并沒有更新,因為我們還沒有從云存檔中讀取闖關的進度。

      3.4 修改讀取游戲存檔進度的方法

      接下來,我們就修改 FetchPlayerProgress 方法的代碼,實現從存檔文件中獲取到玩家的闖關進度,并更新到 UI 界面上。

      • 首先,調用 SDK 封裝的 LoadBytesAsync 方法,通過用戶的存檔 ID(_stageScoresSaveId)異步獲取云端存檔文件的內容,并以字節數組(bytes)的形式返回。

      • 然后,將獲取到的字節數組(bytes)通過反序列化操作,轉換為闖關進度列表,并存儲在變量 scores 中。接著,調用 StageManager.cs 腳本中封裝的 LoadStageScores 方法,將闖關進度數據加載到游戲的闖關界面,實現玩家進度的恢復。

      • 整個加載過程中,同樣的使用 try...catch... 結構分別捕獲客戶端和服務端的異常,并通過日志詳細記錄異常信息,以便于后續排查和調試。


          private static async void FetchPlayerProgress()
          {
              try
              {
                  byte[] bytes =  await CloudSaveSDK.Instance.Files.LoadBytesAsync(_stageScoresSaveId);
                  var scores = SerializeList.Deserialize
      
       (bytes);             StageManager.LoadStageScores(scores);         }         catch (CloudSaveClientException e)         {             Logger.LogError($"failed to load file, saveId {_stageScoresSaveId}, clientEx: {e.Message}");             throw;         }         catch (CloudSaveServerException e)         {             Logger.LogError($"failed to load file, saveId {_stageScoresSaveId}, serverEx: {e.Message}");             throw;         }     } 
      

      3.5 從云端加載存儲的闖關進度數據

      在初始化 Init 方法中,實現 CRUD-Save SDK 初始化后,繼續添加代碼,實現從云端加載存儲的闖關進度數據。

      • 首先,調用 SDK 提供的 ListAllAsync 方法來獲取云端所有存檔文件。該方法需要傳入一個 ListOptions 類型的參數,其中可以指定存檔所屬的命名空間、角色ID、存檔模式、是否包含封面等選項。并將命名空間設置為之前定義的常量 SAVE_NS_STAGE_SCORES,以便只查詢與關卡進度相關的存檔文件。

      • 判斷下如果返回的存檔文件列表(saveItems)不為空,說明云端已經存在相關的存檔文件。此時,代碼會獲取列表中第一條存檔的 SaveId,并將其保存到變量 _stageScoresSaveId 中。接著,調用之前封裝的 FetchPlayerProgress 方法,加載該存檔 ID 對應的存檔數據,并在闖關界面上進行展示。

      • 如果返回的存檔文件列表為空,說明當前沒有任何存檔信息。此時會輸出日志提示,并調用 StageManager.cs 腳本中的 LoadEmptyStageScore 方法,從第一關開始初始化游戲進度,讓玩家從頭開始闖關。


      public class UOSSave
      {       
          //......
      
          public static async void Init()
          {
              try
              {
                  await CloudSaveSDK.InitializeAsync();
                  var options = new ListOptions()
                  {
                      Namespaces = new List
      
       () { SAVE_NS_STAGE_SCORES },             };             var saveItems = await CloudSaveSDK.Instance.Files.ListAllAsync(options);             if (saveItems.Any())             {                 _stageScoresSaveId = saveItems[0].SaveId;                 FetchPlayerProgress();             }             else             {                 Logger.Log("not found existed score save");                 StageManager.LoadEmptyStageScore();             }         }         catch (CloudSaveClientException e)         {             Debug.Log($"clientEx: {e.Message}");         }         catch (CloudSaveServerException e)         {             Debug.Log($"serverEx: {e.Message}");         }     }     //...... } 
      

      運行游戲后進行測試,看到闖關界面上的 UI 已經實時更新了,說明成功加載到了云端存檔文件中的數據。

      3.6 清空存檔數據

      當玩家退出登錄、切換賬號時,如果該用戶沒有任何存檔數據,需要清空當前登錄用戶的存檔 ID 變量(_stageScoresSaveId),確保后續操作不會再關聯到之前的存檔。

      public static async void Init()
      {
          try
          {
              await CloudSaveSDK.InitializeAsync();
              var options = new ListOptions()
              {
                  Namespaces = new List
      
       () { SAVE_NS_STAGE_SCORES },         };         var saveItems = await CloudSaveSDK.Instance.Files.ListAllAsync(options);         if (saveItems.Any())         {             _stageScoresSaveId = saveItems[0].SaveId;             FetchPlayerProgress();         }         else         {             _stageScoresSaveId = string.Empty;             Logger.Log("not found existed score save");             StageManager.LoadEmptyStageScore();         }     }     //...... } 
      

      4. 自動云存檔功能(AutoSave)

      除了通過 CRUD-Save SDK 提供的 CreateAsync 方法來手動創建云存檔文件外,UOS 還提供了自動云存檔功能(AutoSave)。

      4.1 自動云存檔的作用

      自動云存檔會在本地指定路徑定期保存存檔文件的同時,自動將該文件同步上傳到云端。這樣,用戶既能在本地快速訪問和恢復存檔,也能確保數據安全地備份在云端,防止因本地數據丟失而造成損失。

      自動云存檔適合需要頻繁保存和同步進度的場景,開發者只需簡單配置(如文件名、保存間隔、沖突策略等),即可實現本地與云端的雙重存檔。

      4.2 自動云存檔的示例代碼參考

      實現方式可以參考: CRUD-Save SDK 提供的示例腳本 AutoSaveSample.cs 中代碼的用法。

      AutoSaveSample.cs 腳本演示了如何在 Unity 項目中集成 CRUD-Save 的自動云存檔功能,實現本地文件定時的自動上傳至云端。

      • 在初始化 CRUD-Save SDK 之后,可以先使用 UOS 提供的 Passport 登錄(即 Passport Login 方式),或者外部登錄的方式(ExternalLogin),來獲取用戶的認證 Token。在當前示例代碼中,我們暫時先以外部登錄的方式(ExternalLogin)來實現。

      • 然后調用 AutoSaveManager.cs 腳本封裝的EnableAutoSave 方法實現自動云存檔,傳入 AutoSaveOptions 類型的配置(指定如文件名、自動保存文件間隔、沖突策略、本地文件存儲路徑等),開啟自動云存檔功能。此后,指定的本地文件會定期自動同步到云端。

      • 協程方法 PerformFileOperations 是我們給出的一個本地文件的操作演示。


      namespace Unity.UOS.CloudSave.Samples.BasicExample
      {
          public class AutoSaveSample : MonoBehaviour
          {
              public string userId;
              private string _personaId = "test-persona-id";
      
              private async void Start()
              {
                  // 初始化 sdk instance
                  try
                  {
                      // 如果安裝了Uos Launcher 使用Uos Launcher關聯的Uos App初始化SDK
                      await CloudSaveSDK.InitializeAsync();
                      // 如果需要使用其他 UOS APP,可傳入一對AppId, AppSecret初始化SDK
                      // await CloudSaveSDK.InitializeAsync(appId, appSecret);
                  }
                  catch (CloudSaveClientException e)
                  {
                      Debug.LogErrorFormat("failed to initialize sdk, clientEx: {0}", e);
                      throw;
                  }
                  catch (CloudSaveServerException e)
                  {
                      Debug.LogErrorFormat("failed to initialize sdk, serverEx: {0}", e);
                      throw;
                  }      
      
                  // 初始化AuthTokenManager中的user token, personaId為選填項
                  await AuthTokenManager.ExternalLogin(userId, _personaId);
      
                  await AutoSaveManager.Instance.EnableAutoSave(new AutoSaveOptions
                  {
                      FileName = "autoSave",
                      Interval = 120,
                      ConflictStrategy = ConflictStrategy.LastWrite,
                      BasePath = Application.persistentDataPath
                  });
                  StartCoroutine(PerformFileOperations(AutoSaveManager.Instance.Path));
              }  
      
              private IEnumerator PerformFileOperations(string filePath)
              {
                  yield return new WaitForSeconds(3);  
                  Debug.LogFormat("Auto load file exists in {0}? {1}", filePath, File.Exists(filePath));
      
                  File.WriteAllText(filePath, "Created file");  
                  Debug.Log("Created file at: " + filePath);  
      
                  yield return new WaitForSeconds(1);  
      
                  File.AppendAllText(filePath, "Appended file");  
                  Debug.Log("Appended file at: " + filePath);  
      
                  yield return new WaitForSeconds(1);  
      
                  File.WriteAllText(filePath, "Overwritten file");  
                  Debug.Log("Overwritten file at: " + filePath);
      
                  yield return new WaitForSeconds(1);
      
                  File.WriteAllText(filePath, "Test manually flush");  
                  Debug.Log("Test file at: " + filePath);
      
                  yield return AutoSaveManager.Instance.Flush();
              }
          }
      }

      4.3 運行測試示例代碼

      接著,我們可以測試下上面的腳本!大家先自行創建一個新的項目工程,綁定好創建的 UOS App,開通 CRUD-Save 服務并安裝 SDK。

      然后在場景中創建一個空對象,可以暫時命名為 AutoSaveSample,將 AutoSaveSample.cs 腳本掛載給空對象,并為 Inspector 面板上的 userId 變量賦值,當前先暫時設置為:externalLogin_userId。

      然后運行項目,在 Console 控制臺可以看到相關的日志信息:說明存檔文件自動上傳成功了。

      進入「CRUD Save」「存檔管理」頁面,可以看到已經自動上傳的文件名為「autoSave」的存檔文件:

      在腳本中設置的 Application.persistentDataPath 路徑下,可以看到同時也有一份存檔文件的。當然,本地存檔的路徑,大家可以在腳本中自行設置的:

      4.4 本地存檔和云存檔的沖突解決

      當本地存檔和云端存檔因文件更新時間不一致發生沖突時,我們提供了以下三種沖突解決策略,大家可根據實際需求選擇適合的方式:

      public enum ConflictStrategy
          {
              // 默認,沖突時報錯:"本地存檔和云存檔存在沖突,需要手動解決。"
              Default = 0,
              // 拋棄本地存檔,保留云存檔
              DiscardLocal = 1,
              // 保留最后寫入存檔
              LastWrite = 3
          }

      Default(默認)

      • 含義:當本地存檔和云存檔更新時間不一致發生沖突時,系統會報錯,提示“本地存檔和云存檔存在沖突,需要手動解決”。

      • 適用場景:適合對存檔一致性要求很高的場景,需要開發者或用戶手動選擇用哪個存檔,防止數據丟失或覆蓋。

      DiscardLocal(拋棄本地存檔)

      • 含義:當發生沖突時,直接丟棄本地存檔,保留云端存檔的數據。

      • 適用場景:適合以云端數據為主的場景,比如多端同步,或者認為云端數據更權威、更安全的情況。

      LastWrite(保留最后寫入存檔)

      • 含義:無論是本地還是云端,誰最后寫入,誰的數據就被保留(即“最后寫入優先”)。

      • 適用場景:適合需要自動解決沖突、以最新操作為準的場景,比如頻繁切換設備、多人協作但只需最新進度的游戲。

      下節教程預告

      教程主題——《火拼24》系列教程四:微信小游戲CDN資源部署

      在《火拼24》系列教程第四章中,我們將聚焦于微信小游戲的 CDN 資源部署。教程將詳細介紹如何將游戲資源進行打包,并上傳到 CDN 平臺。通過本篇內容,你將掌握微信小游戲上線前資源部署的完整流程,為游戲的流暢運行和優質體驗提供有力保障。

      小貼士:為方便大家提前學習,教程第四章節的分支代碼已同步更新,可提前下載查閱或本地調試。

      • 教程四:初始項目工程(供學習參考)

      https://cnb.cool/unity/uos/Rush24Tutorial/-/tree/lesson4-start

      • 教程四:完整示例工程參考(可直接運行)

      https://cnb.cool/unity/uos/Rush24Tutorial/-/tree/lesson4-end

      記得鎖定更新,別錯過每一步關鍵指南!

      Unity Online Services (UOS) 是一個專為游戲開發者設計的一站式游戲云服務平臺,提供覆蓋游戲全生命周期的開發、運營和推廣支持。

      了解更多 UOS 相關信息:

      官網:https://uos.unity.cn

      技術交流 QQ 群:823878269

      Unity 官方微信

      第一時間了解Unity引擎動向,學習進階開發技能


      每一個“點贊”、“在看”,都是我們前進的動力

      特別聲明:以上內容(如有圖片或視頻亦包括在內)為自媒體平臺“網易號”用戶上傳并發布,本平臺僅提供信息存儲服務。

      Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

      相關推薦
      熱點推薦
      演都不演了?山寨《影之刃零》照搬官方:已被拿下

      演都不演了?山寨《影之刃零》照搬官方:已被拿下

      游民星空
      2026-02-04 19:54:45
      笑不活!350萬頁檔案查無川普,川黑白左的臉腫成豬頭

      笑不活!350萬頁檔案查無川普,川黑白左的臉腫成豬頭

      壹家言
      2026-02-04 00:48:53
      網貸逾期后被爆通訊錄,電話打到了四年沒聯系的高中同學手機上!

      網貸逾期后被爆通訊錄,電話打到了四年沒聯系的高中同學手機上!

      老湯胡說
      2026-02-04 18:07:10
      這位阿姨完全拿捏了黑色系高級感穿搭的精髓

      這位阿姨完全拿捏了黑色系高級感穿搭的精髓

      美女穿搭分享
      2026-01-15 11:09:49
      父親買了52公斤白銀,男子反復勸其收手,最終在暴跌前賣出45公斤:幸好當時感覺慌了,勸爸爸在高點賣出

      父親買了52公斤白銀,男子反復勸其收手,最終在暴跌前賣出45公斤:幸好當時感覺慌了,勸爸爸在高點賣出

      臺州交通廣播
      2026-02-05 01:03:34
      知道斬殺線后,再看《當幸福來敲門》:六處細思極恐,一個大Bug

      知道斬殺線后,再看《當幸福來敲門》:六處細思極恐,一個大Bug

      窺史
      2026-01-25 21:53:37
      臺海局勢有變?特朗普下緊急總統令,要舉全國之力將大陸一軍

      臺海局勢有變?特朗普下緊急總統令,要舉全國之力將大陸一軍

      絕對軍評
      2026-02-04 15:41:56
      國投瑞銀回應白銀LOF估值調整:未提前公告,意在避免恐慌與擠兌

      國投瑞銀回應白銀LOF估值調整:未提前公告,意在避免恐慌與擠兌

      華夏時報
      2026-02-04 09:49:29
      足金掛墜被指檢測出鐵銀鈀,周生生回應!官方:經雙方同意,由市監部門送檢

      足金掛墜被指檢測出鐵銀鈀,周生生回應!官方:經雙方同意,由市監部門送檢

      上觀新聞
      2026-02-04 12:55:55
      調查記者就是社會的良心

      調查記者就是社會的良心

      林中木白
      2026-02-04 18:31:45
      鰲太線2死1墜崖事件完整經過梳理:19歲高顏女大學生被活活凍死!

      鰲太線2死1墜崖事件完整經過梳理:19歲高顏女大學生被活活凍死!

      不二表姐
      2026-01-10 22:29:28
      女子因鉀過低不幸離世!告誡:平時寧愿少吃點肉,也要多吃這6物

      女子因鉀過低不幸離世!告誡:平時寧愿少吃點肉,也要多吃這6物

      阿兵科普
      2025-12-30 21:12:47
      天道好輪回,老牛吃嫩草的張紀中,如今終于把自己活成了“笑話”

      天道好輪回,老牛吃嫩草的張紀中,如今終于把自己活成了“笑話”

      老吳教育課堂
      2026-02-02 00:14:47
      彩電零售量跌破3000萬臺的惡果

      彩電零售量跌破3000萬臺的惡果

      家電圈
      2026-02-03 19:50:24
      企退人員喪葬費撫恤金新標準,養老金6000和3000,領取差一半嗎?

      企退人員喪葬費撫恤金新標準,養老金6000和3000,領取差一半嗎?

      另子維愛讀史
      2026-02-04 18:09:11
      刺激!iPhone17 Pro Max直降1500,降幅真的猛啊

      刺激!iPhone17 Pro Max直降1500,降幅真的猛啊

      科技堡壘
      2026-02-02 13:40:46
      不是奎因!廣東隊首個被裁外援曝光,杜鋒欽點之人將離隊?

      不是奎因!廣東隊首個被裁外援曝光,杜鋒欽點之人將離隊?

      緋雨兒
      2026-02-04 12:31:12
      王菲飛機上被拍,55歲老態盡顯,沒有網上吹的那么漂亮

      王菲飛機上被拍,55歲老態盡顯,沒有網上吹的那么漂亮

      東方不敗然多多
      2026-02-02 12:20:19
      1988年四川白巖溝那一戰,1516人圍攻2名逃兵,打了3天3夜,最后只拖出兩具燒焦的黑炭

      1988年四川白巖溝那一戰,1516人圍攻2名逃兵,打了3天3夜,最后只拖出兩具燒焦的黑炭

      史海孤雁
      2026-01-13 23:29:17
      這部被禁的國產片,憑什么在國外獲獎無數?

      這部被禁的國產片,憑什么在國外獲獎無數?

      霹靂炮
      2026-01-21 20:46:55
      2026-02-05 02:47:00
      Unity incentive-icons
      Unity
      Unity中國官方帳戶
      2437文章數 6729關注度
      往期回顧 全部

      游戲要聞

      HLE淪為最大笑柄!頂薪LPL教練回歸進入斬殺線,粉絲炸鍋開卡車

      頭條要聞

      女子痛斥愛潑斯坦:我一次又一次被強奸 他禽獸不如

      頭條要聞

      女子痛斥愛潑斯坦:我一次又一次被強奸 他禽獸不如

      體育要聞

      哈登回應交易:不想讓自己拖累快船的未來

      娛樂要聞

      春晚主持人陣容曝光,5位都是老面孔

      財經要聞

      白銀,突然暴漲

      科技要聞

      太煩人遭投訴!元寶紅包鏈接被微信屏蔽

      汽車要聞

      綜合續航1730km 5座中級電混SUV吉利銀河M7官圖發布

      態度原創

      藝術
      數碼
      時尚
      教育
      游戲

      藝術要聞

      133.8億!深圳自貿時代中心,年內竣工!

      數碼要聞

      vivo聯合中國聯通推出“eSIM手表嘗鮮季”活動

      60歲的劉嘉玲、章小蕙太美了!港女的魅力從不是少女感

      教育要聞

      數學提分,往往從復盤開始

      游戲動力×ATK 聯動福利紅包封面隨機掉落!

      無障礙瀏覽 進入關懷版