Skip to main content
Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
EN
Upload
Download free for 30 days
Sign in
Uploaded by
torisoup
PDF, PPTX
30,678 views
MagicOnion~C#でゲームサーバを開発しよう~
https://vsuc.connpass.com/event/146588/
Technology
◦
Read more
11
Save
Share
Embed
Save to Drive
Download now
Download as PDF, PPTX
1
/ 176
2
/ 176
Most read
3
/ 176
Most read
4
/ 176
5
/ 176
6
/ 176
7
/ 176
8
/ 176
9
/ 176
10
/ 176
11
/ 176
12
/ 176
13
/ 176
14
/ 176
Most read
15
/ 176
16
/ 176
17
/ 176
18
/ 176
19
/ 176
20
/ 176
More Related Content
PDF
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
by
Naoya Kishimoto
123 slides
3.2K views
PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
63 slides
65.1K views
PDF
オンラインゲームの仕組みと工夫
by
Yuta Imai
56 slides
889.1K views
PDF
Unity開発で使える設計の話+Zenjectの紹介
by
torisoup
139 slides
133.6K views
PDF
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
145 slides
46.9K views
PDF
MMORPGで考えるレベルデザイン
by
Katsumi Mizushima
117 slides
55.8K views
PPTX
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
by
DeNA
82 slides
64.7K views
PPTX
ゲームの楽しさを図式化する ―楽しさを網羅的に分類する「主体性構造モデル」
by
井戸 里志
35 slides
5.4K views
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
by
Naoya Kishimoto
123 slides
3.2K views
ネットワーク ゲームにおけるTCPとUDPの使い分け
by
モノビット エンジン
63 slides
65.1K views
オンラインゲームの仕組みと工夫
by
Yuta Imai
56 slides
889.1K views
Unity開発で使える設計の話+Zenjectの紹介
by
torisoup
139 slides
133.6K views
【CEDEC2017】Unityを使ったNintendo Switch™向けのタイトル開発・移植テクニック!!
by
Unity Technologies Japan K.K.
145 slides
46.9K views
MMORPGで考えるレベルデザイン
by
Katsumi Mizushima
117 slides
55.8K views
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
by
DeNA
82 slides
64.7K views
ゲームの楽しさを図式化する ―楽しさを網羅的に分類する「主体性構造モデル」
by
井戸 里志
35 slides
5.4K views
What's hot
PDF
MagicOnion入門
by
torisoup
37 slides
11.5K views
PDF
The Usage and Patterns of MagicOnion
by
Yoshifumi Kawai
53 slides
47.5K views
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
by
UnityTechnologiesJapan002
82 slides
73.8K views
PDF
コールバックと戦う話
by
torisoup
59 slides
3.4K views
PPTX
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
by
Game Tools & Middleware Forum
64 slides
6.5K views
PDF
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
by
Yoshifumi Kawai
53 slides
261.5K views
PPTX
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
by
sairoutine
54 slides
9.9K views
PPTX
テストコードの DRY と DAMP
by
Yusuke Kagata
11 slides
4.5K views
PDF
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
87 slides
86.6K views
PDF
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
68 slides
65.4K views
PDF
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
by
Yoshifumi Kawai
52 slides
5.5K views
PDF
インタフェース完全に理解した
by
torisoup
39 slides
6.9K views
PDF
Observableで非同期処理
by
torisoup
191 slides
11.1K views
PDF
UE4におけるキャラクタークラス設計
by
Masahiko Nakamura
57 slides
18.3K views
PDF
ObserverパターンからはじめるUniRx
by
torisoup
45 slides
9.8K views
KEY
やはりお前らのMVCは間違っている
by
Koichi Tanaka
66 slides
153.6K views
PDF
Riderはいいぞ!
by
UnityTechnologiesJapan002
145 slides
16.5K views
PPTX
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
by
U-dai Yokoyama
26 slides
18.9K views
PDF
[UE4]自動テストでもっと楽したい!
by
com044
139 slides
21.1K views
PDF
『バランワンダーワールド』でのマルチプラットフォーム対応について UNREAL FEST EXTREME 2021 SUMMER
by
エピック・ゲームズ・ジャパン Epic Games Japan
40 slides
5.4K views
MagicOnion入門
by
torisoup
37 slides
11.5K views
The Usage and Patterns of MagicOnion
by
Yoshifumi Kawai
53 slides
47.5K views
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
by
UnityTechnologiesJapan002
82 slides
73.8K views
コールバックと戦う話
by
torisoup
59 slides
3.4K views
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
by
Game Tools & Middleware Forum
64 slides
6.5K views
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
by
Yoshifumi Kawai
53 slides
261.5K views
CEDEC2019 大規模モバイルゲーム運用におけるマスタデータ管理事例
by
sairoutine
54 slides
9.9K views
テストコードの DRY と DAMP
by
Yusuke Kagata
11 slides
4.5K views
Unityでパフォーマンスの良いUIを作る為のTips
by
Unity Technologies Japan K.K.
87 slides
86.6K views
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
by
Unity Technologies Japan K.K.
68 slides
65.4K views
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
by
Yoshifumi Kawai
52 slides
5.5K views
インタフェース完全に理解した
by
torisoup
39 slides
6.9K views
Observableで非同期処理
by
torisoup
191 slides
11.1K views
UE4におけるキャラクタークラス設計
by
Masahiko Nakamura
57 slides
18.3K views
ObserverパターンからはじめるUniRx
by
torisoup
45 slides
9.8K views
やはりお前らのMVCは間違っている
by
Koichi Tanaka
66 slides
153.6K views
Riderはいいぞ!
by
UnityTechnologiesJapan002
145 slides
16.5K views
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
by
U-dai Yokoyama
26 slides
18.9K views
[UE4]自動テストでもっと楽したい!
by
com044
139 slides
21.1K views
『バランワンダーワールド』でのマルチプラットフォーム対応について UNREAL FEST EXTREME 2021 SUMMER
by
エピック・ゲームズ・ジャパン Epic Games Japan
40 slides
5.4K views
Similar to MagicOnion~C#でゲームサーバを開発しよう~
PDF
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
by
Yoshifumi Kawai
37 slides
43.2K views
PPTX
Using or not using magic onion
by
Goichi Shinohara
15 slides
1.3K views
PDF
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
by
UnityTechnologiesJapan002
52 slides
47.5K views
PDF
NextGen Server/Client Architecture - gRPC + Unity + C#
by
Yoshifumi Kawai
38 slides
79.7K views
PPTX
Azure PlayFab トレーニング資料
by
Daisuke Masubuchi
66 slides
805 views
PDF
Implements OpenTelemetry Collector in DotNet
by
Yoshifumi Kawai
21 slides
42.9K views
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
by
Yoshifumi Kawai
37 slides
43.2K views
Using or not using magic onion
by
Goichi Shinohara
15 slides
1.3K views
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
by
UnityTechnologiesJapan002
52 slides
47.5K views
NextGen Server/Client Architecture - gRPC + Unity + C#
by
Yoshifumi Kawai
38 slides
79.7K views
Azure PlayFab トレーニング資料
by
Daisuke Masubuchi
66 slides
805 views
Implements OpenTelemetry Collector in DotNet
by
Yoshifumi Kawai
21 slides
42.9K views
More from torisoup
PDF
Doozy UI 使おうぜ! #unity_lt
by
torisoup
72 slides
27.6K views
PDF
UniTask入門
by
torisoup
95 slides
15.5K views
PDF
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
by
torisoup
43 slides
4.4K views
PDF
ARでVRアバターを表示するシステムを構築しよう
by
torisoup
100 slides
3.5K views
PDF
【Unity】 Behavior TreeでAIを作る
by
torisoup
49 slides
24K views
PDF
Unityでオニオンアーキテクチャ
by
torisoup
44 slides
12.5K views
PDF
Photon Cloud ことはじめ
by
torisoup
40 slides
2K views
PDF
アバター生放送支援アプリ「アバれぽ」
by
torisoup
36 slides
844 views
PDF
UniRx完全に理解した
by
torisoup
36 slides
10.3K views
PDF
UnityとNCMBでユーザ管理を実装してみた話
by
torisoup
29 slides
2.7K views
PDF
Task vs Observable
by
torisoup
38 slides
554 views
PDF
Unityでオンラインゲーム作った話
by
torisoup
47 slides
10.9K views
PDF
UniRxでPUNを使いやすくする
by
torisoup
20 slides
4.5K views
PPTX
はじめてのUniRx
by
torisoup
94 slides
91.3K views
PPTX
UniRxでMV(R)Pパターンをやってみた
by
torisoup
21 slides
30.1K views
PPTX
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
145 slides
163.8K views
PPTX
みくみくまうすについて&Unity で使えるコーディングノウハウ
by
torisoup
114 slides
9.2K views
PDF
Unity講習会(初級)
by
torisoup
118 slides
22.3K views
Doozy UI 使おうぜ! #unity_lt
by
torisoup
72 slides
27.6K views
UniTask入門
by
torisoup
95 slides
15.5K views
Unityで作ったゲームをDLカードで配布してみた話 #roppongiunity
by
torisoup
43 slides
4.4K views
ARでVRアバターを表示するシステムを構築しよう
by
torisoup
100 slides
3.5K views
【Unity】 Behavior TreeでAIを作る
by
torisoup
49 slides
24K views
Unityでオニオンアーキテクチャ
by
torisoup
44 slides
12.5K views
Photon Cloud ことはじめ
by
torisoup
40 slides
2K views
アバター生放送支援アプリ「アバれぽ」
by
torisoup
36 slides
844 views
UniRx完全に理解した
by
torisoup
36 slides
10.3K views
UnityとNCMBでユーザ管理を実装してみた話
by
torisoup
29 slides
2.7K views
Task vs Observable
by
torisoup
38 slides
554 views
Unityでオンラインゲーム作った話
by
torisoup
47 slides
10.9K views
UniRxでPUNを使いやすくする
by
torisoup
20 slides
4.5K views
はじめてのUniRx
by
torisoup
94 slides
91.3K views
UniRxでMV(R)Pパターンをやってみた
by
torisoup
21 slides
30.1K views
未来のプログラミング技術をUnityで -UniRx-
by
torisoup
145 slides
163.8K views
みくみくまうすについて&Unity で使えるコーディングノウハウ
by
torisoup
114 slides
9.2K views
Unity講習会(初級)
by
torisoup
118 slides
22.3K views
MagicOnion~C#でゲームサーバを開発しよう~
1.
MagicOnion 〜C#でゲームサーバを開発しよう〜 .NET Conf in
Tokyo 2019 #dotnetconfunity 2019/10/27 とりすーぷ
2.
⾃⼰紹介 • 「とりすーぷ」 • @toRisouP •
株式会社バーチャルキャスト 開発 • xR開発 • 最近はサーバ開発 • Microsoft MVP for Developer Technologies 2018〜2020
3.
今回の話 • MagicOnionについて解説 • 何のためのフレームワークか •
どんな機能があるのか • 環境構築 • 実装例の紹介 • 実装時の注意点 • デプロイ
4.
MagicOnionって何?
5.
MagicOnion is 何 •
ネットワーク通信のためのフレームワーク • Unityでのゲーム開発を中⼼に使えるネットワーク通信フレームワーク • サーバサイド:.NET Core • クライアントサイド:Unity / .NET Core • 開発はCysharp社 • MITライセンス
6.
MagicOnionのバックエンド • C# +
.NET Core / Unity • 通信プロトコル: gRPC • データフォーマット: MessagePack for C# • 定義したC#ファイルがそのままDSLになる • C#インタフェースがAPIのエンドポイント • C#オブジェクトが通信データ構造(MessagePackObject)
7.
MagicOnionのバックエンド クライアント サーバ プロトコルはgRPC データフォーマットはMessagePack C#ファイルの定義がそのままAPIのエンドポイントに
8.
コード共有 • 定義したインタフェースやオブジェクトを、 サーバとクライアントで共有することで そのままAPI定義として利⽤できる
9.
コード共有 クライアント サーバ インタフェース定義 (APIエンドポイント) インタフェース定義されたC#ファイルを クライアント・サーバで共有
10.
例:APIエンド先⽃の定義 共有するインタフェースを定義
11.
実装 クライアント サーバ サーバ側はインタフェースを実装する 実装
12.
サーバ側実装
13.
呼び出し クライアント サーバ クライアント側はただ インタフェースのメソッドを呼び出すだけ メソッドコール (async/awiat)
14.
クライアント側の呼び出し gRPCのコネクションを貼ってからメソッドを呼ぶだけ インタフェースに定義されたメソッドをコール 裏で通信が⾏われ、結果はasync/awaitで待てる
15.
サーバ処理の呼び出しの流れ サーバ メソッド実⾏すると裏でサーバコードが呼び出されて その結果が返ってくるのをawaitで待てる
16.
共有ファイルを介した通信 クライアント サーバ 共有したインタフェースを介して クライアント/サーバ間の通信が可能になる
17.
MagicOnion 最⼤の特徴 • 通信レイヤを意識せずにサーバコードを呼び出せる •
サーバとクライアントでC#インタフェースを共有すればOK • 通信のデータ構造もC#で定義すればOK • async/awaitでメソッド呼び出しするだけでサーバの処理を実⾏できる • ただし、gRPCのコネクション管理だけは⾃前で管理しないとダメ(しょうがない)
18.
MagicOnionの機能紹介
19.
機能⼀覧 • 実装できるAPIの種類 • Service、StreamingHub •
Filter機能 • Filter • その他便利な機能 • Swagger、Telemetry
20.
APIの実装 • ⼤きく2つのAPI実装パターンがある • Service •
StreamingHub
21.
Service • Service • シンプルな単発のAPIを作成するのに使う •
1Request ‒ 1Response通信(中⾝はUnary RPC) • リクエストを投げた本⼈にのみレスポンスを返せる
22.
Service クライアント サーバRequest Response 1Requestに対して1Responseのみ返せるのが 「Service」で実装したAPI
23.
StreamingHub • StreamingHub • リアルタイム通信向け •
中⾝はBidirectional Streaming RPC • 仮想的なコネクションを貼ったままずっと維持する • クライアントとサーバが⾃由にメッセージを送受信できる • 全体へブロードキャストも可能
24.
StreamingHub クライアント サーバ Message クライアント同⼠がサーバを介して 相互通信できるのが「StremingHub」 Broadcast Broadcast
25.
機能⼀覧 • 実装できるAPIの種類 • Service、StreamingHub •
Filter機能 • Filter • その他便利な機能 • Swagger、Telemetry
26.
Filter • 通信の前後に処理を追加する機能 • サーバ側フィルタ •
Service、StreamingHubに適⽤可能 • クライアント側フィルタ • Serviceのみ対応
27.
Filterの実装例(サーバ側)
28.
Filterを反映する • Filterを付けたいクラス/メソッドにAttributeをつける • このメソッド/クラスのRPCが実⾏されるタイミングで、 定義したFilterを通過する
29.
Filterの⽤途 • 使⽤例 • 認証⽤のヘッダーを追加 •
メッセージの暗号化/復号化 • 通信ログ出⼒ • 通信をせずにダミーのレスポンスの差し替え • エラーメッセージのハンドリング • リトライ処理
30.
機能⼀覧 • 実装できるAPIの種類 • Service、StreamingHub •
Filter機能 • Filter • その他便利な機能 • Swagger、Telemetry
31.
便利な機能 • Swagger対応 • 「Service」で実装したメソッドをREST
APIとして実⾏できる • Webブラウザ上でAPIの動作確認ができる • デバッグに便利 • Telemetry対応 • MagicOnionの監視 • メトリクス
32.
今回の話 • MagicOnionについて解説 • 何のためのフレームワークか •
どんな機能があるのか • 環境構築 • 実装例の紹介 • 実装時の注意点 • デプロイ
33.
MagicOnionの環境構築
34.
環境構築 • MagicOnionは環境構築がちょっとたいへん • クライアント側(Unity)は⼿動でライブラリ追加が必要 •
コード共有 • コードジェネレート
35.
クライアント ライブラリ導⼊ • これらのライブラリを⼿動でUnityに導⼊する必要がある •
MagicOnion.Client.Unity.unitypackage • https://github.com/Cysharp/MagicOnion/releases • MessagePack.Unity.x.x.x.x.unitypackage • https://github.com/neuecc/MessagePack-CSharp/releases • gRPC Unity plugin • https://packages.grpc.io/
36.
Player Settingsも設定が必要 • Scripting
Define Symbols • ENABLE_UNSAFE_MSGPACK を書き⾜す • Allow ʻunsafeʼ Code • Enable
37.
ついでに導⼊するとよさげ • UniRx • Reactive
Extensions for Unity • イベント処理の整理に便利 • UniTask • ValueTask for Unity • Unity向けのAwaiter実装の提供 • ⾮同期周りにはコレ
38.
環境構築 • MagicOnionは環境構築がちょっとたいへん • クライアント側(Unity)は⼿動でライブラリ追加が必要 •
コード共有 • コードジェネレート
39.
コード共有について クライアント サーバ インタフェース定義 (APIエンドポイント) インタフェース定義されたC#ファイルを どうやってクライアント/サーバでコード共有するの?
40.
Unity側の制約 • C#コードはAssets/以下に配置しないといけない • UnityはAssets/以下のC#ファイルしかコンパイルしてくれない
41.
オススメの⽅法 • サーバ側のcsprojからUnity/Assets以下を参照する • 実体はUnity側にあり、それをサーバプロジェクトで開いているだけ 参照 Unityサーバプロジェクト
42.
プロジェクト構成の例 Assets/ Assets/Shared/ サーバプロジェクト(ソリューション構成) Server.Interfaces.csproj Server.Core.csproj プロジェクト構成の⼀例
43.
プロジェクト構成の例 Assets/ Assets/Shared/ サーバプロジェクト(ソリューション構成) Server.Interfaces.csproj Server.Core.csproj 共有⽤csprojからUnity/Assets/以下を参照する 参照 ファイルの実体はこっち
44.
プロジェクト構成の例 Assets/ Assets/Shared/ サーバプロジェクト(ソリューション構成) Server.Interfaces.csproj Server.Core.csproj ポイント:共有するcsprojと、サーバのコアロジックのcsprojを分離して コアプロジェクトから共有プロジェクトを参照する 参照
45.
プロジェクト構成の例 Assets/ Assets/Shared/ Server.Interfaces.csproj Server.Core.csproj git管理するときはこれらをまとめて1つのリポジトリに⼊れる これで1つの Git
Repository
46.
この⽅法のメリット • 設定が簡単 • csprojに数⾏書き⾜すだけで設定が終わる •
リポジトリをチェックアウトしてくればそのまま動く • 環境に依存しない • シンボリックリンクとかそういう⾯倒な作業もいらない • 相対パスさえ維持されていれば動く
47.
デメリット • リポジトリが1個にまとまってしまう • サーバのビルドにクライアントコードのcheckoutも必要になる •
クライアントの容量が⼤きくなってくるとCI/CDがツライことになる • 開発フローの整理が難しくなる • クライアント開発とサーバ開発が同じリポジトリで管理される • GitHubのissue/pr 欄が混ざる
48.
折半案 サーバ側 サーバプロジェクトのポジトリ Git Repository Git Repository ゲーム本体のリポジトリ
49.
折半案 サーバ側 ここのUnityプロジェクトは、 Headlessなクライアント + Debug
Scene が置かれる Git Repository Git Repository
50.
折半案 サーバ側 ゲーム本体のプロジェクトは 別のリポジトリとして運⽤する
51.
折半案 サーバ側 接続部分をunitypackageにまとめて 本体側でインポートする unitypackage
52.
補⾜:UnityPackageはどう管理する? • Unity Package
Managerで管理できる • Unity標準のパッケージマネージャ機能 • まだ発展途上 • ⾃前でレジストリを⽴てればオレオレライブラリも管理可能 • 余⼒があるならコレで管理すると良さそう
53.
環境構築 • MagicOnionは環境構築がちょっとたいへん • クライアント側(Unity)は⼿動でライブラリ追加が必要 •
コード共有 • コードジェネレート
54.
コードジェネレートの話 • MagicOnionの動作にはコードジェネレートが2回必要 • MagicOnionのインタフェース定義 •
MessagePackのオブジェクト定義 • ただし、ジェネレートが必要なのはUnity側のみ(サーバ側は不要) • ジェネレートしたコードはUnityプロジェクトに配置する
55.
ジェネレータの⽤意 • それぞれGitHubからダウンロードできる MagicOnion MessagePack
56.
ジェネレータの使い⽅ • 対象のcsprojをコマンドラインで指定して実⾏ • MagicOnnion/MessagePack共に同じコマンド引数で動く
57.
指定するcsproj • 共有するインタフェースとオブジェクトが含まれたもの • 共有するファイルだけまとめたcsprojを⽤意しておくと楽
58.
指定するcsprojの例 Assets/ Assets/Shared/ サーバプロジェクト(ソリューション構成) Server.Interfaces.csproj Server.Core.csproj これ!
59.
注意点 • ジェネレート対象のcsprojがMagicOnionとMessagePack に依存するようにしておくこと • 依存させておかないとコードジェネレートが動かない Server.Interfaces.csproj
60.
コマンド例 ./moc/win-x64/moc.exe ‒i ./Server/ServerSample.Interfaces/ServerSample.Interfaces.csproj ‒o ./Unity/Assets/Scripts/Generated/MagicOnion.Generated.cs •
MagicOnionのジェネレート例 • ServerSample.Interfaces.csprojをもとに、Unity/Assets/以下に⽣成
61.
MessagePackのResolver設定だけ忘れずに • Unityプロジェクトに次のようなコードを配置 • RuntimeInitializeOnLoadMethodで起動時に実⾏されるようにしておく
62.
Editor拡張でジェネレートできると楽 • MagicOnionのサンプルコードに実装例がある • https://github.com/Cysharp/MagicOnion/blob/master /samples/ChatApp/ChatApp.Unity/Assets/Editor/MenuItems .cs
63.
環境構築 まとめ • 環境構築がちょっと⼤変 •
csprojを編集する必要がある • コードジェネレートの整備が⼿間 • 開発フローはよく考えよう • Unity側とサーバ側、2つのプロジェクト管理を同時にやる必要 • gitリポジトリをどうわけるか、どういうフローで開発をすすめるのか • CI/CDとの相性
64.
今回の話 • MagicOnionについて解説 • 何のためのフレームワークか •
どんな機能があるのか • 環境構築 • 実装例の紹介 • 実装時の注意点 • デプロイ
65.
実装例の紹介
66.
実装例 • それぞれの実装例を紹介 • Service •
StreamingHub
67.
Serviceの実装例 • サーバサイドで⾜し算する • シンプルに、引数に与えた数値を⾜して返す
68.
Serviceの実装例 • 実装⼿順 1. 共有するインタフェース/オブジェクトを定義 2.
サーバに実装を書く 3. サーバにコネクションする 4. Unity側で呼び出す
69.
Serviceの実装例 • 実装⼿順 1. 共有するインタフェース/オブジェクトを定義 2.
サーバに実装を書く 3. サーバにコネクションする 4. Unity側で呼び出す
70.
指定するcsprojの例 Assets/ Assets/Shared/ サーバプロジェクト(ソリューション構成) Server.Interfaces.csproj Server.Core.csproj ここに定義する (どっちに定義しても実体は1個なので同じ)
71.
Service:サーバサイドで計算する 1.サーバ/クライアントで共有するインタフェースを⽤意 IService<T>を継承したインタフェースを定義する インタフェース内に定義したメソッドがAPIエンドポイントになる
72.
Serviceの実装例 • 実装⼿順 1. 共有するインタフェース/オブジェクトを定義 2.
サーバに実装を書く 3. サーバにコネクションする 4. Unity側で呼び出す
73.
指定するcsprojの例 Assets/ Assets/Shared/ サーバプロジェクト(ソリューション構成) Server.Interfaces.csproj Server.Core.csproj ここに定義する
74.
例:サーバサイドで計算する 2.サーバ側で実装を⾏う インタフェースを実装 今回は引数を⾜して返すだけ
75.
Serviceの実装例 • 実装⼿順 1. 共有するインタフェース/オブジェクトを定義 2.
サーバに実装を書く 3. サーバにコネクションする 4. Unity側で呼び出す
76.
例:サーバサイドで計算する 3. サーバにコネクションする gRPCのチャンネルを作って
77.
例:サーバサイドで計算する 4. Unity側で呼び出す ICalculateServiceへのクライアントを作り
78.
例:サーバサイドで計算する 4. Unity側で呼び出す あとは普通にメソッドコールするだけ 通信の結果はasync/awaitで待つだけでOK
79.
例:サーバサイドで計算する サーバ メソッド実⾏すると裏でサーバコードが呼び出されて その結果が返ってくるのをawaitで待てる
80.
Serviceの実装は簡単 • リクエストに対して、処理を書いて、結果を返すだけ • かんたん •
クライアント側は普通にasync/awaitでメソッドを呼ぶだけ • サーバ側はインタフェースを実装するだけ
81.
StreamingHubの実装例
82.
StreamingHubはムズカシイ • StreamingHubはリアルタイム通信を実現する機構 • クライアントとサーバが相互にメソッドを呼び出し合える •
Serviceの実装と⽐べて複雑になりやすい • 「状態」がクライアントとサーバの両⽅で管理することになる • どのタイミングで何の処理が実⾏されるか、を整理しないとヤバイことになる
83.
StreamingHubの実装例 • サーバサイドでPlayerとその座標を管理する • Playerは移動量をサーバに送って、移動先を更新する •
Playerが移動したら全員に通知する • ⼊室時に既存のPlayer⼀覧を返す • Playerが⼊室/退室したら通知する • 単⼀のプロセスでのみ動く(プロセス間での協調は考えない)
84.
動作例 クライアントA サーバ クライアントがサーバにコネクションしている クライアントB
85.
動作例 クライアントA サーバ サーバ側で座標⼀覧を管理 クライアントB A: (1,
0 ,0 ) B: (0, 0, 2 )
86.
動作例 クライアントA サーバ MoveAsync()をクライアントがコールすると サーバ上の状態が書き換わり クライアントB A: (1
+1, 0 +0 ,0 +0 ) B: (0, 0, 2 ) MoveAsync( +1, +0, +0)
87.
動作例 クライアントA サーバ 新しい座標を全員に通知する クライアントB A: (1,
0 ,0 ) B: (0, 0, 2 ) OnPlayerMoved( id: A, position: (1,0,0) ) OnPlayerMoved( id: A, position: (1,0,0) )
88.
動作例 クライアントA サーバ 新しいクライアントが接続してきたら サーバ側で新しいPlayerIdを発⾏して返す クライアントB A: (1,
0 ,0 ) B: (0, 0, 2 ) C: (0, 0, 0) クライアントC Task<int> JoinAsync() => id: 12345
89.
動作例 クライアントA サーバ 既存のクライアントにPlayer⼊室イベントを送信する クライアントB A: (1,
0 ,0 ) B: (0, 0, 2 ) C: (0, 0, 0) クライアントC OnPlayerJoined( id: 12345, position: (0,0,0) ) OnPlayerJoined( id: 12345, position: (0,0,0) )
90.
動作例 クライアントA サーバ クライアントCが既存のPlayerの状態⼀覧を サーバから取得して状態を再現する クライアントB A: (1,
0 ,0 ) B: (0, 0, 2 ) C: (0, 0, 0) クライアントC Task<PlayerStatus[]> FetchCurrentAsync() A: (1, 0 ,0 ) B: (0, 0, 2 ) C: (0, 0, 0)
91.
動作例
92.
実装順序 • 実装順序 1. インタフェース定義 2.
通信のオブジェクト定義 3. サーバ側実装 4. クライアント側実装
93.
例:座標管理 1. インタフェース定義 • 定義するインタフェースは2つある •
サーバ → クライアント(Receiver) • クライアント → サーバ(Hub)
94.
1.インタフェース定義(Receiver) • サーバ→クライアント(Receiver) • クライアントで実装するメソッド •
サーバから呼び出される
95.
1.インタフェース定義(Hub) • クライアント→サーバ(Hub) • サーバで実装するメソッド •
クライアントが呼び出す
96.
2.通信のオブジェクト定義 • 通信に利⽤するデータ構造を定義する • MessagePackObjectとして定義する •
(定義したあとはMessagePackのコードジェネレートが必要)
97.
2.通信⽤オブジェクトの定義 • 「プレイヤの状態」を扱うデータ構造
98.
2.通信⽤オブジェクトの定義 • 「プレイヤの状態」を扱うデータ構造 サーバサイドは「MessagePack.UnityShims」を導⼊すると Unityのデータ構造がそのまま使えて便利
99.
3.サーバ側の実装 • StreamingHubの特性を覚えよう • 1コネクションごとに新しいインスタンスが⽣成して割り当てられる •
コネクションが維持されている限り同じインスタンスが使われる (インメモリで状態が保持され続ける)
100.
StreamingHubの図 サーバプロセス StreamingHub StreamingHub StreamingHub クライアント Application Application Service 1コネクションごとにStreamingHubの インスタンスが⽣成されて、それが維持される Domain