MediaFrames
Coding Style wiki
MediaFrames 是 MediaFrame 模組的統一呼叫入口(Facade),以巢狀靜態類提供 AudioFrame(音訊)與 VideoFrame(影片)兩組介面,涵蓋媒體資源的預載、播放、暫停、恢復、停止與卸載,底層皆具備引用計數管理。
| 命名空間 | OxGFrame.MediaFrame |
| 類型 | public static class |
| 原始碼 | MediaFrames.cs |
using OxGFrame.MediaFrame;
注意 呼叫前需確保場景中已建置對應的 AudioManager / VideoManager 物件,相關設定請參考 MediaFrame 介紹。
快速上手
// 預載 BGM
await MediaFrames.AudioFrame.Preload("TitleBgm");
// 播放 BGM(-1 = 無限循環)
var bgm = await MediaFrames.AudioFrame.Play("TitleBgm", null, -1);
// 播放音效(使用 res# 前綴,改由 Resources 載入)
await MediaFrames.AudioFrame.Play("res#Audio/Sound/ClickSfx");
// 播放過場影片
var video = await MediaFrames.VideoFrame.Play("OpeningCutscene");
// 停止 BGM
MediaFrames.AudioFrame.Stop("TitleBgm");
// 影片確定不再使用時,強制卸載釋放記憶體
MediaFrames.VideoFrame.ForceUnload("OpeningCutscene");
通用規則
資源名稱前綴
assetName 支援前綴解析,依前綴決定資源載入來源:
| 前綴 | 說明 | 範例 |
|---|---|---|
| res# | 從 Unity 原生 Resources 載入資源(依 Resources 相對路徑)。 | res#Audio/Sound/ClickSfx |
| 無前綴 | 預設從 Asset Bundle (YooAsset) 載入資源(直接使用可尋址名稱 Address)。 | TitleBgm |
資源包 (Package)
Preload 與 Play 皆提供 packageName 多載:
- 未指定
packageName:自動使用預設 Package(AssetPatcher.GetDefaultPackageName())。 - 指定
packageName:從指定的 Package 載入資源,適用於多 Package 分包管理。
引用計數與生命週期
注意 MediaFrames 底層皆具備引用計數管理。媒體實例銷毀時,若該資源已無其他同名實例存在(引用歸零),且啟用 onDestroyAndUnload 設定,將自動連動 AssetLoader 卸載資源。
提醒 媒體實例的銷毀時機,可由 Prefab 上 AudioBase / VideoBase 元件的 onStopAndDestroy(停止時銷毀)與 onDestroyAndUnload(銷毀時卸載)設定控制,也可於呼叫 Stop 時傳入 forceDestroy 強制銷毀。
MediaFrames.AudioFrame
音訊的統一操作介面。專門負責管理遊戲中的所有音訊(如 BGM、環境音、語音、音效),支援依 SoundType 分類管理,並與 Unity 的 AudioMixer 深度整合。
方法總覽
初始化與元件存取
| 方法 | 說明 |
|---|---|
| InitInstance | 初始化 AudioManager 單例實例。 |
| GetComponent<T> | 取得指定名稱的音訊實例元件(首個匹配)。 |
| GetComponents<T> | 取得指定名稱的所有音訊實例元件。 |
Mixer 控制
| 方法 | 說明 |
|---|---|
| GetMixerByName | 依名稱取得已註冊於 AudioManager 的 AudioMixer。 |
| SetMixerExposedParam | 設定 Mixer 的 Exposed Parameter 數值(自動記錄)。 |
| ClearMixerExposedParam | 清除 Mixer 的 Exposed Parameter 設定(恢復預設值)。 |
| AutoClearMixerExposedParams | 批次清除已記錄的 Exposed Parameters。 |
| AutoRestoreMixerExposedParams | 批次還原已記錄的 Exposed Parameters。 |
| GetMixerSnapshot | 取得 Mixer 中指定名稱的 Snapshot。 |
| SetMixerSnapshot | 立即切換至指定的 Snapshot。 |
| SetMixerTransitionToSnapshot | 在指定時間內加權混合過渡至多個 Snapshots。 |
播放與資源管理
| 方法 | 說明 |
|---|---|
| Preload | 預載音訊資源至快取。 |
| Play | 播放音訊,回傳 AudioBase 實例。 |
| Pause | 暫停指定名稱的音訊。 |
| PauseAll | 暫停所有音訊。 |
| ResumeAll | 恢復所有處於暫停狀態的音訊。 |
| Stop | 停止指定名稱的音訊。 |
| StopAll | 停止所有音訊。 |
| ForceUnload | 強制卸載指定名稱的音訊資源。 |
InitInstance
public static void InitInstance()
說明
主動初始化 AudioManager 單例實例。建議於遊戲啟動階段呼叫一次,確保管理器提前就緒。
注意 若場景中不存在 AudioManager 物件,將輸出錯誤日誌。
GetComponent<T>
public static T GetComponent<T>(string assetName) where T : AudioBase
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| assetName | string | 音訊資源名稱。 |
回傳值
T — 首個名稱匹配的音訊實例元件;查無時回傳 null。
說明
取得指定名 稱的音訊實例上的 AudioBase 元件。僅能取得已進入播放管理列表的實例(即呼叫過 Play 之後),僅預載的資源尚未實例化,無法取得。
範例
var audBase = MediaFrames.AudioFrame.GetComponent<AudioBase>("TitleBgm");
if (audBase != null && audBase.IsPlaying())
{
// 對實例進行進階操作
}
GetComponents<T>
public static T[] GetComponents<T>(string assetName) where T : AudioBase
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| assetName | string | 音訊資源名稱。 |
回傳值
T[] — 所有名稱匹配的音訊實例元件陣列;查無時回傳空陣列。
說明
取得指定名稱的所有音訊實例元件。當同名音訊同時存在複數實例時(如多重播放的音效),可透過此方法批次取得。
GetMixerByName
public static AudioMixer GetMixerByName(string mixerName)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| mixerName | string | Mixer 名稱。 |
回傳值
AudioMixer — 名稱匹配的 Mixer;未註冊或查無時回傳 null。
說明
依名稱取得 AudioMixer。
重要 必須先將 AudioMixer 掛載至場景中 AudioManager 的 Audio Mixer 清單(Inspector),才能透過此方法取得。
範例
var mixer = MediaFrames.AudioFrame.GetMixerByName("MasterMixer");
SetMixerExposedParam
public static void SetMixerExposedParam(AudioMixer mixer, string expParam, float val)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| mixer | AudioMixer | 目標 Mixer。 |
| expParam | string | Exposed Parameter 名稱。 |
| val | float | 設定數值。 |
說明
設定 Mixer 的 Exposed Parameter 數值(如分組音量控制)。設定成功時會自動記錄該參數值,供 AutoRestoreMixerExposedParams 還原使用。
範例
var mixer = MediaFrames.AudioFrame.GetMixerByName("MasterMixer");
// 將 BGM 分組音量調降至 -20 dB
MediaFrames.AudioFrame.SetMixerExposedParam(mixer, "BgmVol", -20f);
ClearMixerExposedParam
public static void ClearMixerExposedParam(AudioMixer mixer, string expParam)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| mixer | AudioMixer | 目標 Mixer。 |
| expParam | string | Exposed Parameter 名稱。 |
說 明
清除指定 Exposed Parameter 的自定義設定,恢復為 Mixer 的預設值。
AutoClearMixerExposedParams
public static void AutoClearMixerExposedParams(AudioMixer mixer)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| mixer | AudioMixer | 目標 Mixer。 |
說明
將該 Mixer 先前透過 SetMixerExposedParam 記錄過的參數批次清除(恢復 Mixer 預設值;其他 Mixer 的記 錄不受影響),記錄值仍會保留,可再透過 AutoRestoreMixerExposedParams 還原。
AutoRestoreMixerExposedParams
public static void AutoRestoreMixerExposedParams(AudioMixer mixer)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| mixer | AudioMixer | 目標 Mixer。 |
說明
將該 Mixer 先前記錄過的參數值批次還原。常用於清除後的參數復原。
GetMixerSnapshot
public static AudioMixerSnapshot GetMixerSnapshot(AudioMixer mixer, string snapshotName)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| mixer | AudioMixer | 目標 Mixer。 |
| snapshotName | string | Snapshot 名稱。 |
回傳值
AudioMixerSnapshot — 名稱匹配的 Snapshot;查無時回傳 null。
說明
取得 Mixer 中指定名稱的 Snapshot。
SetMixerSnapshot
public static void SetMixerSnapshot(AudioMixer mixer, string snapshotName)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| mixer | AudioMixer | 目標 Mixer。 |
| snapshotName | string | Snapshot 名稱。 |
說明
立即切換至指定的 Snapshot(內部以 0.02 秒極短時間過渡)。查無 Snapshot 時不動作。
範例
var mixer = MediaFrames.AudioFrame.GetMixerByName("MasterMixer");
// 進入洞窟場景,切換至洞窟音場
MediaFrames.AudioFrame.SetMixerSnapshot(mixer, "Cave");
SetMixerTransitionToSnapshot
public static void SetMixerTransitionToSnapshot(AudioMixer mixer, AudioMixerSnapshot[] snapshots, float[] weights, float timeToReach = 0.02f)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| mixer | AudioMixer | 目標 Mixer。 |
| snapshots | AudioMixerSnapshot[] | 參與混合的 Snapshots。 |
| weights | float[] | 各 Snapshot 的混合權重(與 snapshots 一一對應)。 |
| timeToReach | float | 過渡時間(秒)。 預設值: 0.02f |
說明
在指定時間內,依權重平滑過渡至多個 Snapshots 的混合狀態,適用於漸進式的環境音場變化。
範例
var mixer = MediaFrames.AudioFrame.GetMixerByName("MasterMixer");
var normal = MediaFrames.AudioFrame.GetMixerSnapshot(mixer, "Normal");
var cave = MediaFrames.AudioFrame.GetMixerSnapshot(mixer, "Cave");
// 2 秒內過渡至 30% Normal + 70% Cave 的混合音場
MediaFrames.AudioFrame.SetMixerTransitionToSnapshot(
mixer,
new AudioMixerSnapshot[] { normal, cave },
new float[] { 0.3f, 0.7f },
2f
);
Preload
public static async UniTask Preload(string assetName)
public static async UniTask Preload(string[] assetNames)
public static async UniTask Preload(string packageName, string assetName)
public static async UniTask Preload(string packageName, string[] assetNames)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| packageName | string | 資源包名稱。未指定時,使用預設 Package。 |
| assetName | string | 音訊資源名稱(Bundle 資源使用 Address 名稱;支援 res# 前綴)。 |
| assetNames | string[] | 音訊資源名稱陣列(批次預載)。 |
回傳值
UniTask — 可等待的非同步操作。
說明
預先將音訊資源載入至快取。之後呼叫 Play 時可直接從快取取用,避免播放當下產生載入延遲。
範例
// 單一預載
await MediaFrames.AudioFrame.Preload("TitleBgm");
// 批次預載
await MediaFrames.AudioFrame.Preload(new string[]
{
"TitleBgm",
"res#Audio/Sound/ClickSfx"
});
Play
public static async UniTask<AudioBase> Play(string assetName, Transform parent = null, int loops = 0, float volume = 0f)
public static async UniTask<AudioBase> Play(string packageName, string assetName, Transform parent = null, int loops = 0, float volume = 0f)
public static async UniTask<AudioBase> Play(string assetName, AudioClip sourceClip, Transform parent = null, int loops = 0, float volume = 0f)
public static async UniTask<AudioBase> Play(string packageName, string assetName, AudioClip sourceClip, Transform parent = null, int loops = 0, float volume = 0f)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| packageName | string | 資源包名稱。未指定時,使用預設 Package。 |
| assetName | string | 音訊資源名稱(Bundle 資源使用 Address 名稱;支援 res# 前綴)。 |
| sourceClip | AudioClip | 音訊剪輯來源。指定時,將直接覆寫實例上的 audioClip(適用於動態指定音訊內容)。 |
| parent | Transform | 掛載的父節點(用於 3D 音訊定位)。 預設值: null(依 SoundType 自動掛載至 AudioManager 下的對應節點) |
| loops | int | 循環次數。-1 = 無限循環;> 0 = 指定循環次數。預設值: 0(使用 Prefab 上 AudioBase 的循環設定) |
| volume | float | 音量。> 0 時覆寫音量。預設值: 0f(使用 AudioSource 上的預設音量) |
回傳值
UniTask<AudioBase> — 播放中的音訊實例元件;載入失敗時回傳 null。
說明
載入並播放指定的音訊。
注意- 若同名音訊已在播放中,且其
SoundType為Sole(如 BGM),不會重複播放,將直接回傳既有實例。 - 若同名音訊處於暫停狀態,呼叫後會恢復播放。
範例
// 播放 BGM(無限循環)
var bgm = await MediaFrames.AudioFrame.Play("TitleBgm", null, -1);
// 從 Resources 播放音效
await MediaFrames.AudioFrame.Play("res#Audio/Sound/ClickSfx");
// 指定 Package 並以 0.8 音量播放
await MediaFrames.AudioFrame.Play("OtherPackage", "Npc01Voice", volume: 0.8f);
// 動態指定 AudioClip 播放
await MediaFrames.AudioFrame.Play("SfxTemplate", downloadedClip);
Pause
public static void Pause(string assetName)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| assetName | string | 音訊資源名稱。 |
說明
暫停指 定名稱的所有音訊實例。可透過 Play 或 ResumeAll 恢復播放。
PauseAll
public static void PauseAll()
說明
暫停所有播放中的音訊。
ResumeAll
public static void ResumeAll()
說明
恢復所有處於暫停狀態的音訊,對播放中的音訊不產生影響。
Stop
public static void Stop(string assetName, bool disableEndEvent = false, bool forceDestroy = false)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| assetName | string | 音訊資源名稱。 |
| disableEndEvent | bool | 是否禁用結束事件回呼(EndEvent),停止時將不觸發播放結束的後續處理。預設值: false |
| forceDestroy | bool | 是否強制銷毀實例物件。未強制時,依 Prefab 上 onStopAndDestroy 設定決定。預設值: false |
說明
停止指定名稱的所有音訊實例。實例銷毀時將連動引用計數,決定是否自動卸載資源(參考引用計數與生命週期)。
範例
// 一般停止(依 Prefab 設定決定是否銷毀)
MediaFrames.AudioFrame.Stop("TitleBgm");
// 停止 + 不觸發結束事件 + 強制銷毀
MediaFrames.AudioFrame.Stop("TitleBgm", true, true);
StopAll
public static void StopAll(bool disableEndEvent = false, bool forceDestroy = false)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| disableEndEvent | bool | 是否禁用結束事件回呼。 預設值: false |
| forceDestroy | bool | 是否強制銷毀實例物件。 預設值: false |
說明
停止所有音訊實例,參數行為同 Stop。
ForceUnload
public static void ForceUnload(string assetName)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| assetName | string | 音訊資源名稱。 |
說明
略過引用計數,強制停止銷毀播放中的實例,並直接卸載源頭資源。
重要 此操作會強制釋放資源,呼叫前請確認該資源已無使用需求。
MediaFrames.VideoFrame
影片的統一操作介面。用於控制影片的載入與播放(支援 RenderTexture 與 Camera 渲染方式),適用於過場動畫、開頭 CG 或 UI 動態背景等應用。
方法總覽
初始化與元件存取
| 方法 | 說明 |
|---|---|
| InitInstance | 初始化 VideoManager 單例實例。 |
| GetComponent<T> | 取得指定名稱的影片實 例元件(首個匹配)。 |
| GetComponents<T> | 取得指定名稱的所有影片實例元件。 |
播放與資源管理
| 方法 | 說明 |
|---|---|
| Preload | 預載影片資源至快取。 |
| Play | 播放影片,回傳 VideoBase 實例。 |
| Pause | 暫停指定名稱的影片。 |
| PauseAll | 暫停所有影片。 |
| ResumeAll | 恢復所有處於暫停狀態的影片。 |
| Stop | 停止指定名稱的影片。 |
| StopAll | 停止所有影片。 |
| ForceUnload | 強制卸載指定名稱的影片資源。 |
InitInstance
public static void InitInstance()
說明
主動初始化 VideoManager 單例實例。建議於遊戲啟動階段呼叫一次,確保管理器提前就緒。
注意 若場景中不存在 VideoManager 物件,將輸出錯誤日誌。
GetComponent<T>
public static T GetComponent<T>(string assetName) where T : VideoBase
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| assetName | string | 影片資源名稱。 |
回傳值
T — 首個名稱匹配的影片實例元件;查無時回傳 null。
說明
取得指定名稱的影片實例上的 VideoBase 元件。僅能取得已進入播放管理列表的實例(即呼叫過 Play 之後),僅預載的資源尚未實例化,無法取得。
GetComponents<T>
public static T[] GetComponents<T>(string assetName) where T : VideoBase
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| assetName | string | 影片資源名稱。 |
回傳值
T[] — 所有名稱匹配的影片實例元件陣列;查無時回傳空陣列。
說明
取得指定名稱的所有影片實例元件。
Preload
public static async UniTask Preload(string assetName)
public static async UniTask Preload(string[] assetNames)
public static async UniTask Preload(string packageName, string assetName)
public static async UniTask Preload(string packageName, string[] assetNames)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| packageName | string | 資源包名稱。未指定時,使用預設 Package。 |
| assetName | string | 影片資源名稱(Bundle 資源使用 Address 名稱;支援 res# 前綴)。 |
| assetNames | string[] | 影片資源名稱陣列(批次預載)。 |
回傳值
UniTask — 可等待的非同步操作。
說明
預先將影片資源載入至快取。之後呼叫 Play 時可直接從快取取用,避免播放當下產生載入 延遲。
範例
await MediaFrames.VideoFrame.Preload("OpeningCutscene");
Play
public static async UniTask<VideoBase> Play(string assetName, Transform parent = null, int loops = 0, float volume = 0f)
public static async UniTask<VideoBase> Play(string packageName, string assetName, Transform parent = null, int loops = 0, float volume = 0f)
public static async UniTask<VideoBase> Play(string assetName, VideoClip sourceClip, Transform parent = null, int loops = 0, float volume = 0f)
public static async UniTask<VideoBase> Play(string packageName, string assetName, VideoClip sourceClip, Transform parent = null, int loops = 0, float volume = 0f)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| packageName | string | 資源包名稱。未指定時,使用預設 Package。 |
| assetName | string | 影片資源名稱(Bundle 資源使用 Address 名稱;支援 res# 前綴)。 |
| sourceClip | VideoClip | 影片剪輯來源。指定時,將直接覆寫實例上的 videoClip(適用於動態指定影片內容)。 |
| parent | Transform | 掛載的父節點。 預設值: null(掛載至 VideoManager 節點下) |
| loops | int | 循環次數。-1 = 無限循環;> 0 = 指定循環次數。預設值: 0(使用 Prefab 上 VideoBase 的循環設定) |
| volume | float | 音量。> 0 時覆寫音量。預設值: 0f(使用 VideoPlayer 上的預設音量) |
回傳值
UniTask<VideoBase> — 播放中的影片實例元件;載入失敗時回傳 null。
說明
載入並播放指定的影片。
注意- 若同名影片已在播放中,不會重複播放,將直接回傳既有實例。
- 若同名影片處於暫停狀態,呼叫後會恢復播放。
範例
// 播放過場影片
var video = await MediaFrames.VideoFrame.Play("OpeningCutscene");
// 動態指定 VideoClip 播放
await MediaFrames.VideoFrame.Play("VideoTemplate", downloadedClip);
Pause
public static void Pause(string assetName)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| assetName | string | 影片資源名稱。 |
說明
暫停指定名稱的所有影片實例。可透過 Play 或 ResumeAll 恢復播放。
PauseAll
public static void PauseAll()
說明
暫停所有播放中的影片。
ResumeAll
public static void ResumeAll()
說明
恢復所有處於暫停狀態的影片,對播放中的影片不產生影響。
Stop
public static void Stop(string assetName, bool disableEndEvent = false, bool forceDestroy = false)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| assetName | string | 影片資源名稱。 |
| disableEndEvent | bool | 是否禁用結束事 件回呼(EndEvent),停止時將不觸發播放結束的後續處理。預設值: false |
| forceDestroy | bool | 是否強制銷毀實例物件。未強制時,依 Prefab 上 onStopAndDestroy 設定決定。預設值: false |
說明
停止指定名稱的所有影片實例。實例銷毀時將連動引用計數,決定是否自動卸載資源(參考引用計數與生命週期)。
StopAll
public static void StopAll(bool disableEndEvent = false, bool forceDestroy = false)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| disableEndEvent | bool | 是否禁用結束事件回呼。 預設值: false |
| forceDestroy | bool | 是否強制銷毀實例物件。 預設值: false |
說明
停止所有影片實例,參數行為同 Stop。
ForceUnload
public static void ForceUnload(string assetName)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| assetName | string | 影片資源名稱。 |
說明
略過引用計數,強制停止銷毀播放中的實例,並直接卸載源頭資源。
重要 影片檔案通常較大,當確定不再需要該影片時,應手動呼叫此方法強制釋放記憶體。
範例
// 過場影片播放完畢,確定不再使用
MediaFrames.VideoFrame.ForceUnload("OpeningCutscene");