Unityでネットワーク通信(1) - ユニティちゃんをネットワーク上で動かしてみた -

暫くぶりのUnityでネットワーク周りに初挑戦してみようかと。

f:id:tomcky:20140725014550p:plain

今回は、走り回るユニティちゃんをネットワークを介して同期させてみる。
ユニティちゃんのデータダウンロードはこちらから。
サンプルシーンの中にLocomotionというシーンがあるので、これをベースにさせてもらうことに。

さて、Unityでネットワーク通信を行うためには、NetworkViewコンポーネントを使用するみたい。
同期させたいオブジェクトに対して、NetworkViewをアタッチする必要がある。
なので「Component」->「Miscellaneous」->「Network View」を選択して、unitychanオブジェクトにNetworkViewをアタッチ。
Inspectorを確認するとNetworkViewが追加されて、Observerdにunitychanが設定されていることがわかる。

次に、ネットワークを管理するオブジェクトNetworkManagerを作って、そこにネットワーク管理スクリプトをアタッチする。
スクリプトはこんな感じ。

using UnityEngine;
using System.Collections;

public class NetworkManager : MonoBehaviour {

  private string ip = "127.0.0.1";
  private string port = "8888";
  private bool connected = false;

  // サーバ接続時のイベントハンドラ
  public void OnConnectedToServer() {
    connected = true;
  }

  // サーバ起動時のイベントハンドラ
  public void OnServerInitialized() {
    connected = true;
  }

  public void OnGUI() {
    // 接続後ネットワーク接続設定欄を非表示にする
    if(!connected) {
      ip = GUI.TextField(new Rect(10, 410, 90, 20), ip);
      port = GUI.TextField(new Rect(10, 440, 90, 20), port);
      if(GUI.Button(new Rect(10, 470, 90, 20), "Connect")) {
        // クライアントからサーバへ接続
        Network.Connect(ip, int.Parse(port));
      }
      if(GUI.Button(new Rect(10, 500, 90, 20), "Host")) {
        // サーバ起動
        Network.InitializeServer(10, int.Parse(port), false);
      }
    }
  }
}


とりあえずはこれで同期させる準備は整ったはず。
あと、三人称視点だと分かりづらいので、MainCameraのThirdPersonCameraはチェックを外して無効化しておくことにする。
ジャンプするとエラーになっちゃうけど、とりあえずは気にしない。

動作確認は、スタンドアロンやWebPlayer用にビルドしたものを同一端末上で起動させて、Unity上でシーン実行すれば一台でチェックできるはず。
なのだけど、ウィンドウからフォーカスが外れている間はオブジェクトの動きが同期されていても画面に反映されず、フォーカスが当たって初めて画面に反映されるので、リアルタイムにチェックすることができず。。。

そのため、今回は二台使ってチェック。
ホストはループバックのままでHostをクリック、クライアントはホストのIPアドレスを指定してConnect。

これでホストを動かしたらリアルタイムでクライアント側のユニティちゃんが...動く!直立のまま!w
うーん、移動のみ同期されて、走るモーションが同期されてないみたいなんだが。。。
どうやらアニメーションパラメータをセットしている関数を「Remote Procedure Call」という仕組みを使用してネットワーク越しに呼び出す必要があるみたい。

あと、もう一つ。
同じユニティちゃんをホストからでも、クライアントからでも操作できてしまうこと。
両者を区別する仕組みも入れる必要がありますねー。

まぁいいや。とりあえず一旦ここまで。