Slide 1

Slide 1 text

Mirror でマルチゲームを作る yokohama.unity #6 Lighting Talk

Slide 2

Slide 2 text

自己紹介 【名前/ハンドルネーム】 初鹿 デニック (Hatsushika Denik) / デニキ 【Twitter】 @xrdnk 【職歴】 TIS 株式会社 19年度入社 インキュベーションセンター XR チーム 新米 XR Developer として従事中

Slide 3

Slide 3 text

Mirror とは マッチングやプレイヤー間のデータ,状態の同期,ボイスチャットなど クライアント側でオンラインゲームの実装を助けるためのネットワークライブラリアセットです. 他の代表的なライブラリといえば以下があります.

Slide 4

Slide 4 text

UNet や Photon との違い Mirror と UNet UNet は Unity 2019時点ではなくなっています. Mirror は UNet 代替 OSS アセット なので UNet の知識がある方はすぐに理解できる. 代替と言っても,一部挙動やコードの変更があるので, UNet → Mirror へ移植作業を行う場合,しっかり Migration Guide を参考にする. FYI: 【Unity】UNetからMirrorへの乗り換え入門 https://note.com/fuqunaga/n/ncabed2573297 Mirror と Photon PhotonはプレイヤーのマッチングにPhoton Serverが必要であるため, インターネット環境がないと接続できない.LAN内で接続する場合であっても. Mirrorの場合はインターネットに接続されていないLAN環境でも動かすことができる. LAN内でのサーバー検索機能を利用したり,サーバIPが固定であれば,IP直打ちで接続可能.

Slide 5

Slide 5 text

環境構築 Mirror を使った簡単なマルチゲームを 作りながら,説明していきます. 以降,以下の環境を前提に説明します. • Unity 2020.1.15f1 • Mirror 26.2.2 Mirror は Unity Asset Store から 無料でダウンロードできます. Unity 2020 から Package Manager Asset Store の仕様が変わっていることに注意.

Slide 6

Slide 6 text

Network Manager (1/2) • 空オブジェクトを生成し「NetworkManager」と名付けます. • NetworkManagerHUDをアタッチします. すると,NetworkManagerとKcpTransportも自動的にアタッチされます. NetworkManager:マルチゲームの核となる管理用コンポーネント KcpTransport:Mirrorで利用されているトランスポート(TCPより高速で信頼性が高いらしい) FYI: https://mirror-networking.com/docs/Articles/Transports/KCPTransport.html

Slide 7

Slide 7 text

Network Manager (2/2) Network Manager の Scene Management の Offline Scene と Online Scene 両方に 作成中のサンプルシーンを入れましょう. Build Settings の Scenes in Build に作成中のサンプルシーンが登録されていることを忘れずに.

Slide 8

Slide 8 text

Network Start Position でスタート地点を作ろう • Planeを右のように設置します.マテリアルは自由. • 空オブジェクトを生成し,「SpawnPoint」とします. Positionを(8, 0, 8)とし, NetworkStartPositionをアタッチします. SpawnPointを複製し,Positionを各々, (8, 0, -8), (-8, 0, -8), (-8, 0, 8)にします. これらがプレイヤーのスポーン(スタート)地点になります.

Slide 9

Slide 9 text

プレイヤーに Network Transform をアタッチしよう • Capsuleを生成して,「Player」と名付けます • PlayerにNetworkTransformをアタッチします. (自動的にNetworkIdentityもアタッチされます) NetworkTransform: ゲームオブジェクトの移動と回転を同期します クライアント側の権限で動かしたいので, AuthorityのClient Authorityにチェック入れます. NetworkIdentity: ネットワーク上のゲームオブジェクト固有ID Server Only にチェックを入れた場合, サーバー側の権限でのみスポーンすることになります.

Slide 10

Slide 10 text

Player のプレハブ化 右のスクリプトをアタッチしてから プレハブ化し,Hierarchy上では消します. NetworkBehaviour: NetworkIdentityコンポーネントを持つ ゲームオブジェクトを操作します. 基本これを継承したスクリプトを作ります. OnStartLocalPlayer(): 自クライアント側のプレイヤーが セットアップされた際に呼び出される. isLocalPlayer: 自クライアント側のプレイヤーか否か isClient, isServer等似たプロパティが存在.

Slide 11

Slide 11 text

NetworkManager に Player を登録 • NetworkManager.PlayerObject.PlayerPrefab に 作成したプレイヤーのプレハブを入れます. • PlayerSpawnMethodはデフォルトではRandomですが, ラウンドロビン方式でスポーンさせたい場合は RoundRobinを選択することもできます. • Standalone でビルドしましょう.

Slide 12

Slide 12 text

マルチプレイが出来ているか確認しよう Unity Editor 側と Standalone 側でマルチプレイを確認します. 実行すると,右上に右のようなUIが出てきます. NetworkManagerHUDの機能で,マッチングをしてくれます. 片方をHostで入り,もう一方はClientで入ります. 以下のようになれば,無事にマルチプレイができたことになります.

