Unity Netcode GetCurrentRtt传入LocalClientId报错的解决咨询
解决Unity Netcode GetCurrentRtt的KeyNotFoundException问题
问题根源
你调用GetCurrentRtt时传入的LocalClientId是客户端本地标识,并非服务器分配的连接ID,而NetworkTransport.GetCurrentRtt需要的是服务器侧维护的客户端连接ID作为键,两者没有固定对应关系,因此会出现找不到键的错误。临时将LocalClientId减1仅对首个用户有效,是因为首个用户的本地ID刚好和连接ID巧合匹配,但后续用户的标识对应关系会变化,导致方案失效。
正确解决方案
使用LocalClient.ConnectionId替代LocalClientId,这个值是服务器为当前客户端分配的有效连接ID,是GetCurrentRtt方法的正确参数:
private void Update() { if(NetworkManager.Singleton != null && NetworkManager.Singleton.IsConnectedClient) { var localClient = NetworkManager.Singleton.LocalClient; if(localClient != null) { float pingInMilliseconds = NetworkManager.Singleton.NetworkConfig.NetworkTransport.GetCurrentRtt(localClient.ConnectionId); // 这里可以使用ping值做后续处理 } } }
额外说明
LocalClient在客户端成功连接服务器后才会被初始化,配合IsConnectedClient的判断可以避免空引用,但额外加一层空判断能提升代码健壮性。- 不要依赖
LocalClientId和ConnectionId的数值对应关系,两者的生成逻辑完全独立,不同场景下可能出现不同的偏移或无规律的数值。
内容的提问来源于stack exchange,提问作者creeperQ7
相关产品推荐
相关产品推荐

