跳至主要内容

Requester

重要 注意 提醒

Coding Style wiki


Requester 是基於 UniTask + UnityWebRequest 的資源請求器,支援 AudioClip、Texture2D、Sprite、byte[]、string 的網路/檔案請求,並可搭配 ARC 或 LRU 快取 (以 URL 為 Key),具有超時 (預設 180 秒)取消 (CancellationTokenSource) 機制;失敗時透過 errorAction 回傳 ErrorInfo

命名空間OxGKit.Utilities.Requester
類型public class Requesterpublic struct ErrorInfo
原始碼Requester.cs
using Cysharp.Threading.Tasks;
using OxGKit.Utilities.Requester;

注意 本頁列出的 static 方法皆透過內部懶漢式單例運作;各方法皆有對應 Self 前綴的實例方法 (例如 SelfRequestTexture2D),可自行 new Requester() 建立獨立快取範圍的實例使用 (詳見靜態調用與實例調用)。

快速上手

using Cysharp.Threading.Tasks;
using OxGKit.Utilities.Requester;
using System.Threading;
using UnityEngine;

// 啟動時初始各資源類型的快取容量 (ARC 或 LRU 擇一)
Requester.InitARCCacheCapacityForAudio(20);
Requester.InitARCCacheCapacityForTexture2d(60);
Requester.InitARCCacheCapacityForText(100);

// 請求 Texture2D (cached = true 時以 URL 為 Key 快取)
Texture2D t2d = await Requester.RequestTexture2D
(
url,
(texture) => Debug.Log($"Loaded: {texture.width}x{texture.height}"),
(error) => Debug.Log($"Error: {error.message}")
);

// 請求 AudioClip (需指定正確的 AudioType)
AudioClip clip = await Requester.RequestAudio(url, AudioType.OGGVORBIS);

// 搭配 CancellationTokenSource 綁定生命週期
var cts = new CancellationTokenSource();
string text = await Requester.RequestText(url, null, null, cts);
// 物件銷毀時取消請求
cts.Cancel();

通用規則

靜態調用與實例調用 (Self 系列)

Requester每個靜態方法皆有對應 Self 前綴的實例方法 (RequestTexture2DSelfRequestTexture2DInitLRUCacheCapacityForTextSelfInitLRUCacheCapacityForText 等),參數與行為完全相同,差別只在快取範圍

  • 靜態調用:透過內部單例運作,全專案共用同一組全域快取,一般情境使用這個即可。
  • 實例調用 (new 方式):自行 new Requester() 建立實例後調用 Self* 方法,該實例擁有完全獨立的快取範圍 (容量設定、清除、釋放皆互不影響),適合特定功能需要自管快取生命週期的情境 (例如聊天室頭像、活動頁圖片,離場時整批釋放)。
using OxGKit.Utilities.Requester;

// 靜態調用 (全域共用快取)
var tex = await Requester.RequestTexture2D(url);

// 實例調用 (new 方式,建立獨立快取範圍)
var chatRequester = new Requester();

// 為該實例初始獨立的 LRU 快取容量
chatRequester.SelfInitLRUCacheCapacityForTexture2d(30);

// 以 Self 方法發出請求 (快取只進這個實例)
var avatar = await chatRequester.SelfRequestTexture2D(avatarUrl);

// 離場時整批釋放該實例的快取 (不影響全域快取)
chatRequester.SelfRelease();

提醒 本頁後續章節以靜態簽名列出,所有方法皆有同名的 Self 實例版本,直接加上 Self 前綴即可對應調用。

快取機制

  • 快取以 URL 為 Key,命中時直接回傳並觸發 successAction (不再發出請求)。
  • 每種資源類型 (Audio / Texture2d / Text) 只允許一種快取策略:初始 ARC 會清除並停用 LRU,反之亦然。
  • 未初始任何快取時,cached 參數不會有作用 (不做快取)。
  • RequestBytes 不提供快取 (每次皆重新請求)。

提醒 RequestSprite 底層快取的是 Texture2DSprite 本身每次呼叫都會重新 Sprite.Create,頻繁使用時建議自行持有建立出的 Sprite。

注意 重新呼叫 Init 系列方法清除並重建該類型的快取 (已快取項目將被淘汰處理),建議於啟動時初始一次即可。

