在 Unity 中協調主線程和其他線程的任務需要仔細考慮。本文將探討解決此問題的可靠方法。
由於 Unity 的設計旨在防止此類操作,因此直接從單獨線程訪問 Unity API 會導致異常。 UnityThread 腳本通過促進線程間的通信來解決此問題。
此腳本提供在主線程的 Update、LateUpdate 和 FixedUpdate 函數中執行函數或協程的方法。
初始化:在 Awake() 函數中調用 UnityThread.initUnityThread()。
在主線程中執行操作:
在主線程中執行協程:
在主線程中執行旋轉變換:
<code class="language-c#"> UnityThread.executeInUpdate(() => transform.Rotate(new Vector3(0f, 90f, 0f)));</code>
從單獨線程調用主線程中的函數:
<code class="language-c#"> Action rot = Rotate; UnityThread.executeInUpdate(rot); void Rotate() { transform.Rotate(new Vector3(0f, 90f, 0f)); }</code>
從單獨線程在 LateUpdate 函數中執行代碼:
<code class="language-c#"> UnityThread.executeInLateUpdate(() => { /* 相机移动代码 */ });</code>
從單獨線程在主線程中啟動協程:
<code class="language-c#"> UnityThread.executeCoroutine(myCoroutine()); IEnumerator myCoroutine() { Debug.Log("Hello"); yield return new WaitForSeconds(2f); Debug.Log("Test"); }</code>
禁用不需要的執行函數以優化性能:
<code class="language-c#"> //#define ENABLE_LATEUPDATE_FUNCTION_CALLBACK //#define ENABLE_FIXEDUPDATE_FUNCTION_CALLBACK</code>
以上是如何從單獨的線程安全地訪問Unity API?的詳細內容。更多資訊請關注PHP中文網其他相關文章!