Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 缺少ClientRpc(Unity Mirror)的重要功能_Unity3d_Mirror_Unity3d Unet - Fatal编程技术网

Unity3d 缺少ClientRpc(Unity Mirror)的重要功能

Unity3d 缺少ClientRpc(Unity Mirror)的重要功能,unity3d,mirror,unity3d-unet,Unity3d,Mirror,Unity3d Unet,我有一个问题,ClientRpc从未被称为任何客户端对象。我在互联网上搜索了好几个小时,但我找不到任何线索来解释我的实现为什么不起作用。 我遵循这样的顺序: 在大厅中添加玩家 将场景切换到游戏场景 在服务器上生成随机分幅 使用Rpc将平铺数据发送到客户端进行渲染 但是,渲染函数从未被调用 NetworkManager.cs public override void OnServerReady(NetworkConnection conn) { base.OnServerReady(con

我有一个问题,ClientRpc从未被称为任何客户端对象。我在互联网上搜索了好几个小时,但我找不到任何线索来解释我的实现为什么不起作用。 我遵循这样的顺序:

  • 在大厅中添加玩家
  • 将场景切换到游戏场景
  • 在服务器上生成随机分幅
  • 使用Rpc将平铺数据发送到客户端进行渲染
  • 但是,渲染函数从未被调用

    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);
    }
    
    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");
    }
    
    GameManager.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);
    }
    
    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函数:(
    我有什么特别明显的遗漏吗?我的游戏经理确实有一个NetworkID连接到它上

    为了让它工作,我似乎需要做很多事情-我不完全确定哪一个工作正常,但如果你有这些问题,我必须检查这些事情-

  • 只是基本代码。确保在客户端、主机或服务器上创建了适当的内容
  • 确保没有任何竞争条件,尤其是在处理不断变化的场景时。您可以从
    OnClientSceneChanged
    OnServerSceneChanged
  • 正如derHugo指出的,我没有检查我的包是否可以发送。结果表明,当我尝试发送100x100x4字节时,可以发送的最大大小是1200字节。在主机上测试时,只有在有外部客户端时,才出现此错误

  • 控制台中有任何错误??如果
    short[]rawTiles
    太大,一次发送太多数据可能会引发错误另一方面GameManager.cs是否继承自
    网络行为
    ?如果不是,网络行为不会发生
    我的GameManager确实附加了网络ID
    。您只能通过组件发送网络内容
    A
    是一种
    networkbehavior
    B
    这会自动要求组件所连接的游戏对象具有
    NetworkIdendity
    控制台不会输出任何错误消息。它可能太大-
    太短[]rawTiles
    是一个扁平的100x100数组。GameManager继承自NetworkBehavior。我现在的假设是,场景更改导致了问题,并且调用Rpc时,
    GameManager
    尚未在客户端上生成。