「UNet Client Disconnect Error: NoResources」というエラーの解決方法

目次

問題点

Unity の通信モジュール UNet の NetworkServerSimpleNetworkClient を使って通信するとき、クライアントから 9回目の接続で以下のような謎のエラーがクライアント側で発生して、それ以降通信できなくなる。

UNet Client Disconnect Error: NoResources

docs.unity3d.com
docs.unity3d.com

Unity のバージョンは 5.6.1f1 です。

原因

サーバー側の maxConnecitons の値がデフォルトで(恐らく)9 になっているため。

解決策

NetworkServerSimple の Configure 関数を使って maxConnections の値を大きくする。

using UnityEngine;
using UnityEngine.Networking;

public class ServerTest : MonoBehaviour {
    public int port;

    void Start () {
        NetworkServerSimple server = new NetworkServerSimple();
        ConnectionConfig config = new ConnectionConfig();
        server.Configure(config, 100);
        server.Listen(port);
    }
}

しかしこのままでは Client と Server 側で ConnectionConfig の設定が違うものになってしまうから以下のエラーが発生してしまう。

UNet Client Disconnect Error: CRCMismatch
UnityEngine.Networking.NetworkIdentity:UNetStaticUpdate()

以下のようにして Client でも同じ設定をしてあげる必要がある。

using UnityEngine;
using UnityEngine.Networking;

public class ServerTest : MonoBehaviour {
    public string ip;
    public int port;

    void Start () {
        NetworkClient client = new NetworkClient();
        ConnectionConfig config = new ConnectionConfig();
        client.Configure(config, 10);
        client.Connect(ip, port);
    }
}
おわりに

このエラーログの非常によくないのが、クライアント側で発生して、あたかもクライアントのリソースがないような書き方をしているが、実はサーバー側の問題ということ。
しかも1回発生するとすべてのクライアントで通信が出来なくなるという致命的なエラー。

このエラーについては以下でもっと詳しく議論されている。
https://forum.unity3d.com/threads/about-networkerror-noresources.440642/forum.unity3d.com

UNet の記事は検索してもあまり出てこないし、未知のバグがいっぱいありそう。