Unity Relay中客户端兼具主机身份的异常原因咨询
问题原因解析
首先得明确Unity Netcode for GameObjects(NGO)结合Relay时的角色逻辑,以及你看到的输出背后的真实情况:
你所谓的“客户端同时输出IsClient 0和IsClient 1”,并不是客户端兼具主机与客户端身份,而是客户端上存在两个网络同步的玩家对象:
- 一个是主机(Host)的玩家对象,它的
OwnerClientId为0(主机的客户端ID固定为0) - 另一个是当前客户端自己的玩家对象,
OwnerClientId为1(客户端连接后分配的ID)
- 一个是主机(Host)的玩家对象,它的
你的脚本挂载在玩家对象上,当客户端同步到主机的玩家对象后,两个对象都会执行
Update()里的判断:因为客户端本身处于IsClient状态,所以两个玩家对象都会触发Debug.Log,从而输出两个不同的OwnerClientId。而主机(Host)本身是“服务器+客户端”的混合角色,但它只拥有自己的玩家对象(
OwnerClientId为0),所以只会输出一次IsClient 0。
补充说明:
- 在NGO的Host模式中,主机同时作为服务器和本地客户端存在,所以它的本地玩家对象
OwnerClientId是0,且IsClient和IsServer都为true。 - 纯客户端连接后,会同步服务器上的所有网络对象(包括主机的玩家对象),如果你的玩家脚本没有做“仅在本地玩家对象上执行逻辑”的判断,就会触发所有同步过来的玩家对象的代码。
如果你只想让本地玩家对象输出日志,可以修改判断逻辑,加上本地客户端ID的校验:
if (IsClient && OwnerClientId == NetworkManager.Singleton.LocalClientId) { Debug.Log("IsClient " + OwnerClientId); }
内容的提问来源于stack exchange,提问作者T888
相关产品推荐
相关产品推荐

