Unity 使用熱更新實作遊戲版本檢查


建立時間: 2023年8月6日 01:32
更新時間: 2023年9月14日 08:25

說明

分享簡易版遊戲版本檢查功能,可用來通知使用者更新應用程式,原本目的是為了通知使用者更新最新版的應用程式而實作出來的功能。

要求

此功能需使用到 Unity Addressables 熱更新的功能,若尚未設置 Unity Addressables 的讀者可先參考 Unity 使用 Addressables 實現熱更新

功能介紹

我們會使用 json 檔記錄最新版的遊戲版本號碼,然後上傳到 Unity Addressables 伺服器,接著比對應用程式版本號碼與伺服器的 json 檔紀錄的版本號碼是否一致。

建立 json

在專案 Assets 資料夾底下建立一個 json 檔,檔案位置、名稱可自訂,json 檔會被當作 Text Asset。

GameInformation.json

{
    "requiredVersion": "0.0.0",
    "version": "1.0.0"
}

GameInformation.json 勾選 Addressable,Group 位置可以自訂或預設,記得 Group 的 Build & Load Paths 要選擇 Remote,這樣才能讀到遠端地址。

建立 json 物件

建立腳本讀取 json 檔資料。

GameInformation.cs

using System;
using UnityEngine;

/// <summary>
/// 遊戲資訊,用來存取 Game Information Addressable。
/// </summary>
[Serializable]
public class GameInformation
{
    /// <summary>
    /// 要求版本
    /// </summary>
    [SerializeField]
    private string requiredVersion = "0.0.0";

    /// <summary>
    /// 遊戲版本號
    /// </summary>
    [SerializeField]
    private string version = "0.0.0";

    /// <summary>
    /// 要求版本
    /// </summary>
    public string RequiredVersion => requiredVersion;

    /// <summary>
    /// 遊戲版本號
    /// </summary>
    public string Version => version;

    /// <summary>
    /// 檢查是否符合最低版本需求
    /// </summary>
    /// <returns></returns>
    public bool CheckMinimumVersion()
    {
        /// required version < application version = -1
        /// required version = application version = 0
        /// required version > application version = 1
        return requiredVersion.CompareTo(Application.version) < 1;
    }

    /// <summary>
    /// 檢查是否是最新版本
    /// </summary>
    /// <returns></returns>
    public bool IsLatestVersion()
    {
        return version == Application.version;
    }

    /// <summary>
    /// 使用 json 實體化物件
    /// </summary>
    /// <param name="jsonString">json 內容</param>
    /// <returns></returns>
    public static GameInformation CreateFromJSON(string jsonString)
    {
        return JsonUtility.FromJson<GameInformation>(jsonString);
    }
}

因為 json 檔有 version 資料,所以 GameInformation.cs 也要有 version 屬性,這裡我設定成 private 是比較嚴謹的寫法,一般可直接寫 public。

其他更詳細的 JsonUtility 功能請參考官方文件 JsonUtility.FromJson

檢查版本功能

前置作業都準備好後就可以來實作檢查版本功能。

VersionChecking.cs

using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine;

/// <summary>
/// 預載 Addressables 資源
/// </summary>
internal class VersionChecking : MonoBehaviour
{
    /// <summary>
    /// 遠端遊戲資訊
    /// </summary>
    [SerializeField]
    private AssetReferenceT<TextAsset> gameInformationReference;

    private void Start()
    {
        CheckAppVersion();
    }

    /// <summary>
    /// 檢查應用程式版本
    /// </summary>
    private async void CheckAppVersion()
    {
        Debug.Log("檢查版本中...");

        AsyncOperationHandle<TextAsset> handle =
            gameInformationReference.LoadAssetAsync<TextAsset>();

        await handle.Task;

        if (handle.Status == AsyncOperationStatus.Succeeded)
        {
            string jsonText = handle.Result.text;
            var gameInformation = GameInformation.CreateFromJSON(jsonText);

            if (gameInformation.IsLatestVersion())
            {
                Debug.Log("版本已為最新版");
            }
            else
            {
                Debug.Log("請更新應用程式");
            }
        }
        else
        {
            Debug.Log("檢查版本失敗");
        }
        Addressables.Release(handle);
    }
}

將此腳本放在一個空的遊戲物件就能運行了,在 Inspector gameInformationReference 放上 GameInformation.json

我只保留最基本的版本檢查功能,後續要怎麼處理就因人而異了,像我就只有跳出一個前往更新的按鈕,按鈕是開啟 App 下載位置的網址。

應用程式上架審核問題

最近遇到一件事情,就是當你在發布新版本的應用程式之前,需要審核,所以需要上傳新的 Addressable 資料到伺服器,假設是1.0.0,但目前版本是0.0.1,這樣會遇到一個進退兩難的情況,上傳新的 Addressable,審核的應用程式1.0.0可正常運行,0.0.1不能正常運行,因為版本不符合,但如果不上傳新的 Addressable,審核的應用程式1.0.0就無法正常運行。

這也是一個水很深的問題,我大概了解 Addressables 是看 catalog_version.json 檔案來取得 Addressable 資料,version 是 Player Settings… 設定的 Version 應用程式版本,所以在審核之前先保留 catalog_0_0_1.json 也就是0.0.1版的就資料,然後再建立新版本的 Addressable 資料,就會產生兩組不同版本的資料,你也會看到另一個 catalog_1_0_0.json 檔案,這樣就能解決這個問題,但這只是我個人的猜測,因為難以驗證我的猜想是否正確,需等我之後的遊戲運行時看是否有狀況。

最後審核通過後,就可以只保留最新版的 Addressable 資料就好。

另一個解決辦法是增加一些屬性來控制是否要讓玩家更新,這個邏輯太難想了,所以我放棄這個方法。

結論

這是我目前已知的一種遊戲版本檢查辦法,其實我還有思考建立資料庫,但目前尚未找到方案,使用此方法需記得要更新 json 檔並上傳到伺服器。

觀看次數: 1443
addressableunityversion熱更新版本檢查
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!