原文標題:Skipping domain reload: faster iteration using the MethodReload feature

Unity 於 2026 年 10 月 22 日介紹 MethodReload,這是一項已在 Unite Seoul 展示、目前以實驗套件形式提供的 C# 程式碼迭代工具。它的目標是在 Unity Editor 的 Play Mode 或連線中的開發版裝置上,讓開發者修改部分方法內容後直接更新正在執行的遊戲,而不必為每次小改動完整執行 domain reload 或重新編譯並部署整個 IL2CPP Player。

官方提供的版本為 Pipeline 套件 `com.unity.pipeline@0.7.0-exp.1`,要求 Unity 6.0 或更新版本。開發者先在希望即時替換的方法標註 `[MethodReload]`,且必須在進入 Play Mode 或建立 Player 前完成標註;方法需為 public 的實例或靜態方法,回傳型別限 `void` 或 `IEnumerator`。接著於 Project Settings → Pipeline → Editor 的 Method Reload Interpreter Watch 啟動監看器,編輯並儲存已標記的方法內容,下一次呼叫時便可執行新版本。

對裝置端測試,需建立啟用 runtime Pipeline driver 的 development player,並使用 Autoconnect Profiler 或 Profiler/Console 連接。之後 Editor 會以目標 Player 的前處理定義編譯修改,推送到所有已連線的 Player。Unity CLI 也提供 `reload_file_editor_interpreter` 與 `reload_file_player_interpreter` 指令,可從終端或 AI 編碼代理操作。監看期間會暫停一般 auto-refresh,其他資產須透過 Ctrl/Cmd+R 匯入,停止監看則恢復原設定。

MethodReload 並非全面熱重載。它只替換已標註方法的主體,不改變呼叫端、欄位或型別配置,不能新增欄位或類別。其解譯器只支援 C# 子集,不能在替換的方法中使用 `await`、`Task`、`try/catch/finally`、`lock`、LINQ 查詢、`decimal`、`dynamic`、反射、執行緒型別、`ref/out/in` 參數、泛型方法與多維陣列等;隨套件附帶 Roslyn 分析器會提示違反限制的程式碼。

IL2CPP 裝置上的替換程式碼只能呼叫原本建置時保留下來的 API,因為未被引用的成員可能在連結時被移除;缺少成員會在推送時警告,執行到時仍可能拋出例外。解譯執行比已編譯程式碼慢,影響限開發版的標記方法;正式發行版本沒有額外的解譯器入口。協程的變更在下一次建立協程時才生效,已在執行的協程仍沿用原內容,可搭配 `[OnMethodReloaded]` 重啟長時間運作流程。

Unity 說明,傳統 Mono 編輯器熱重載工具可在 Editor 使用更完整的 C#,但通常無法修補 IL2CPP Player;MethodReload 透過編譯後插入入口、將更新後 IL 交由解譯器執行,換取裝置端跨平台能力。這項實驗功能仍需開發團隊在實際專案評估相容性與效能,不能視為正式版的通用即時更新機制。

發生了什麼事

Unity 推出實驗版 MethodReload,透過 Unity Pipeline 套件、方法標註與監看器,把已修改的 C# 方法主體推送至 Editor 或連線的開發版 Player。

為什麼重要

傳統 IL2CPP 遊戲裝置端每次小修改常需重新建置。MethodReload 以受限的解譯器換取較快迭代,但並非取代完整編譯與所有熱重載工具。

影響哪些人

使用 Unity 6.0 以上版本的遊戲開發者、測試工程師、IL2CPP 裝置端迭代團隊與以 Unity CLI 驅動工作流程的 AI 編碼代理開發者。

已確認與未確認

已確認實驗套件版本 0.7.0-exp.1、方法標註規則、CLI 指令與 C# 子集限制;尚未提供正式版時間表,也不能保證所有專案都能即時替換。