3

実行時に生成および構成されるオブジェクトのやや複雑なツリーがあります。これを行うために必要な情報はサーバーとクライアントの両方で利用できるため、両方の側でオブジェクトを個別に生成し、ネットワーク化された部分をリンクして後で同期できるようにしたいと考えています。

つまりSyncVar、サーバーとクライアントに存在するが、最初は を介し​​て生成されなかったオブジェクトを機能させる方法が必要NetworkServer.Spawnです。Unity ネットワーク システムが何かが同じオブジェクトであることを理解できるように NetworkIdentity を手動で構成する方法はありますか?

私はネットワーク全体でこれらのオブジェクトを自分で一意に識別する能力を持っています。それを Unity に伝える方法が必要なだけです。NetworkIdentity.netId読み取り専用なので、それはオプションではありません。

4

1 に答える 1

0

すべての初期化をサーバーだけで行ってからクライアントにプッシュすると、後で同期する必要がなくなります。これにより、重複した情報を処理する必要もなくなります (最終的にクライアント側で CPU 時間が無駄になります)。

ただし、クライアントにもデータを作成させたい場合は、クライアントにデータとともに適切なメッセージをサーバーに送信させることをお勧めします。サーバーはそれらのオブジェクトを作成できます。

処理する必要があるメッセージの種類ごとに、サーバー インスタンスで NetworkServer.RegisterHandler を使用してメッセージ ハンドラーをセットアップします。

public enum netMessages{
    hello = 101, 
    goodbye = 102, 
    action = 103,
}    

...

NetworkServer.RegisterHandler((short)netMessages.hello, new NetworkMessageDelegate(hdl_hello));
NetworkServer.RegisterHandler((short)netMessages.goodbye, new NetworkMessageDelegate(hdl_goodbye));

...

private void hdl_hello (NetworkMessage msg){
  nmgs_hello m = msg.ReadMessage<nmgs_hello>();
  ...
}

NetworkClient の Send メソッドを使用して、サーバーにメッセージを送信します。

また、実際のメッセージの MessageBase に基づいてメッセージ クラスを定義する必要があります。

public class nmsg_hello : MessageBase {
  public int x;
  public float welcomeness;
}

注:ネットワークメッセージを互いに基にしないようにしてください.Unityのバグ/機能のようです(少なくとも最後に試したとき)、メッセージが他のものから派生している場合は機能しません直接の祖先であるため、MessageBase よりも。

于 2015-11-19T09:42:12.257 に答える