tanaka's Programming Memo

プログラミングについてのメモ。

無料で使えるネットライブラリMirrorのざっくり紹介

f:id:am1tanaka:20200717212431p:plain

この記事は Unity アセット真夏のアドベントカレンダー 2020 Summer! – Unity公式 Asset Portal の15日目の記事です。

Unityには様々なネットワークサービスやライブラリアセットがありますが、今回はMirrorというネットワークライブラリアセットについてざっくりご紹介します!

assetstore.unity.com

※動画6のショットのRigidbodyを無効にする手順を7に移動しました(2020/9/2)

目次

ネットワークライブラリやサービスの種類

ネットワークライブラリやサービスは、ざっくりとサーバー主体のものとクライアント主体のものがあります。

サーバーを主体としたサービス

プレイヤー管理や課金の仕組み、プレイデータの保存、マーケティングのための分析ツールなどのサーバー機能を提供してくれるものです。代表的なものに、PlayFabやニフクラmobileなどがあります。

azure.microsoft.com

mbaas.nifcloud.com

スマホ向けであれば、以下のようなクロスプラットフォーム用のアセットもユーザー管理や課金アイテム、広告などのサービスを提供してくれます。

assetstore.unity.com

assetstore.unity.com

クライアント側の実装を助けてくれるライブラリ

プレイヤーのマッチングやプレイヤー間のデータの同期や遅延対策、ボイスチャットなどといったクライアント側でオンラインゲームを実装するのを助けるものです。代表的なものに、Photon Unity Networking(PUN)やPhoton Bolt、UNetなどがあり、今回のMirrorはこっち側のライブラリです。

www.photonengine.com

www.photonengine.com

mirror-networking.com

Photonはサーバー側もクライアント側も幅広くサービスやライブラリが揃っています。PlayFabは強力なサーバー側のサービスが揃っていて、クライアント側にはPhotonを使うといった組み合わせるができるようです。ニフクラはサービスを提供しているだけではなく、技術的な相談もしやすそうな印象です。

AWSGoogle Cloudももちろんあるのですが、サーバーのホストからリアルタイム利用まで多岐に渡りすぎてまとめきれないので、ここではありますぐらいに留めます。

Mirrorとは

今回紹介するMirrorは、vis2kさんが無料で公開しているオープンソースのネットワークライブラリアセットです。以下、アセットストアの冒頭より。

Mirrorは、低レベルのネットワークライブラリTelepathy上に構築したUnity用の高レベルのネットワークAPIです。 Mirrorは、uMMORPGやCubicaといったMMO規模のネットワーキングのために開発、そしてテストされました。

PUNやPhoton Bolt、UNetと同様、Unityでプレイヤー間の同期をするなど、オンラインゲームのPC間の同期などを助けてくれるライブラリです。以下のような機能を持っています。

  • サーバーとクライアントを1つのプロジェクトで実装するための属性やパラメーター
  • サーバーやクライアントを接続するためのNetworkManagerとNetworkManagerHUD
  • ゲームオブジェクトの位置やアニメを同期させるNetworkTransform, NetworkAnimatorなど
  • パラメーターを自動同期するSyncVarやSyncEventなど
  • ネットワーク間で情報をやりとりするCommandやClientRPC、各種コールバック
  • Room機能
  • などなど

Mirrorの得意分野と不得意分野

個人的に感じている得意不得意は以下の通りです。

  • 得意分野
    • インターネットがない環境でも動かせる
    • 機能がコンパクトで設計が素直なので分かりやすい
    • ゲームサーバーを自前で運用できる
    • 数千接続といった比較的大規模なものが構築可能
    • 更新が続いている
  • 苦手分野
    • サービスをインターネットに手軽に公開できない
    • 行動予測などがない
    • サポートが弱い(他は大手企業ばかりなので)

Mirrorを選択する決め手

MirrorとPhotonの最大の違いは、良くも悪くもプレイヤーのマッチングに公式サーバーが必要ないということだと思います。PhotonはLAN内で接続する場合でも公式サーバーを通す必要があります。そのためインターネットがない環境では接続ができません。ガチガチのセキュリティーが施されている学校内やイベントでの展示などでこれがネックになる恐れがあります。MirrorはNet DiscoveryといったLAN内でのサーバー検索機能を使ったり、サーバーのIPが固定であればIP直打ちで接続できるのでインターネットに接続されていないLAN環境でも動かすことができます。

自分の場合は、学園祭や学校の体験入学用のプロジェクトにMirrorを採用しました。

インターネットごしに接続する予定があるのであれば、素直にPhoton系のサービスでよいと思います。20名程度の試用レベルの接続であれば無料でマッチングやリレーサービスを利用することができます。非リアルタイムであったりWebGLで使うならPUN2、リアルタイムオンラインゲームに特化するならPhoton Boltがオススメです。

学習コストと教材

学習コスト

