gpt4 book ai didi

c# - 异步回调中不允许使用哪些 Unity API?

转载 作者:行者123 更新时间:2023-11-30 21:27:39 31 4
gpt4 key购买 nike

我在某个地方看到,在 Unity 的线程中,您不能使用 Unity API。

我想知道一般的异步回调是否也是这种情况(例如,使用 WebSocketSharp 时分配给 WebSocket.OnMessage 的函数),如果是这样,那么有没有办法知道什么是允许的,什么是不允许的(即什么是“Unity API”)?


例如,当使用 WebSocketSharp 的 WebSocket.OnMessage 时,我将它放在 MonoBehaviorStart 函数中:

// ws is a WebSocketSharp.WebSocket
// displayText is a UnityEngine.UI.Text

ws.OnMessage += (sender, evt) =>
{
// 1
boo = UnityEngine.Random.Range(1, 1000).ToString();
// 2
displayText.text = "Heyoo";
};

1 下的行出错(没有日志超出它)但没有显示错误消息。而当该行不在此回调内时(例如 Update 的顶层),我可以毫无问题地看到它的结果。

至于 2 下的行,Unity 中的 Inspector 显示更新后的文本,但播放屏幕没有显示,直到我在 Inspector 中更新属性,就好像文本字段确实更新了一样,但是当它需要使用 Unity API 来更新屏幕时,它失败了,所以直到发生单独的更新时它才真正出现。

这是我对这些奇怪行为的假设,所以请让我知道这是否正确,以及是否有简洁(或记录)的方式来描述我所描述的内容。

最佳答案

async 通常意味着:不在主线程中。

很难回答在主线程之外的其他线程中什么受支持,什么不支持...简而言之:大多数东西都受支持。

UnityEngine.Random.Range(1, 1000).ToString(); 应该可以工作。 但是要小心分配!

一个已知的解决方法是像回调 worker 一样创建并传递 Action 以执行回主线程,例如:

public class MainThreadWorker : MonoBehaviour
{
// singleton pattern
public static MainThreadWorker Instance;

// added actions will be executed in the main thread
ConcurrentQueue<Action> actions = new ConcurrentQueue<Action>();

private void Awake()
{
if (Instance)
{
this.enabled = false;
return;
}
Instance = this;
}

private void Update()
{
// execute all actions added since the last frame
while (actions.TryDequeue(out var action))
{
action?.Invoke();
}
}

public void AddAction(Action action)
{
if(action != null) actions.Enqueue(action);
}
}

在你的场景中的某个地方有这个你现在可以将一个 Action 传回主线程

ws.OnMessage += (sender, evt) =>
{
MainThreadWorker.Instance.AddAction(()=>
{
// 1
boo = UnityEngine.Random.Range(1, 1000).ToString();
// 2
displayText.text = "Heyoo";
});
};

关于c# - 异步回调中不允许使用哪些 Unity API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57469091/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com