当 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()
};
我正在使用 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()
};