学習コストは前提知識次第ですが、UNetを使ったことがあればほぼそのままなので1~2日で使えるのではないかと思います。

オンラインゲーム作りのノウハウがない場合は、オンラインゲームを動かすための考え方を理解するところからなので1ヶ月以上はかかりそうです。

オンラインゲーム作りのノウハウがあれば、Mirrorの使い方自体は1週間もあれば使えるようになると思います。

教材

Mirrorの教材です。以下の順で目を通していくとよいのではないかと思います。

ネットワークは、どこで何が動いているのかの仕組みを理解していないと、マニュアルを読んだり説明を聞くだけでは理解するのが難しいです。まずはサンプルや動画を見て動きを確認したり、実際に自分でも実装をしてみながら、マニュアルを併せて読んでいくのがよいと思います。

インターネットにサービスを公開するには(調査中)

Mirrorから使えるList Serverというマッチングのサービスが月額20ドルで用意されています。

mirror-networking.com

List Serverがマッチングのためのアクセスポイントになり、自宅サーバーやホスティングサービスなどに立てているゲームサーバーのIPアドレスとポートを接続相手に伝えてプレイヤー同士を接続するようです。ゲームサーバーで指定する指定のポートは、インターネットからアクセスできるように設定しておく必要があります。NATパンチスルーがないので、一般のプレイヤーが気軽にホストになる、というような運用は難しそうです。

List Serverを利用するには、Mirrorのアセットに含まれているサンプルコードを自分のプロジェクトに組み込むよう紹介されていて、PhotonやUNetのように最初から接続できる機能が含まれている訳ではないようです。

サーバー環境を丸ごと自前で構築できるので、サーバーコストはList Serverと原価のみ、ということが可能ではあります。また、ディアブロのようにサーバー側の知識を持ったプレイヤーが野良サーバーを立ち上げて自由に遊んでもらうようなこともできます。手軽ではありませんが、オープンソースなので自由度は圧倒的です。

英語ですが、以下の公式ドキュメントにサーバーの立て方やAWSでのセットアップ例が紹介されています。

mirror-networking.com

以下、UNet版のゲームサーバーの立ち上げチュートリアルです。Mirrorも対応しているようです。これも英語ですが...

noobtuts.com

Mirrorの組み込み手順の紹介動画

簡単なサンプルプロジェクトを作って、Mirrorでオンライン化するチュートリアル動画など用意してみました。

サンプルプロジェクトは以下からダウンロードできます。

github.com

1. サンプルプロジェクトの準備

youtu.be

2. Mirrorのインポート

youtu.be

3. プレイヤーをオンラインに登場

NetworkIdentityやNetworkManagerなどのMirrorの根幹コンポーネントの紹介。

youtu.be

4. プレイヤーの操作をネットに対応

NetworkBehaviourでローカルプレイヤーを制御する。

youtu.be

5. プレイヤーごとに色を変えるカスタマイズ

カスタムプレイヤーオブジェクトの実装例。

youtu.be

6. ショットをネットに対応

変数を同期するSyncVarやサーバーのメソッドを呼び出すCommandの利用。

youtu.be

※Rigidbodyを無効にする処理を7に移動しました(2020/9/2)

7. ショットの色を設定

youtu.be

※Rigidbodyを無効にする処理を最後に追加しました(2020/9/2)

8. 持ち弾数の管理

youtu.be

9. ミスの処理の概要

サーバーとクライアントの役割のざっくり説明。

youtu.be

10. プレイヤーと弾を消す

youtu.be

11. 爆発をネットに対応

youtu.be

12. ネットからの離脱、GUIの表示調整

カスタムのNetworkManagerによる接続管理。

youtu.be

まとめ

Mirrorは、プレイヤー間の接続ゲームの状態やキャラクター、オブジェクトの同期といったオンラインゲームを開発する上で役立つ機能を提供してくれる軽量なオープンソースのネットワークライブラリです。

インターネット接続のないLAN環境で動かすことができ、自分でサーバーを立ち上げる知識があれば自由にゲームサーバーを構築できます。がっちりと企業がついてサポートしてくれる他のネットワークサービスとは趣が異なり、良くも悪くも自前であらゆることができる自由度の高いライブラリです。

展示であったり、利用用途が限定されている場合は自由度の高さが魅力です。また、本格的にがっちりとサーバーまで勉強したり開発したりする時に、オープンソースなのでよい題材になるのではないかと思います。

おまけ

Mirrorの作者さんがDOTSNETという新しいネットワークライブラリアセットを公開しました。$100の有料アセットなのですが、MirrorをECSで高機能化したものだそうです。Unity2020.1以降向けで、ECSの基礎知識が必要な上に$100という攻め込みまくったアセットですが、うまく動作すれば処理速度や消費電力など恩恵は大きそうです。

使ったことがないのでオススメできるだけの知識はありませんが情報共有までに。

参考URL