首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >websocket- OnMessage中的尖锐统一问题

websocket- OnMessage中的尖锐统一问题
EN

Stack Overflow用户
提问于 2021-06-13 07:49:40
回答 1查看 539关注 0票数 0

我正在我的游戏大厅里制作一个游戏,如果接收到规格之间的时间间隔是2秒的话,就会收到这个房间里的开瓶器列表,如果时间间隔是2秒,那么工作就可以完成,但是如果同时收到所有的规范,MakeUILobby函数就不能工作了!

代码语言:javascript
复制
    public IEnumerator Start()
    {
        ws = new WebSocket("ws://localhost:8081");
        ws.SetCookie();
        ws.Connect();
        WSConnectionStatus = true;
        ws.OnMessage += (sender, e) =>
        {
            WSUserJoinedToRoom = JsonUtility.FromJson<WSUserJoinedToRoom>(e.Data);
            print("Message Received from " + ((WebSocket)sender).Url + ", Data : " + e.Data);
            _actions.Enqueue(() => MakeUILobby(WSUserJoinedToRoom.user_id, WSUserJoinedToRoom.user_name));
        };
    }

    private void MakeUILobby(string user_id, string user_name)
    {
        print(user_name);
    }

WebSocket Data Part1:

{"user_id":"3","user_name":"Player-3"}

WebSocket Data Part2:

{"user_id":"1","user_name":"Player-1"}

但是,如果您查看上面的图像,MakeUILobby函数将被调用两次,其中包含了玩家的信息,如果应该像下面的图像那样!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-13 08:22:11

你的问题是lambda表达式中的值捕获

每次接收到最后一项时都会更改字段WSUserJoinedToRoom的值,因此当主线程帧播放时,它将执行两个lambda操作,这两个动作都将访问相同的WSUserJoinedToRoom值。

所以在你的情况下

  • 接收到播放器3并将其存储到WSUserJoinedToRoom中,然后添加回调操作。
  • 接收到播放器1并将其存储到WSUserJoinedToRoom中,然后添加回调操作。
  • 现在,主线程执行更新并执行两个操作,这两个动作都从user_id当前的 WSUserJoinedToRoom (player 1)中读取,而不是,这是回调为Enqueued时的操作!

相反,要么将这两个字符串存储在局部变量中:

代码语言:javascript
复制
ws.OnMessage += (sender, e) =>
{
    WSUserJoinedToRoom = JsonUtility.FromJson<WSUserJoinedToRoom>(e.Data);
    print("Message Received from " + ((WebSocket)sender).Url + ", Data : " + e.Data);
    // HERE: Store new variables for the values
    var userId = WSUserJoinedToRoom.user_id;
    var userName = WSUserJoinedToRoom.user_name;
    _actions.Enqueue(() => MakeUILobby(userId, userName));
};

或者干脆不为WSUserJoinedToRoom使用字段,而是使用

代码语言:javascript
复制
ws.OnMessage += (sender, e) =>
{
    // HERE: Simply make a new variable everytime
    var WSUserJoinedToRoom = JsonUtility.FromJson<WSUserJoinedToRoom>(e.Data);
    print("Message Received from " + ((WebSocket)sender).Url + ", Data : " + e.Data);
    _actions.Enqueue(() => MakeUILobby(WSUserJoinedToRoom.user_id, WSUserJoinedToRoom.user_name));
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67956001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档