当 websocket 收到消息时加载场景

Load Scene when websocket receive message

我正在使用 websocket-sharp,它可以连接到我的 websocket 服务器并可以接收消息。我尝试从 onMessage 加载场景,但它不起作用。以下是 onMessage:

    ws.OnMessage += (sender, e) =>
    {
        Debug.Log("before load scene");
        SceneManager.LoadScene("Game");
        Debug.Log("after load scene");
    };

它会打印before load scene,但它无法加载场景并且不打印after load scene

不幸的是,这行不通。 WebSocketSharp 回调在工作线程上运行。也许这是为了减少对渲染线程(以及我们的帧率)的影响,或者这可能只是网络库强加的限制。无论哪种方式,Unity3d 都不允许我们与其 API 交互,主线程除外。

您可以使用 Dispatcher Pattern 来解决这个问题,See this article

尝试创建一个名为 SceneListener 的新 class,它是一个 MonoBehaviour。 执行以下操作:

private bool _shouldSwitch;
void Start() {
    _shouldSwitch = false;
    DontDestroyOnLoad(this.gameObject);
}

void Update() {
    if (_shouldSwitch) {
        _shouldSwitch = false;
        Debug.Log("before load scene");
        SceneManager.LoadScene("Game");
        Debug.Log("after load scene");
    }
}

public void Switch() {
    _shouldSwitch = true;
}

然后将 SceneListener 实例的引用传递给您的回调:

ws.OnMessage += (sender, e) =>
{
    sceneListener.Switch()
};