前回の記事(Unityでネットワーク通信をする3 (インスタンス生成) - おもちゃラボ)では、UnityのnetworkViewコンポーネントを使って、ネットワーク越しにインスタンスの生成を同期するサンプルデモを作成しました。今回は前回使用したC#のプログラムの重要な部分を説明します。
if( GUI.Button( new Rect( 10, 10, 90, 90), "Client")) { Network.Connect(ip, int.Parse(port) ); } if( GUI.Button( new Rect(10, 110, 90, 90), "Master")) { Network.InitializeServer(10, int.Parse(port), false); }
OnGUI関数の中ではボタンが押された時の処理を記述しています。Masterのボタンが押された時はネットワーククラスのInitializeServerを呼ぶことで、自分自身がサーバになります。第1引数には受け入れるクライアントの最大数、第2引数にはポート番号、第三引数にはNATを使用するかを渡します。Clientのボタンが押された時はネットワーククラスのConnectを呼び出し、第1引数にサーバのIPアドレス、第2引数にポート番号を渡します。今回は、マスタもクライアントも同一のPCで動作させるため、IPアドレスにはループバックアドレス(127.0.0.1)を使用しました。
private void CreatePlayer() { connected = true; Network.Instantiate(objectPrefab, objectPrefab.transform.position, objectPrefab.transform.rotation, 1); } public void OnServerInitialized() { CreatePlayer(); }
マスタ側では、InitializeServerが成功するとコールバックとしてOnServerInitialized()が呼ばれ、この中でNetwork.Instantiateを使ってネットワーク同期のキャラクタを生成しています。一方でクライアント側ではマスタへの接続が完了すると、コールバックとしてOnConnectedToServerが呼ばれてきます。キャラクタの生成はマスタ側で行っているので、クライアント側では行いません。
上図を参考にここまでの流れをまとめると、マスタ側ではNetwork.InitializeServerでサーバになった後、Network.Instantiateを使ってネットワーク上で同期するオブジェクトを生成しています。クライアント側ではNetwork.Connectでサーバに接続するだけで、自動的にキャラクタが同期されます。もし、下図のようにクライアント側でも自キャラを生成したい場合にはOnConnectedToServerのコールバックの中でNetwork.Instantiateを使って自キャラを生成すればよいでしょう。
public void OnConnectedToServer() { connected = true; Network.Instantiate(objectPrefab2, objectPrefab.transform.position, objectPrefab.transform.rotation, 1); }
次回は、ネットワーク上で移動・回転・拡大縮小などを同期する方法と、RPCを使って関数コールを同期する方法を説明したいと思います。
参考図書
「ゲームの作り方 Unityで覚える遊びのアルゴリズム」
こちらはUnity中級編の参考書です。2Dから3Dのゲームまで、ゲームのサンプルが10個もついており「どうやったら面白くなるのか?」ということがゲームの参考書としては珍しく解説されているので非常に参考になります。