在 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中文网其他相关文章!