[英]How to run functions on main thread without using Coroutine in Unity
我遇到過一些關於使用協程在主線程上運行函數的文章,例如Thread Ninja :
IEnumerator StartExamples()
{
//Jump to main thread
yield return Ninja.JumpToUnity;
Destroy(someGameObject); //OK
//Jump back to background thread
yield return Ninja.JumpBack;
}
它對我的代碼不起作用,因為我想從套接字偵聽器跳轉到主線程。
SocketIOClient.Client socket;
IEnumerator StartExamples()
{
socket.On("connect", (fn) =>
{
WriteLine("\r\nConnected event...\r\n");
//Jump to main thread
yield return Ninja.JumpToUnity; //ERROR: couldn't do a yield return
Destroy(someGameObject);
//Jump back to background thread
yield return Ninja.JumpBack; //ERROR: couldn't do a yield return
});
}
那么我們有什么解決方法嗎? 我希望我可以像這樣跳轉到主線程:
Dispatcher.BeginInvoke(() =>
{
//Unity API
Destroy(gameObject);
});
根據我的評論,使用uPromise ;
class Example
{
private Promise BeginSocketConnection()
{
Deferred retPromise = new Deferred();
socket.On("connect", (fn) =>
{
// We're no longer on the main thread ):
// But we can resolve our promise!
retPromise.Resolve();
});
return retPromise;
}
private void SocketConnectedSuccessfully()
{
// Executing on main thread
}
private void Start()
{
// We start in the main thread
BeginSocketConnection().Done(x =>
{
SocketConnectedSuccessfully();
});
}
}
這不允許您在同一代碼塊內的線程之間跳轉,但是通過使用回調系統,您可以提醒主線程執行操作,而無需啟動混亂的協程並在各處產生混亂。 看起來和維護起來要好得多。
我最終使用了一個非常有用的擴展,稱為Unity Thread Helper 。 它是免費的,並且足以滿足我的需求!
這是用法:
UnityThreadHelper.Dispatcher.Dispatch(() =>
{
Destroy(a);
});
注意:Dispatcher是一個單例對象,它將在您第一次調用時初始化。 您必須在主線程上進行首次調用,因為它使用了一些Unity API。
private void Start()
{
var ugly = UnityThreadHelper.Dispatcher;
}
希望這可以幫助!
如果你不想使用擴展,比如其他評論中提到的 uPromise 和 Unity Thread Helper,也不想使用 MonoBehavior 的協程,你也可以使用SynchronizationContext :
// On main thread, during initialization:
var syncContext = System.Threading.SynchronizationContext.Current;
// On socket listener thread
syncContext.Post(_ =>
{
// This code here will run on the main thread
Destroy(gameObject);
}, null);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.