Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
Mirrorでマルチゲームを作る / xrdnk-yokohamaunityLT6-presentation
xrdnk
December 18, 2020
Programming
0
130
Mirrorでマルチゲームを作る / xrdnk-yokohamaunityLT6-presentation
xrdnk
December 18, 2020
Tweet
Share
More Decks by xrdnk
See All by xrdnk
xrdnk
0
160
xrdnk
0
570
xrdnk
0
400
xrdnk
0
510
xrdnk
0
110
xrdnk
0
370
Other Decks in Programming
See All in Programming
nbkouhou
1
1.1k
azdaroth
0
150
tommykw
1
320
yaamaa
0
410
kyonmm
2
2.1k
manfredsteyer
PRO
0
250
e10dokup
0
440
nrslib
20
13k
showwin
0
120
itosho525
0
350
asumikan
0
280
aratayokoyama
0
200
Featured
See All Featured
brad_frost
156
6.4k
davidbonilla
69
3.5k
jmmastey
8
530
hannesfritz
27
930
andyhume
62
3.3k
lynnandtonic
270
16k
cassininazir
347
20k
brettharned
93
3k
frogandcode
127
20k
jeffersonlam
328
15k
dougneiner
55
5.4k
morganepeng
17
1.1k
Transcript
Mirror でマルチゲームを作る yokohama.unity #6 Lighting Talk
自己紹介 【名前/ハンドルネーム】 初鹿 デニック (Hatsushika Denik) / デニキ 【Twitter】 @xrdnk
【職歴】 TIS 株式会社 19年度入社 インキュベーションセンター XR チーム 新米 XR Developer として従事中
Mirror とは マッチングやプレイヤー間のデータ,状態の同期,ボイスチャットなど クライアント側でオンラインゲームの実装を助けるためのネットワークライブラリアセットです. 他の代表的なライブラリといえば以下があります.
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直打ちで接続可能.
環境構築 Mirror を使った簡単なマルチゲームを 作りながら,説明していきます. 以降,以下の環境を前提に説明します. • Unity 2020.1.15f1 • Mirror
26.2.2 Mirror は Unity Asset Store から 無料でダウンロードできます. Unity 2020 から Package Manager Asset Store の仕様が変わっていることに注意.
Network Manager (1/2) • 空オブジェクトを生成し「NetworkManager」と名付けます. • NetworkManagerHUDをアタッチします. すると,NetworkManagerとKcpTransportも自動的にアタッチされます. NetworkManager:マルチゲームの核となる管理用コンポーネント KcpTransport:Mirrorで利用されているトランスポート(TCPより高速で信頼性が高いらしい)
FYI: https://mirror-networking.com/docs/Articles/Transports/KCPTransport.html
Network Manager (2/2) Network Manager の Scene Management の Offline
Scene と Online Scene 両方に 作成中のサンプルシーンを入れましょう. Build Settings の Scenes in Build に作成中のサンプルシーンが登録されていることを忘れずに.
Network Start Position でスタート地点を作ろう • Planeを右のように設置します.マテリアルは自由. • 空オブジェクトを生成し,「SpawnPoint」とします. Positionを(8, 0,
8)とし, NetworkStartPositionをアタッチします. SpawnPointを複製し,Positionを各々, (8, 0, -8), (-8, 0, -8), (-8, 0, 8)にします. これらがプレイヤーのスポーン(スタート)地点になります.
プレイヤーに Network Transform をアタッチしよう • Capsuleを生成して,「Player」と名付けます • PlayerにNetworkTransformをアタッチします. (自動的にNetworkIdentityもアタッチされます) NetworkTransform:
ゲームオブジェクトの移動と回転を同期します クライアント側の権限で動かしたいので, AuthorityのClient Authorityにチェック入れます. NetworkIdentity: ネットワーク上のゲームオブジェクト固有ID Server Only にチェックを入れた場合, サーバー側の権限でのみスポーンすることになります.
Player のプレハブ化 右のスクリプトをアタッチしてから プレハブ化し,Hierarchy上では消します. NetworkBehaviour: NetworkIdentityコンポーネントを持つ ゲームオブジェクトを操作します. 基本これを継承したスクリプトを作ります. OnStartLocalPlayer(): 自クライアント側のプレイヤーが
セットアップされた際に呼び出される. isLocalPlayer: 自クライアント側のプレイヤーか否か isClient, isServer等似たプロパティが存在.
NetworkManager に Player を登録 • NetworkManager.PlayerObject.PlayerPrefab に 作成したプレイヤーのプレハブを入れます. • PlayerSpawnMethodはデフォルトではRandomですが,
ラウンドロビン方式でスポーンさせたい場合は RoundRobinを選択することもできます. • Standalone でビルドしましょう.
マルチプレイが出来ているか確認しよう Unity Editor 側と Standalone 側でマルチプレイを確認します. 実行すると,右上に右のようなUIが出てきます. NetworkManagerHUDの機能で,マッチングをしてくれます. 片方をHostで入り,もう一方はClientで入ります. 以下のようになれば,無事にマルチプレイができたことになります.
用語確認 • サーバ Server 全プレイヤーが接続する1つのゲームインスタンス.ゲームを管理し,データをクライアントに伝える. • クライアント Client サーバに接続するゲームインスタンス.各々のクライアントで接続するその他の人と一緒にプレイする. •
専用サーバ サーバとしてのみ実行されるゲームのインスタンス. • ホストサーバ Host 専用サーバがない場合にクライアントの一つがサーバの役割を兼ねます.
プレイヤーの色と名前を同期しよう(1/3) Player 上に名前が出るように以下のように設定します. • 空オブジェクトを生成し,「FloatingInfo」と名付けます. • 3D Object > 3D
Text でテキスト生成し,「PlayerNameText」とします.
プレイヤーの色と名前を同期しよう(2/3) PlayerScriptを更新します.(のちほど詳細を説明します)
プレイヤーの色と名前を同期しよう(3/3) • Inspector上で PlayerNameText, FloatingInfoを設定します. • この状態でビルドすると, プレイヤーの色と名前が同期されるようになります.
SyncVar でデータを同期しよう • 同期させたい変数に [SyncVar] を付与 • SyncVarの値が変更された時に 呼び出される関数を指定するために hook
を使用 • Hook メソッドはSyncVarプロパティと 同じ型の2つのパラメタを持つ必要があり, 第一引数は古い値, 第二引数は新しい値になります.
Command でサーバに命令しよう • クライアントでの入力をサーバ側に伝えたい関数に [Command] を付与 • 関数名は Cmd で始める約束.守らない場合はビルドエラーになる
テキストを同期しよう(1/6) • 同様にして,テキストの同期を行ってみます. • 空オブジェクトを生成し,「SceneScript」とします. • 適当に入力ボタンとテキスト表示用のUIを設置します.
テキストを同期しよう(2/6) • PlayerScript.csに以下を追記します.
テキストを同期しよう(3/6) • SceneScript.csを作成し, SceneScriptオブジェクトにアタッチします.
テキストを同期しよう(4/6) • ButtonのOnClick()にSceneScript.ButtonSendMessageをあてはめます. • Canvas Status Text に MessageText をあてはめます.
テキストを同期しよう(5/6) 実際に試してみると… • クライアント側が入室時 ホスト側,クライアント側両方にクライアントプレイヤーが参加されたことが通知された.
テキストを同期しよう(6/6) 実際に試してみると… • ホスト側のボタン押下時 ホスト側,クライアント側両方にホスト側が挨拶したことが通知された.
武器の装備を同期しよう(1/5) • 同様にして,武器の同期を行ってみます.武器は適当に作ります. • 以下を参考にWeapon1を作ります.
武器の装備を同期しよう(2/5) • 同様に,Weapon2を作ります.
武器の装備を同期しよう(3/5) • PlayerScript.csに以下を追記します.
武器の変更を同期しよう(4/5) • Weapon1,Weapon2 を下のように WeaponArray に入れます.完了後,ビルドします.
武器の変更を同期しよう(5/5) • 実際に左のAltボタンを押して(または右クリック)やってみると…(動画) 武器の変更ができました.
参考文献や学習用サイト • 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 は似通っているので参考にはなると思います.