Slide 13

Slide 13 text

用語確認 • サーバ Server 全プレイヤーが接続する1つのゲームインスタンス.ゲームを管理し,データをクライアントに伝える. • クライアント Client サーバに接続するゲームインスタンス.各々のクライアントで接続するその他の人と一緒にプレイする. • 専用サーバ サーバとしてのみ実行されるゲームのインスタンス. • ホストサーバ Host 専用サーバがない場合にクライアントの一つがサーバの役割を兼ねます.

Slide 14

Slide 14 text

プレイヤーの色と名前を同期しよう(1/3) Player 上に名前が出るように以下のように設定します. • 空オブジェクトを生成し,「FloatingInfo」と名付けます. • 3D Object > 3D Text でテキスト生成し,「PlayerNameText」とします.

Slide 15

Slide 15 text

プレイヤーの色と名前を同期しよう(2/3) PlayerScriptを更新します.(のちほど詳細を説明します)

Slide 16

Slide 16 text

プレイヤーの色と名前を同期しよう(3/3) • Inspector上で PlayerNameText, FloatingInfoを設定します. • この状態でビルドすると, プレイヤーの色と名前が同期されるようになります.

Slide 17

Slide 17 text

SyncVar でデータを同期しよう • 同期させたい変数に [SyncVar] を付与 • SyncVarの値が変更された時に 呼び出される関数を指定するために hook を使用 • Hook メソッドはSyncVarプロパティと 同じ型の2つのパラメタを持つ必要があり, 第一引数は古い値, 第二引数は新しい値になります.

Slide 18

Slide 18 text

Command でサーバに命令しよう • クライアントでの入力をサーバ側に伝えたい関数に [Command] を付与 • 関数名は Cmd で始める約束.守らない場合はビルドエラーになる

Slide 19

Slide 19 text

テキストを同期しよう(1/6) • 同様にして,テキストの同期を行ってみます. • 空オブジェクトを生成し,「SceneScript」とします. • 適当に入力ボタンとテキスト表示用のUIを設置します.

Slide 20

Slide 20 text

テキストを同期しよう(2/6) • PlayerScript.csに以下を追記します.

Slide 21

Slide 21 text

テキストを同期しよう(3/6) • SceneScript.csを作成し, SceneScriptオブジェクトにアタッチします.

Slide 22

Slide 22 text

テキストを同期しよう(4/6) • ButtonのOnClick()にSceneScript.ButtonSendMessageをあてはめます. • Canvas Status Text に MessageText をあてはめます.

Slide 23

Slide 23 text

テキストを同期しよう(5/6) 実際に試してみると… • クライアント側が入室時 ホスト側,クライアント側両方にクライアントプレイヤーが参加されたことが通知された.

Slide 24

Slide 24 text

テキストを同期しよう(6/6) 実際に試してみると… • ホスト側のボタン押下時 ホスト側,クライアント側両方にホスト側が挨拶したことが通知された.

Slide 25

Slide 25 text

武器の装備を同期しよう(1/5) • 同様にして,武器の同期を行ってみます.武器は適当に作ります. • 以下を参考にWeapon1を作ります.

Slide 26

Slide 26 text

武器の装備を同期しよう(2/5) • 同様に,Weapon2を作ります.

Slide 27

Slide 27 text

武器の装備を同期しよう(3/5) • PlayerScript.csに以下を追記します.

Slide 28

Slide 28 text

武器の変更を同期しよう(4/5) • Weapon1,Weapon2 を下のように WeaponArray に入れます.完了後,ビルドします.

Slide 29

Slide 29 text

武器の変更を同期しよう(5/5) • 実際に左のAltボタンを押して(または右クリック)やってみると…(動画) 武器の変更ができました.

Slide 30

Slide 30 text

参考文献や学習用サイト • Mirror Official Document (全て英語) https://mirror-networking.com/docs/index.html こちらのQuick Guideを日本語で説明しました.続きに銃で発砲する所があるので各自やってみましょう. • 無料で使えるネットライブラリMirrorのざっくり紹介[tanaka’s Programming Memo](日本語) https://am1tanaka.hatenablog.com/entry/mirrorzakkuri • Mirror Sample Mirrorライブラリにあるサンプルシーンを参考にする. • Mirror 学習用の YouTube 動画リスト (全て英語) https://www.youtube.com/playlist?list=PLXEG2omgKgCapAmGe20XBgd87rmxFdKhK https://www.youtube.com/playlist?list=PLkx8oFug638oBYF5EOwsSS-gOVBXj1dkP https://www.youtube.com/playlist?list=PLS6sInD7ThM1aUDj8lZrF4b4lpvejB2uB ・Unity Official Document UNet マルチプレイヤーゲームとネットワーク https://docs.unity3d.com/ja/current/Manual/UNet.html UNet と Mirror は似通っているので参考にはなると思います.