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 Requester、public 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 前綴的實例方法 (RequestTexture2D ↔ SelfRequestTexture2D、InitLRUCacheCapacityForText ↔ SelfInitLRUCacheCapacityForText 等),參數與行為完全相同,差別只在快取範圍:
- 靜態調用:透過內部單例運作,全專案共用同一組全域快取,一般情境使用這個即可。
- 實例調用 (
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 底層快取的是 Texture2D,Sprite 本身每次呼叫都會重新 Sprite.Create,頻繁使用時建議自行持有建立出的 Sprite。
注意 重新呼叫 Init 系列方法會清除並重建該類型的快取 (已快取項目將被淘汰處理),建議於啟動時初始一次即可。
超時與取消
- 未傳入
cts:內部會自行建立CancellationTokenSource並套用timeoutSeconds(未指定時預設 180 秒) 作為超時保護。 - 傳入自訂
cts:timeoutSeconds不會生效,完全由呼叫端控制取消時機。
重要 持有請求結果的物件銷毀時,請記得 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)。 |