テラシュールブログ

旧テラシュールウェアブログUnity記事。主にUnityのTipsやAR・VR、ニコニコ動画についてのメモを残します。

【Unit 5】Unityでマルチプレイヤーなゲームを作る入門(1)

Unity 5.1 よりUnityのネットワーク機能が新しくなりました(通称 UNET)

今回はその使い方について紹介して行こうと思います。

docs.unity3d.com

ステージの準備

まずStandardAssetsのPrototypeとかその辺りを使用し、簡単なステージを作成します。作り方は Sample Assetsのプロトタイプアセットを並べて簡単なステージを作ってみよう とか参考にして下さい。

f:id:tsubaki_t1:20150613225958p:plain

次に動かすキャラクターを投入します。今回はStandardAssetsCharacterをインポートし、FPSControllerをシーン内に配置します。オブジェクトを探す際はProjectビューの検索を使うと便利です。

そのままだとFPSControllerは描画用メッシュを保たないので、Capsuleでも入れて位置を分かりやすくしておくと良い感じです。

f:id:tsubaki_t1:20150613230225p:plain

f:id:tsubaki_t1:20150613230248p:plain

f:id:tsubaki_t1:20150613230535p:plain

ちなみにFPSControllerはEscapeでマウスが表示されます。

とりあえず同期するようにする

これを、とりあえずマルチプレイ上で同じように動くようにします。

まずはネットワークマネージャーの追加です。

"Network Manager"*1の名前を持つオブジェクトを作成し、NetworkManagerコンポーネントNetworkManagerHUDコンポーネント追加します。

f:id:tsubaki_t1:20150613231511p:plain

次にFPSControllerをネットワーク対応にします。

FPSControllerオブジェクトNetworkIdentityコンポーネントNetworkTranformコンポーネントを追加します。ついでにNetworkIdentityコンポーネントLocalPlayerAuthorityにチェックを入れます。

FPSControllerはCharacterControllerで動くので、Transform Sync ModeSync Character Controllerに設定しておくとGoodです。

f:id:tsubaki_t1:20150613235550p:plain

このままではキーボード操作に対しローカルではないオブジェクトも動いてしまいます。なのでローカルではないオブジェクトの持つコンポーネントをDisableにする処理*2を記述し、FPSControllerオブジェクトへアタッチ、以下のコンポーネントを登録して実行時にDisableになるよう設定します。

  • FPSControllerオブジェクトのFPSController
  • FirstPersonCharacterオブジェクトのCamera
  • FirstPersonCharacterrオブジェクトのAudioListener

今回は汎用的な目的のためBehaviourのリストですが、実際に使う場合は特定のコンポーネントをGetComponentで探しても良いです。またエディター操作で登録するのが面倒なボタンのクリックイベントを、スクリプトで登録するのように、Resetでコンポーネントアタッチ時にコンポーネントの接続を自動的に済ます手もあります。

gist.github.com

f:id:tsubaki_t1:20150613235507p:plain

サーバー・クライアント接続時にFPSControllerオブジェクトがインスタンス化されるようにします。この手順には大抵ResourcesやPrefabが要求されますが、この規模だと意味が無いのでシーン上のオブジェクトをインスタンス化するアプローチを取ります。

まずは空のオブジェクトのSceneResourcesオブジェクトを作成非アクティブに設定します。次にFPSControllerオブジェクトSceneResourcesオブジェクトの子として配置します。

あとはNetworkManagerコンポーネントのSpawnInfoにFPSControllerを登録します。

f:id:tsubaki_t1:20150614001243p:plain

動かす

動かしてみます。動かす際はPCが2台あればベターではありますが、面倒なのでエディターとPC向けにビルドしたプレイヤーで動作を確認します。

手順は簡単、まずCtrl(Command)+BでPC向けにビルド&実行し、エディタもゲームを再生します。ゲームを再生する時はWindowモードで動かすのが良いです。

後はPCとエディタのどちらかをLAN Host(H)、もう片方をLAN(C)を選択して接続します。キャラクターを動かした時、別クライアントのキャラクター動けば成功です。

f:id:tsubaki_t1:20150614000811p:plain

f:id:tsubaki_t1:20150614000901p:plain

f:id:tsubaki_t1:20150614000822p:plain

f:id:tsubaki_t1:20150614001011p:plain

とりあえずそれなりに動きますが、このままでは結構カクカクです。また、初期設定はレイテンシーの低い(pingの高い)ネットワーク環境に滅法弱いです。

その辺り次回に書こうと思います。

*1:任意。分かりやすければ何でも良い

*2:DisableNetworkUnlocalplayerBehaviour