Unity Multiplayerの入門

Unity MultiplayerはUnity 5.1から追加されたオンラインマルチプレイヤーなゲームを簡単に作るための仕組みです。これによって楽になったことは間違いないのですが、まだまだ発展途上という感じで実際に使われていることは多くない気がします。
その原因の一つとしては、日本語ドキュメントの準備に時間がかかったことがあると思います。はじめはUnityの公式ドキュメント上で英語版しかなくそれを読むしかないという状況だったのです。今は「マルチプレーヤーとネットワーキング」という日本語の公式ドキュメントが公開されています。


いくつかのブログでUnity Multiplayerについて解説されているのでリンクを載せておこうと思います。

テラシュールブログより
【Unit 5】Unityでマルチプレイヤーなゲームを作る入門(1)
Unityについて解説している超有名なブログです。キャラクターの移動を同期するサンプルを説明されています。ちょっと試してみたい人向けの解説です。

凹みTipsより
Unity 5.1 から導入された新しいネットワーク機能の UNET について詳しく調べてみた
公式ドキュメントの内容を日本語でわかりやすくまとめられています。Unity Multiplayerを使って作られた3D空間を歩き回れるチャットのアプリケーションを公開されていて、Unity Multiplayerを使ったデモをすぐに体験することができます。このデモのような使われ方が最もUnity Multiplayerに向いていると思います。(リアルタイムに同期して、プレイヤーは自由に出たり入ったりする)
日本語ですが公式マニュアルの説明が元で少しレベルは高めです。

ひよこのたまごより
【Unity9】UNETでマルチプレイヤーなオンラインゲーム開発【UNET1】
こちらの解説動画を日本語で記事に起こしたもののようです。1つの記事だけでなく色々なトピックを上げられています。位置の同期のやり方から始まり、ゲームオブジェクトの生成・破棄の同期、マッチメイクといった内容が解説されています。
動画が英語なのが最大の障害ですが、それ以外は丁寧に段階を追って進んでいくため習得しやすいと思います。手を動かしつつゆっくりと習っていく感じです。


上記の記事の気にいったものでもUnity Multiplayerのさわりを試すことができますが、ここでも説明しようと思います。
キャラクター(Cube)の移動を同期するというサンプルを作ってみました。キャラクターを動かすスクリプトも作りましたが、これはなくても試すことが可能です。

必要なものは

  • Network Manager
  • Network Manager HUD
  • Network Transform
  • Network Identity

の4つです。これだけあればキャラクターの移動を異なる端末間で同期することができます。
実際に異なる端末間で通信を行うためには相手を見つけなければなりません。IPアドレスがわかればできますが、IPアドレスは一定でなかったりして特定は結構難しい問題だったりします。ここらへんの話はマッチングやマッチメイクといった内容になるので今回は省きます。
同じPC上で複数のプログラムを動かして通信を行うことにします。ひとつのPCしかなくてもPC内で通信ができるのでテストが簡単です。

まず最も重要なNetwork Managerを用意します。Network ManagerコンポーネントとNetwork Manager HUDコンポーネントを同じゲームオブジェクトにアタッチするだけです。
Add ComponentのNetworkというカテゴリーにまとまっているようです。

アタッチするところはどこでも良いのですが、今回はMain Cameraにくっつけました。特に設定は行わずアタッチだけしてください。

Network Managerの設定はプレイヤーをセットするところが残っていますが、まずはプレイヤーを作ります。ドキュメントではプレイヤーオブジェクトと呼ばれているもので重要なものです。
今のところは通信が確立するたびに作られるゲームを遊ぶ人を表すものと考えて良いと思います。自分で制御できない他人のゲームオブジェクトがシーン上に現れます。

プレイヤーの制作はプレハブを作るだけです。目に見える方がわかりやすいのでCubeを使います。Cubeをプレハブ化して、Network IdentityとNetwork Transformコンポーネントをアタッチします。
Network IdentityにあるプロパティにLocal Player Authorityというものがあるのでそれをtrue(下の画像のようにチェックを入れる)にします。Network Transformコンポーネントがこの値を見て同期を行うべきか決めているのでチェックしないと位置の同期がされなくなります。
他の設定は変更しないでそのままにしてください。

プレイヤーのプレハブができたら、 Network Managerに設定を行います。
Spawn Infoを開いて、Player Prefabという項目があるのでさっき作ったプレイヤープレハブ(ここではCubeという名前)をセットします。これによりプレイヤーがNetwork Managerに認識されます。

以上で手順は完了です。これで通信してCubeの位置が同期されることを試してみます。Editor上での実行とexeを作ってそれを実行して通信を行っています。

左側の2画面の上がシーンビューで下がゲームビューです。右側のウィンドウがexeの実行画面です。
どちらも起動してからウィンドウにGUIでボタンが表示されています。
まず片方でLAN Hostを押し、その後にLAN Clientを押します。こうするとPC上で通信が行えます。左の
Editor上では自分のプレイヤーをシーンビュー上で動かしています。ゲームビューでも動くのは当然ですが、右のexeの方でも位置の変化が反映されているのがわかります。これは通信をして位置の同期を行われていることを表しています。

最後にキャラクター(Cube)を動かすスクリプトを載せておきます。このスクリプトをキャラクターにアタッチすれば方向キーで移動させることができます。
isLocalPlayerというプロパティで自分のものかどうか判定しているので、全部が動くのではなく自分のプレイヤーだけが動きます。

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class Move : NetworkBehaviour
{
    public float fSpeed = 0.1f;

    void Update()
    {
        if (isLocalPlayer)
        {
            float vert = Input.GetAxis(“Vertical”);
            float hori = Input.GetAxis(“Horizontal”);

            transform.Translate(new Vector3(hori, 0, vert) * fSpeed);
        }
    }
}