SlideShare a Scribd company logo
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
河合 宜文 / Kawai Yoshifumi / @neuecc
Cysharp, Inc.
Cygames
C#大統一理論
C#
MagicOnion
MasterMemory
UniTask
https://github.com/Cysharp
SlnMerge
RuntimeUnitTestToolkit
RandomFixtureKit
ConsoleAppFramework
ValueTaskSupplement
https://github.com/Cysharp
LitJWT
Ulid
Difference
UniRx
MessagePack-CSharp
ZeroFormatter
Utf8Json
https://github.com/neuecc
LINQ to GameObject
SerializableDictionary
CloudStructures
Open on GitHub
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unified Realtime/API Engine
https://github.com/Cysharp/MagicOnion
特徴
全てのロジックをC#サーバー上で実行
AI・演算・結果処理など全てサーバー側で処理
Realtime Network
Microser
vices
Realtime
Server
Unity
Native App
Browser
API
Server
P2P
Microser
vices
Realtime
Server
Unity
Native App
Browser
API
Server
P2P
P2P
Dedicated Server
P2P
Dedicated Server
Microser
vices
Realtime
Server
Unity
Native App
Browser
API
Server
⚫ Unity Connected Games
⚫ Photon Engine
⚫ Monobit Engine
⚫ DIY - WebSocket + Server App
⚫ DIY - WebSocket + mBaaS
⚫ DIY - TCP(UDP) + Server App
⚫ DIY - TCP(UDP) + Unity Headless
Unity Connected Games
Photon Engine
Monobit Engine
WebSocket + ServerApp
WebSocket(TCP/UDP) + mBaaS(mobile backend as a Service)
TCP(UDP) + ServerApp
TCP(UDP) + Unity HeadlessApp
TCP(UDP) + ServerApp
TCP(UDP) + Unity HeadlessApp
About MagicOnion
C#の型が通信定義となる単方向/双方向RPC
// 自然な書き味で、タイプセーフにRPC(Remote Procedure Call)を実現
// C#のasync/await構文により、非同期通信も自然に見える
var client = MagicOnionClient.Create<ITestService>(channel);
var result = await client.Sum(100, 200);
public class TestService : ITestService
{
public async UnaryResult<int> Sum(int x, int y)
{
return x + y;
}
}
C#の型が通信定義となる単方向/双方向RPC
// 自然な書き味で、タイプセーフにRPC(Remote Procedure Call)を実現
// C#のasync/await構文により、非同期通信も自然に見える
var client = MagicOnionClient.Create<ITestService>(channel);
var result = await client.Sum(100, 200);
public class TestService : ITestService
{
public async UnaryResult<int> Sum(int x, int y)
{
return x + y;
}
}
クライアントもサーバーも自
然に繋がっているように見え
る(デバッガもサーバー/クラ
イアント共有でステップ実行
で繋がって動いていく)
リアルタイム通信のための双方向の型付きRPC
public interface IGamingHub : IStreamingHub<IGamingHub, IGamingHub
{
Task<Player[]> JoinAsync(string roomName, string userName, Vec
Task LeaveAsync();
Task MoveAsync(Vector3 position, Quaternion rotation);
}
public interface IGamingHubReceiver
{
void OnJoin(Player player);
void OnLeave(Player player);
void OnMove(Player player);
}
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Call, typeof(AsyncDuplexStreamingCall<byte[], byte[]>).GetProperty("RequestStream").GetMethod);
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldfld, serializerOptionsField);
il.Emit(OpCodes.Newobj, (typeof(MarshallingClientStreamWriter<>).MakeGenericType(def.RequestType).GetConstructors().Singl
il.Emit(OpCodes.Ldloc_0);
il.Emit(OpCodes.Call, typeof(AsyncDuplexStreamingCall<byte[], byte[]>).GetProperty("ResponseStream").GetMethod);
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldfld, serializerOptionsField);
il.Emit(OpCodes.Newobj, (typeof(MarshallingAsyncStreamReader<>).MakeGenericType(def.ResponseType).GetConstructors().Singl
il.Emit(OpCodes.Ldarg_0);
il.Emit(OpCodes.Ldfld, serializerOptionsField);
resultType2 = typeof(DuplexStreamingResult<,>).MakeGenericType(def.RequestType, def.ResponseType);
il.Emit(OpCodes.Newobj, resultType2.GetConstructors()[0]);
MethodType t;
string requestType;
string responseType;
ITypeSymbol unwrappedOriginalResponseType;
ExtractRequestResponseType(y, out t, out requestType, ou
var id = FNV1A32.GetHashCode(y.Name);
return new MethodDefinition
{
Name = y.Name,
MethodType = t,
RequestType = requestType,
ResponseType = responseType,
UnwrappedOriginalResposneTypeSymbol = unwrappedOrigi
OriginalResponseTypeSymbol = y.ReturnType,
IsIfDebug = y.GetAttributes().FindAttributeShortName
HubId = id,
Parameters = y.Parameters.Select(p =>
{
C#で自然にサーバーとクライアントを繋げる
機能として提供するものはシンプルなRPCのみ
あとはアプリケーションの作り込みで何でも作れる
Unityにも依存しないことであらゆる使い方ができる(サーバーtoサーバーなど)
一つのシンプルなやり方で応用が効く(土管にもなるし土管以外もOK)
サーバープログラムを透明にしない
どちらにも平等に配置できることを意識したフレームワーク
サーバーもクライアントもどちらも大事
適切な場所に適切なコードを書くことで、サーバー/クライアント全体を通し
たアーキテクチャの最適化を支援する
エコシステムには全部乗る
未来で償却する
エコシステムには全部乗る
未来で償却する
All in Oneではない
RPCしかない
API Services
Microser
vices
Realtime
Server
Unity
Native App
Browser
API
Server
Microser
vices
Realtime
Server
Unity
Native App
Browser
API
Server
PROS
CONS
中間言語からコード生成する
IDL(JSON/XML/proto/etc...)
サーバーコード
(PHP/Ruby/Go/C#/etc...)
クライアントコード
(C#/Swift/JavaScript/etc...)
PROS
CONS
protoはC#/* 任意の言語 */ではない
C# as a Schema
C#に固定することで
通信定義そのものをC#で表現する
言語の違うREST
Response型を別々
に書く
APIクライアント
を手書きする
(ザ・マイクロ
サービスみたいな
構成)
中間IDLを書く
そこからクライア
ント・レスポンス
型自動生成
(←を嫌う時によ
くある構成、一番
メジャー)
サービスを普通に
書く、そこからク
ライアントを自動
生成、リクエス
ト・レスポンス型
はC#のDLLとして
共有
サービスを普通に
書く、クライアン
トはそのプロジェ
クト参照から実行
時動的生成
認証、課金、クエスト、ミッション、etc...
https://logmi.jp/tech/articles/322333
適切なコードを適切なところに書く
作り込みを現実のものにする
適切なコードを適切なところに書く
作り込みを現実のものにする
MagicOnion is
Unified Realtime/API Engine
Microser
vices
Realtime
Server
Unity
Native App
Browser
API
Server
サーバーとクライアントの距離が限りなく近い
ConsoleAppFramework
https://github.com/Cysharp/ConsoleAppFramework
引数の自動割当
複数コマンドのルーティング
コンフィグ処理
ロギング処理
ライフサイクル管理(Daemon)
などCLIの面倒ごとに対応
class Program : ConsoleAppBas
{
static async Task Main(string[] args)
{
await Host.CreateDefaultBuilder()
.RunConsoleAppFrameworkAsync<Program>(args);
}
public void Run(string name, int repeat = 3)
{
for (int i = 0; i < repeat; i++)
{
Console.WriteLine($"Hello from {name}");
}
}
}
Realtime
Unity
API
Service
Realtime
Unity
API
Service
Conclusion
時代の変わり目を超える
リアルタイム通信がほぼ必須だったり、5Gが迫っていたり
旧来のフレームワークから変わっていくタイミング
一歩先の理想形へ
クライアントとサーバーを、APIとリアルタイムを
全てをC#で統合するという夢想を具現化するのがMagicOnion
ただの旧来のXXの置き換えなどではなく、
誰も見たことのない究極的な理想の形に近づけていく
銀の弾丸はないので、相応の困難は発生するかもしれないけれど
ぜひ一緒に乗り越えていきましょう!→お、コンタクトフォームが https://cysharp.co.jp/contact/
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現

More Related Content

PDF
Multipeer connectivityを使った 動画のリアルタイム端末間共有
PDF
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
PDF
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
PDF
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
PDF
A quick tour of the Cysharp OSS
PDF
The Usage and Patterns of MagicOnion
PDF
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
PDF
MagicOnion~C#でゲームサーバを開発しよう~
Multipeer connectivityを使った 動画のリアルタイム端末間共有
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
A quick tour of the Cysharp OSS
The Usage and Patterns of MagicOnion
True Cloud Native Batch Workflow for .NET with MicroBatchFramework
MagicOnion~C#でゲームサーバを開発しよう~

What's hot (20)

PDF
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
PDF
NextGen Server/Client Architecture - gRPC + Unity + C#
PDF
Implements OpenTelemetry Collector in DotNet
PDF
The History of Reactive Extensions
PDF
Building the Game Server both API and Realtime via c#
PDF
LINQPad with LINQ to BigQuery - Desktop Client for BigQuery
PDF
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
PDF
UniRx - Reactive Extensions for Unity
PDF
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
PDF
How to Make Own Framework built on OWIN
PDF
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
PPTX
Using or not using magic onion
PDF
A Framework for LightUp Applications of Grani
PPTX
C#で速度を極めるいろは
PDF
IL2CPPに関する軽い話
PDF
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
PDF
jazug34 Container Apps Key Vault
PDF
C#の強み、或いは何故PHPから乗り換えるのか
PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
PDF
The History of LINQ
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践
NextGen Server/Client Architecture - gRPC + Unity + C#
Implements OpenTelemetry Collector in DotNet
The History of Reactive Extensions
Building the Game Server both API and Realtime via c#
LINQPad with LINQ to BigQuery - Desktop Client for BigQuery
AWS + Windows(C#)で構築する.NET最先端技術によるハイパフォーマンスウェブアプリケーション開発実践
UniRx - Reactive Extensions for Unity
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用
How to Make Own Framework built on OWIN
.NET最先端技術によるハイパフォーマンスウェブアプリケーション
Using or not using magic onion
A Framework for LightUp Applications of Grani
C#で速度を極めるいろは
IL2CPPに関する軽い話
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法
jazug34 Container Apps Key Vault
C#の強み、或いは何故PHPから乗り換えるのか
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例
The History of LINQ
Ad

Similar to 【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現 (20)

PDF
UnityのフリーライセンスでPC-Android通信を実装するまで
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things
PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
PDF
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
PDF
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
PDF
F#+Erlangで簡単なシューティングゲームを作ってみている
PDF
とあるCocos2dx入門編
PPTX
広がる .Net
PDF
ラボユース最終成果報告会(Web公開版)
PPTX
【CEDEC2018】800万ダウンロードを達成した共闘ことばRPG 『コトダマン』でのモノビットエンジン採用実例と最新情報 ①
PDF
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD
PDF
Unitynetwork
PDF
Photon勉強会(クライアントサイド)2015/8/4 発表資料
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
PPTX
C#の書き方
PPTX
C#の書き方
PDF
Node.js入門
PPTX
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
PDF
iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine
PDF
【CEDEC2017】新しくなったモノビットエンジンを使って10万人規模のサーバを構築するノウハウを公開!
UnityのフリーライセンスでPC-Android通信を実装するまで
【Unite Tokyo 2019】Understanding C# Struct All Things
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた
F#+Erlangで簡単なシューティングゲームを作ってみている
とあるCocos2dx入門編
広がる .Net
ラボユース最終成果報告会(Web公開版)
【CEDEC2018】800万ダウンロードを達成した共闘ことばRPG 『コトダマン』でのモノビットエンジン採用実例と最新情報 ①
Azure DevOps で実現する Unity アプリのハイパフォーマンス CI/CD
Unitynetwork
Photon勉強会(クライアントサイド)2015/8/4 発表資料
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
C#の書き方
C#の書き方
Node.js入門
GMOアプリクラウドではじめる Photon Server v4 (2016/4/20 発表資料)
iPhoneでリアルタイムマルチプレイを実現!Photon Network Engine
【CEDEC2017】新しくなったモノビットエンジンを使って10万人規模のサーバを構築するノウハウを公開!
Ad

More from UnityTechnologiesJapan002 (20)

PDF
5分でわかる Sensor SDK
PDF
10分でわかる Unityコンピュータービジョン
PDF
5分でわかる Unity Forma
PDF
ROSのロボットモデルでバーチャルロボット受肉する
PDF
Unityでロボットの教師データは作れる!
PDF
ARとUnity-Robotics-Hubの連携
PDF
産業用ロボット開発におけるUnityの活用
PDF
建設シミュレータOCSの開発 / OCS・VTC on Unity におけるROS対応機能について
PDF
UnityとROSの連携について
PDF
中国深センから盛り上がる、ソフトウェアフレンドリーなロボティクス
PDF
Unityでお手軽ロボット開発「toio SDK for Unity」最新事例
PDF
集まれ!Dreamingエンジニア! 〜箱庭で紡ぎ出されるIoT/クラウドロボティクス開発の新しいカタチ〜
PDF
5分でわかる Unity点群
PDF
5分でわかる Unity Reflect
PDF
BIMからはじまる異世界転生 ~Unity Reflect が叶える新しい建築の世界~
PDF
【Unity道場 自動車編】Unityで実現する産業向けxRソリューション
PDF
【Unity道場 自動車編】トヨタのxR活用で進める現場DXへの挑戦 ~UnityとHoloLens 2を用いて~
PPTX
【Unity道場 自動車編】空間再現ディスプレイの概要と活用事例
PDF
【Unity道場 自動車編】 リアルタイム3D技術が支えるデジタルツイン
PPTX
【Unity道場 自動車編】モビリティへの活用に向けて
5分でわかる Sensor SDK
10分でわかる Unityコンピュータービジョン
5分でわかる Unity Forma
ROSのロボットモデルでバーチャルロボット受肉する
Unityでロボットの教師データは作れる!
ARとUnity-Robotics-Hubの連携
産業用ロボット開発におけるUnityの活用
建設シミュレータOCSの開発 / OCS・VTC on Unity におけるROS対応機能について
UnityとROSの連携について
中国深センから盛り上がる、ソフトウェアフレンドリーなロボティクス
Unityでお手軽ロボット開発「toio SDK for Unity」最新事例
集まれ!Dreamingエンジニア! 〜箱庭で紡ぎ出されるIoT/クラウドロボティクス開発の新しいカタチ〜
5分でわかる Unity点群
5分でわかる Unity Reflect
BIMからはじまる異世界転生 ~Unity Reflect が叶える新しい建築の世界~
【Unity道場 自動車編】Unityで実現する産業向けxRソリューション
【Unity道場 自動車編】トヨタのxR活用で進める現場DXへの挑戦 ~UnityとHoloLens 2を用いて~
【Unity道場 自動車編】空間再現ディスプレイの概要と活用事例
【Unity道場 自動車編】 リアルタイム3D技術が支えるデジタルツイン
【Unity道場 自動車編】モビリティへの活用に向けて

【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現