Files
AIGame/AIClient/Assets/AOT/Scripts/Patch/VersionClient.cs
T
udxandCursor b7a0bbcb89 Add hot-update boot pipeline, UI bundles/atlas assets, and design docs.
Ignore AIClient/Library and AIClient/HybridCLRData permanently; include HybridCLR/YooAsset project setup and UI tooling.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-21 16:02:58 +08:00

89 lines
2.6 KiB
C#

using System;
using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;
namespace AOT.Patch
{
public sealed class VersionClient
{
readonly string _url;
readonly bool _allowStreamingFallback;
public VersionClient(string url, bool allowStreamingFallback)
{
_url = url;
_allowStreamingFallback = allowStreamingFallback;
}
public IEnumerator Fetch(Action<VersionInfo, string> onDone)
{
string error = null;
VersionInfo info = null;
if (!string.IsNullOrEmpty(_url))
{
using (var req = UnityWebRequest.Get(_url))
{
req.timeout = 15;
yield return req.SendWebRequest();
#if UNITY_2020_2_OR_NEWER
bool failed = req.result != UnityWebRequest.Result.Success;
#else
bool failed = req.isNetworkError || req.isHttpError;
#endif
if (!failed)
{
info = VersionInfo.FromJson(req.downloadHandler.text);
if (info == null)
error = "version.json parse failed";
}
else
{
error = req.error;
}
}
}
if (info == null && _allowStreamingFallback)
{
var localPath = Path.Combine(Application.streamingAssetsPath, "cdn", "version.json");
yield return ReadLocalText(localPath, text =>
{
if (!string.IsNullOrEmpty(text))
{
info = VersionInfo.FromJson(text);
if (info != null)
error = null;
}
});
}
onDone?.Invoke(info, error);
}
static IEnumerator ReadLocalText(string path, Action<string> onDone)
{
#if UNITY_ANDROID && !UNITY_EDITOR
using (var req = UnityWebRequest.Get(path))
{
yield return req.SendWebRequest();
#if UNITY_2020_2_OR_NEWER
bool failed = req.result != UnityWebRequest.Result.Success;
#else
bool failed = req.isNetworkError || req.isHttpError;
#endif
onDone?.Invoke(failed ? null : req.downloadHandler.text);
}
#else
if (File.Exists(path))
onDone?.Invoke(File.ReadAllText(path));
else
onDone?.Invoke(null);
yield break;
#endif
}
}
}