Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Mirrorでマルチゲームを作る / xrdnk-yokohamaunityLT6-prese...
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Denik
December 18, 2020
Programming
3.9k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Mirrorでマルチゲームを作る / xrdnk-yokohamaunityLT6-presentation
Denik
December 18, 2020
More Decks by Denik
See All by Denik
Oculus Interaction SDK 概説 / xrdnk-caunity-LT4
xrdnk
0
12k
Unity Localization で多言語対応実装しよう / xrdnk-yokohamaunity-lt10-20220513
xrdnk
0
9.9k
XR Interaction Toolkit 2.0.0 正式リリース記念パピコ / xrdnk-xrmtg-lt-20220316
xrdnk
0
10k
Unidux を用いたマルチシーン構成の画面遷移 / xrdnk-unity-otonanolt-2021
xrdnk
0
5.9k
Unity Cloud Save でプレイヤーデータのクラウド保存しよう / xrdnk-yokohamaunitylt9
xrdnk
0
1.7k
Feel でゲームのエフェクトを豪華にしよう / xrdnk-yokohamaunityLT8
xrdnk
1
2k
Unidux Scene Transition Hands-on / xrdnk-unidux-scene-transition-hands-on
xrdnk
1
490
新MLAPIでマルチゲームを作ってみた / xrdnk-gotandaunityLT19-presentation
xrdnk
1
4.3k
三種の神器とMVRPパターン / xrdnk-three-sacred-treasures-and-mvrp-pattern
xrdnk
1
7.5k
Other Decks in Programming
See All in Programming
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
320
PHPだって関数型したい 〜できること、できないこと〜 / fp-in-php
jsoizo
1
240
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
2
910
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
5.4k
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
act1-costs.pdf
sumedhbala
0
250
Apache Hive: Toward a Cloud Native Lakehouse
okumin
0
160
PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜
kashioka
0
650
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
350
数百円から始めるRuby電子工作
tarosay
0
100
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
190
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
210
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
Why Our Code Smells
bkeepers
PRO
340
58k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Bash Introduction
62gerente
615
220k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.2k
It's Worth the Effort
3n
188
29k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
410
BBQ
matthewcrist
89
10k
Statistics for Hackers
jakevdp
799
230k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
230
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 は似通っているので参考にはなると思います.