超時與取消

  • 未傳入 cts:內部會自行建立 CancellationTokenSource 並套用 timeoutSeconds (未指定時預設 180 秒) 作為超時保護。
  • 傳入自訂 ctstimeoutSeconds 不會生效,完全由呼叫端控制取消時機。

重要 持有請求結果的物件銷毀時,請記得 cts.Cancel() 取消尚未完成的請求,避免回呼觸發在已釋放的物件上。

錯誤處理

  • URL 為 null 或空字串、請求失敗 (ConnectionError / ProtocolError / DataProcessingError) 或發生例外時,會透過 errorAction 回傳 ErrorInfo,且回傳值為 null (default)
  • 錯誤同時會透過 OxGKit.LoggingSystem 輸出 (日誌器名稱 OxGKit.Utilities.Logger)。

ErrorInfo

public struct ErrorInfo
{
public string url;
public string message;
public Exception exception;
}

請求失敗時透過 errorAction 回傳的錯誤資訊。

成員說明
url請求的 URL (URL 缺失時為 null)。
message錯誤訊息 (UnityWebRequest.error)。
exception例外資訊 (非例外錯誤時為 null)。

請求方法

方法總覽

方法 (static)Self 實例版本 (new 方式)說明
RequestAudioSelfRequestAudio請求 AudioClip (可快取)。
RequestTexture2DSelfRequestTexture2D請求 Texture2D (可快取)。
RequestSpriteSelfRequestSprite請求並建立 Sprite (底層快取 Texture2D)。
RequestBytesSelfRequestBytes請求檔案 byte[] (不快取)。
RequestTextSelfRequestText請求文字內容 (可快取)。

RequestAudio

public static async UniTask<AudioClip> RequestAudio(string url, AudioType audioType = AudioType.MPEG, Action<AudioClip> successAction = null, Action<ErrorInfo> errorAction = null, CancellationTokenSource cts = null, bool cached = true, int? timeoutSeconds = null)

請求 AudioClip (串流下載),需依音訊檔案格式指定正確的 audioType (預設 AudioType.MPEG)。

AudioClip clip = await Requester.RequestAudio
(
"https://example.com/audio.ogg",
AudioType.OGGVORBIS,
(audioClip) => audioSource.PlayOneShot(audioClip),
(error) => Debug.Log($"Error: {error.message}")
);

注意 audioType 與檔案格式不符會導致解碼失敗;WebGL 平台對串流音訊有限制,請自行驗證支援格式。

RequestTexture2D

public static async UniTask<Texture2D> RequestTexture2D(string url, Action<Texture2D> successAction = null, Action<ErrorInfo> errorAction = null, CancellationTokenSource cts = null, bool cached = true, int? timeoutSeconds = null)

請求 Texture2Dcached = true 且已初始快取時,同 URL 的第二次請求將直接回傳快取。

Texture2D t2d = await Requester.RequestTexture2D
(
"https://example.com/image.png",
(texture) => rawImage.texture = texture
);

RequestSprite

public static async UniTask<Sprite> RequestSprite(string url, Action<Sprite> successAction = null, Action<ErrorInfo> errorAction = null, Vector2 position = default, Vector2 pivot = default, float pixelPerUnit = 100, uint extrude = 0, SpriteMeshType meshType = SpriteMeshType.FullRect, CancellationTokenSource cts = null, bool cached = true, int? timeoutSeconds = null)

請求 Texture2D 後以 Sprite.Create 建立 Sprite 回傳;pivot 未指定 (為 Vector2.zero) 時自動套用中心點 (0.5f, 0.5f)

Sprite sprite = await Requester.RequestSprite
(
"https://example.com/icon.png",
(sp) => image.sprite = sp
);

RequestBytes

public static async UniTask<byte[]> RequestBytes(string url, Action<byte[]> successAction = null, Action<ErrorInfo> errorAction = null, CancellationTokenSource cts = null, int? timeoutSeconds = null)

請求檔案的 byte[] 內容,不提供快取 (無 cached 參數)。

byte[] bytes = await Requester.RequestBytes("https://example.com/file.bin");

RequestText

public static async UniTask<string> RequestText(string url, Action<string> successAction = null, Action<ErrorInfo> errorAction = null, CancellationTokenSource cts = null, bool cached = true, int? timeoutSeconds = null)

