我正在我的游戏大厅里制作一个游戏,如果接收到规格之间的时间间隔是2秒的话,就会收到这个房间里的开瓶器列表,如果时间间隔是2秒,那么工作就可以完成,但是如果同时收到所有的规范,MakeUILobby函数就不能工作了!
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函数将被调用两次,其中包含了玩家的信息,如果应该像下面的图像那样!

发布于 2021-06-13 08:22:11
你的问题是lambda表达式中的值捕获。
每次接收到最后一项时都会更改字段WSUserJoinedToRoom的值,因此当主线程帧播放时,它将执行两个lambda操作,这两个动作都将访问相同的WSUserJoinedToRoom值。
所以在你的情况下
WSUserJoinedToRoom中,然后添加回调操作。WSUserJoinedToRoom中,然后添加回调操作。user_id当前的 WSUserJoinedToRoom (player 1)中读取,而不是,这是回调为Enqueued时的操作!相反,要么将这两个字符串存储在局部变量中:
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使用字段,而是使用
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));
};https://stackoverflow.com/questions/67956001
复制相似问题