问题描述
我遇到了 ClientRpc 从未被调用任何客户端对象的问题。我已经在互联网上玩了几个小时,但我找不到任何关于为什么我的实现不起作用的线索。 我正在遵循这样的事件顺序:
NetworkManager.cs
public override void OnServerReady(NetworkConnection conn)
{
base.OnServerReady(conn);
//Make sure they're all ready
for (int i = RoomPlayers.Count - 1; i >= 0; i--)
{
if (!RoomPlayers[i].IsReady)
{
return;
}
}
//PrevIoUsly add SpawnTiles to OnServerReadied
OnServerReadied?.Invoke(conn);
}
GameManager.cs
private void SpawnTiles(NetworkConnection conn)
{
//Generate rawTiles beforehand
Debug.Log(conn.isReady);
Debug.Log("Entered spawn tiles");
RpcSpawnTiles(rawTiles);
}
[ClientRpc]
public void RpcSpawnTiles(short[] rawTiles)
{
Debug.Log("Client spawning tiles");
}
这是我在主机上运行时的输出:
True
Entered spawn tiles
它似乎永远不会进入 Rpc 功能:( 有什么特别明显的东西我错过了吗?我的 GameManager 确实附加了一个 NetworkID
解决方法
似乎有很多事情我必须做才能让它工作 - 我不完全确定哪一个工作,但如果你遇到这些问题,这些是我必须检查的一些事情-
- 只是基本代码。确保在客户端、主机或服务器上创建了适当的内容
- 确保没有任何竞争条件,尤其是在处理不断变化的场景时。您可以从
OnClientSceneChanged
和OnServerSceneChanged
调用东西
- 正如 derHugo 指出的那样,我并没有检查我的包裹是否可以寄出。事实证明,可以发送的最大大小是 1200 字节,而我试图发送 100x100x4 字节。我在主机上测试的时候没有出现这个错误,只有在有外部客户端的时候才出现