Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Mirrorでマルチゲームを作る / xrdnk-yokohamaunityLT6-prese...
Search
Denik
December 18, 2020
Programming
4k
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
10k
XR Interaction Toolkit 2.0.0 正式リリース記念パピコ / xrdnk-xrmtg-lt-20220316
xrdnk
0
11k
Unidux を用いたマルチシーン構成の画面遷移 / xrdnk-unity-otonanolt-2021
xrdnk
0
6k
Unity Cloud Save でプレイヤーデータのクラウド保存しよう / xrdnk-yokohamaunitylt9
xrdnk
0
1.8k
Feel でゲームのエフェクトを豪華にしよう / xrdnk-yokohamaunityLT8
xrdnk
1
2k
Unidux Scene Transition Hands-on / xrdnk-unidux-scene-transition-hands-on
xrdnk
1
500
新MLAPIでマルチゲームを作ってみた / xrdnk-gotandaunityLT19-presentation
xrdnk
1
4.5k
三種の神器とMVRPパターン / xrdnk-three-sacred-treasures-and-mvrp-pattern
xrdnk
1
7.5k
Other Decks in Programming
See All in Programming
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
320
Intent as Code
shoppingjaws
6
1k
AHC070解法紹介
eijirou
0
120
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
1
150
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
120
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
190
Go のフラットな パッケージに 「ファイル単位の private」を 〜Linter “declscope” を作った話〜
mpyw
0
320
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
140
AI × TiDD / 2026.09.05 Redmine 大阪
tokudiro
1
170
【高い買い物LT会】初任給で話題の国産フィジカルAIを買った話
akagami
PRO
0
160
変化を抱擁するドキュメントの作り方 - ビジネスルール駆動開発がもたらす、コードとの新しい関係
ioki
2
200
AI に Inclusive UI を書かせよう — Design Rules Skill で Compose UI を作り直す
theoriatec2024
1
490
Featured
See All Featured
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
410
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
560
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
360
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
The Language of Interfaces
destraynor
162
27k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.7k
Leo the Paperboy
mayatellez
10
2.3k
Site-Speed That Sticks
csswizardry
13
1.5k
First, design no harm
axbom
PRO
2
1.3k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
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 は似通っているので参考にはなると思います.