請求文字內容 (string),cached = true 且已初始快取時以 URL 為 Key 快取。

string json = await Requester.RequestText("https://example.com/config.json");

快取管理

方法總覽

方法 (static)Self 實例版本 (new 方式)說明
InitARCCacheCapacityFor...SelfInitARCCacheCapacityFor...初始指定資源類型的 ARC 快取容量 (會停用該類型的 LRU 快取)。
InitLRUCacheCapacityFor...SelfInitLRUCacheCapacityFor...初始指定資源類型的 LRU 快取容量 (會停用該類型的 ARC 快取)。
RemoveFromARCCacheFor...SelfRemoveFromARCCacheFor...從指定資源類型的 ARC 快取中移除 URL。
RemoveFromLRUCacheFor...SelfRemoveFromLRUCacheFor...從指定資源類型的 LRU 快取中移除 URL。
ClearARCCacheCapacityFor...SelfClearARCCacheCapacityFor...清空指定資源類型的 ARC 快取。
ClearLRUCacheCapacityFor...SelfClearLRUCacheCapacityFor...清空指定資源類型的 LRU 快取。
AutoRemoveFromCachesSelfAutoRemoveFromCaches搜尋所有快取並移除指定 URL。
ClearAllCachesSelfClearAllCaches清空所有快取。
ReleaseSelfRelease清空並釋放所有快取容器。

InitARCCacheCapacityFor...

public static void InitARCCacheCapacityForAudio(int capacity = 20)

public static void InitARCCacheCapacityForTexture2d(int capacity = 60)

public static void InitARCCacheCapacityForText(int capacity = 100)

初始指定資源類型的 ARC 快取容量;同類型僅允許一種快取策略,呼叫後會清除並停用該類型的 LRU 快取。

Requester.InitARCCacheCapacityForTexture2d(60);

InitLRUCacheCapacityFor...

public static void InitLRUCacheCapacityForAudio(int capacity = 20)

public static void InitLRUCacheCapacityForTexture2d(int capacity = 60)

public static void InitLRUCacheCapacityForText(int capacity = 80)

初始指定資源類型的 LRU 快取容量;呼叫後會清除並停用該類型的 ARC 快取。

Requester.InitLRUCacheCapacityForTexture2d(60);

RemoveFromARCCacheFor...

public static bool RemoveFromARCCacheForAudio(string url)

public static bool RemoveFromARCCacheForTexture2d(string url)

public static bool RemoveFromARCCacheForText(string url)

從指定資源類型的 ARC 快取中移除 URL 項目,移除成功回傳 true

RemoveFromLRUCacheFor...

public static bool RemoveFromLRUCacheForAudio(string url)

public static bool RemoveFromLRUCacheForTexture2d(string url)

public static bool RemoveFromLRUCacheForText(string url)

從指定資源類型的 LRU 快取中移除 URL 項目,移除成功回傳 true

ClearARCCacheCapacityFor...

public static void ClearARCCacheCapacityForAudio()

public static void ClearARCCacheCapacityForTexture2d()

public static void ClearARCCacheCapacityForText()

清空指定資源類型的 ARC 快取 (逐一觸發淘汰處理)。

ClearLRUCacheCapacityFor...

public static void ClearLRUCacheCapacityForAudio()

public static void ClearLRUCacheCapacityForTexture2d()

public static void ClearLRUCacheCapacityForText()

清空指定資源類型的 LRU 快取 (逐一觸發淘汰處理)。

AutoRemoveFromCaches

public static bool AutoRemoveFromCaches(string url)

搜尋所有快取 (ARC 與 LRU 的 Audio / Texture2d / Text),找到指定 URL 即移除並回傳 true

Requester.AutoRemoveFromCaches(url);

ClearAllCaches

public static void ClearAllCaches()

清空所有已初始的快取 (ARC 與 LRU 的 Audio / Texture2d / Text)。

Release

public static void Release()

清空所有快取並釋放快取容器 (歸 null),需再次呼叫 Init 系列方法才會恢復快取功能。

提醒 被快取的 Unity 物件 (AudioClip / Texture2D) 於淘汰或移除時會自動 Destroy (詳見 Cacher);未快取 (cached = false) 的物件不再使用時,需自行 Destroy 釋放記憶體。