Unity 5.1 よりUnityのネットワーク機能が新しくなりました(通称 UNET)
今回はその使い方について紹介して行こうと思います。
ステージの準備
まずStandardAssetsのPrototypeとかその辺りを使用し、簡単なステージを作成します。作り方は Sample Assetsのプロトタイプアセットを並べて簡単なステージを作ってみよう とか参考にして下さい。
次に動かすキャラクターを投入します。今回はStandardAssetsのCharacterをインポートし、FPSControllerをシーン内に配置します。オブジェクトを探す際はProjectビューの検索を使うと便利です。
そのままだとFPSControllerは描画用メッシュを保たないので、Capsuleでも入れて位置を分かりやすくしておくと良い感じです。
ちなみにFPSControllerはEscapeでマウスが表示されます。
とりあえず同期するようにする
これを、とりあえずマルチプレイ上で同じように動くようにします。
まずはネットワークマネージャーの追加です。
"Network Manager"*1の名前を持つオブジェクトを作成し、NetworkManagerコンポーネントとNetworkManagerHUDコンポーネントを追加します。
次にFPSControllerをネットワーク対応にします。
FPSControllerオブジェクトにNetworkIdentityコンポーネントとNetworkTranformコンポーネントを追加します。ついでにNetworkIdentityコンポーネントのLocalPlayerAuthorityにチェックを入れます。
FPSControllerはCharacterControllerで動くので、Transform Sync ModeをSync Character Controllerに設定しておくとGoodです。
このままではキーボード操作に対しローカルではないオブジェクトも動いてしまいます。なのでローカルではないオブジェクトの持つコンポーネントをDisableにする処理*2を記述し、FPSControllerオブジェクトへアタッチ、以下のコンポーネントを登録して実行時にDisableになるよう設定します。
- FPSControllerオブジェクトのFPSController
- FirstPersonCharacterオブジェクトのCamera
- FirstPersonCharacterrオブジェクトのAudioListener
今回は汎用的な目的のためBehaviourのリストですが、実際に使う場合は特定のコンポーネントをGetComponentで探しても良いです。またエディター操作で登録するのが面倒なボタンのクリックイベントを、スクリプトで登録するのように、Resetでコンポーネントアタッチ時にコンポーネントの接続を自動的に済ます手もあります。
サーバー・クライアント接続時にFPSControllerオブジェクトがインスタンス化されるようにします。この手順には大抵ResourcesやPrefabが要求されますが、この規模だと意味が無いのでシーン上のオブジェクトをインスタンス化するアプローチを取ります。
まずは空のオブジェクトのSceneResourcesオブジェクトを作成し非アクティブに設定します。次にFPSControllerオブジェクトをSceneResourcesオブジェクトの子として配置します。
あとはNetworkManagerコンポーネントのSpawnInfoにFPSControllerを登録します。
動かす
動かしてみます。動かす際はPCが2台あればベターではありますが、面倒なのでエディターとPC向けにビルドしたプレイヤーで動作を確認します。
手順は簡単、まずCtrl(Command)+BでPC向けにビルド&実行し、エディタもゲームを再生します。ゲームを再生する時はWindowモードで動かすのが良いです。
後はPCとエディタのどちらかをLAN Host(H)、もう片方をLAN(C)を選択して接続します。キャラクターを動かした時、別クライアントのキャラクター動けば成功です。
とりあえずそれなりに動きますが、このままでは結構カクカクです。また、初期設定はレイテンシーの低い(pingの高い)ネットワーク環境に滅法弱いです。
その辺り次回に書こうと思います。