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
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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.8k
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.4k
Other Decks in Programming
See All in Programming
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
100
AI時代の仕事技芸論 — ソフトウェア開発で「遊ぶように働く」職人的熟達のすすめ
kuranuki
1
620
A2UI という光を覗いてみる
satohjohn
1
110
さぁV100、メモリをお食べ・・・
nilpe
0
130
TSKaigi Night Talks 2026_TypeScriptでサプライチェーンの整合性を型に閉じ込める
geekplus_tech
0
320
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
260
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
730
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
3
1.2k
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
120
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
dRuby over BLE
makicamel
2
320
Claspは野良GASの夢をみるか
takter00
0
170
Featured
See All Featured
Principles of Awesome APIs and How to Build Them.
keavy
128
17k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.8k
The browser strikes back
jonoalderson
0
1.2k
Embracing the Ebb and Flow
colly
88
5.1k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
220
Designing for humans not robots
tammielis
254
26k
Scaling GitHub
holman
464
140k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
Code Reviewing Like a Champion
maltzj
528
40k
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 は似通っているので参考にはなると思います.