More Related Content
PDF
MagicOnion~C#でゲームサーバを開発しよう~ PDF
「黒騎士と白の魔王」gRPCによるHTTP/2 - API, Streamingの実践 PDF
The Usage and Patterns of MagicOnion PDF
PDF
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~ PDF
CEDEC 2018 最速のC#の書き方 - C#大統一理論へ向けて性能的課題を払拭する PDF
PDF
【Unite 2018 Tokyo】『CARAVAN STORIES』のアセットバンドル事例 What's hot
PDF
[CEDEC 2021] 運用中タイトルでも怖くない! 『メルクストーリア』におけるハイパフォーマンス・ローコストなリアルタイム通信技術の導入事例 PDF
PDF
"Kong Summit, Japan 2022" パートナーセッション:Kong on AWS で実現するスケーラブルな API 基盤の構築 PDF
PDF
PDF
【Unite Tokyo 2019】Understanding C# Struct All Things PDF
ピクサー USD 入門 新たなコンテンツパイプラインを構築する PPTX
リアルタイムなゲームの開発でコンテナを使ってみたら簡単便利で激安だったのでオススメしたい PDF
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜 PDF
ネットワーク ゲームにおけるTCPとUDPの使い分け PDF
Building the Game Server both API and Realtime via c# PPTX
Unityネイティブプラグインマニアクス #denatechcon PDF
PDF
PDF
Unityでパフォーマンスの良いUIを作る為のTips PDF
怖くないSpring Bootのオートコンフィグレーション PPTX
PDF
Epic Online Services でできること PDF
Prometeusについてはじめてみよう / Let's start Prometeus PDF
Getting Started GraalVM / GraalVM超入門 #jjug_ccc #ccc_c2 Similar to Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
PDF
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現 PPTX
Using or not using magic onion PDF
NextGen Server/Client Architecture - gRPC + Unity + C# PDF
A quick tour of the Cysharp OSS PDF
ゲーム開発初心者の僕がUnity + WebSocketで何か作ってみた PDF
Metaprogramming Universe in C# - 実例に見るILからRoslynまでの活用例 PDF
PPTX
PPTX
PDF
【Unity道場京都スペシャル4】Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現 PDF
True Cloud Native Batch Workflow for .NET with MicroBatchFramework PPTX
PPTX
.NET ラボ 勉強会 C# でラインプラットフォーム開発 PDF
Photon Server Deep Dive - PhotonWireの実装から見つめるPhotonServerの基礎と応用 PDF
Implements OpenTelemetry Collector in DotNet PDF
PDF
20140830 2014年版 C #でできること PDF
Cloud から IoT まで、なんでもおまかせ ~ .NET 5 正式リリース! PDF
Linux & Mac OS でも動く! ~ オープンソース & クロスプラットフォーム .NET の歩き方 ~ PPTX
More from Yoshifumi Kawai
PDF
ZeroFormatterに見るC#で最速のシリアライザを作成する100億の方法 PDF
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能 PDF
Observable Everywhere - Rxの原則とUniRxにみるデータソースの見つけ方 PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法 PDF
A Brief History of UniRx/UniTask, IUniTaskSource in Depth PDF
Deep Dive async/await in Unity with UniTask(UniRx.Async) PDF
Memory Management of C# with Unity Native Collections PDF
Deep Dive async/await in Unity with UniTask(EN) PDF
History & Practices for UniRx(EN) PDF
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC PDF
How to make the Fastest C# Serializer, In the case of ZeroFormatter PDF
PDF
Introduction to NotifyPropertyChangedGenerator PDF
Photon Server Deep Dive - View from Implmentation of PhotonWire, Multiplayer ... PPTX
RuntimeUnitTestToolkit for Unity(English) PDF
LINQPad with LINQ to BigQuery - Desktop Client for BigQuery PDF
What, Why, How Create OSS Libraries - 過去に制作した30のライブラリから見るC#コーディングテクニックと個人OSSの... PPTX
RuntimeUnitTestToolkit for Unity PPTX
Clash of Oni Online - VR Multiplay Sword Action Unity C#と.NET Core(MagicOnion) C# そしてKotlinによるハーモニー
- 1.
- 2.
講演者プロフィール
• 河合 宜文/ Kawai Yoshifumi / @neuecc
• Cysharp, Inc. – CEO/CTO
• 株式会社Cygamesの子会社としてC#関連の研究開発やコンサ
ルティングを行う
• メインミッションはC#大統一理論(サーバー/クライアント共にC#で
実装する)の推進
• 株式会社アプリボットの新規タイトル(タイトル未発表)におけ
るMagicOnionの導入と周辺の基盤開発を担当
- 5.
- 6.
MagicOnion
• Unified Realtime/APIEngine for .NET Core and Unity
• https://github.com/Cysharp/MagicOnion/
• Cysharp開発のC#によるOSSのネットワークエンジン
• リアルタイム系もAPI系も両方OK
• HTTP/2 gRPCの上に構築され、高性能とスタンダードを両立
• .NET CoreによるLinuxホスティングと完全なコンテナ対応
• 現在GitHub Starが1000以上と、国内外でも注目度上昇中
• パフォーマンスとC#としての使い勝手にこだわって開発
• C#のエキスパートが最初からUnity C#も前提に組み立てているた
め、C#のためのエンジンとして高い品質を誇る
- 7.
public class TestService: ITestService
{
// パブリックメソッドがそのままgRPC定義
public async UnaryResult<int> Sum(int x, int y)
{
// async/awaitにも自然に対応
// マジカル技術によりasync Task<T>じゃなくてもawait可能
await Task.Yield();
return x + y;
}
}
// 普通のgRPCの接続を作る(MagicOnion用の特別なことはない)
var channel = new Channel("127.0.0.1:12345");
// 自然な書き味で、タイプセーフにRPC通信を実現
// C#のasync/await構文により、非同期通信も自然に見える
var client = MagicOnionClient.Create<ITestService>(channel);
var result = await client.Sum(100, 200);
クライアントもサーバーも自
然に繋がっているように見え
る(デバッガもサーバー/クラ
イアント共有でステップ実行
で繋がって動いていく)
- 9.
Why not (plain)gRPC
• protoはC#ではない!!!
• 故に言語の持つ
• 全ての型(Primitive, Nullable, Dictionaryなど)が使えない
• 属性(Attribute, Annotation)付与ができない
• リクエスト毎に必ず一つの型が必要になる
• 故にIDE(Visual Studio, Rider, etc...)の持つ
• シンタックスハイライトが効かない
• コードレンズなどのコード追跡機能が効かない
• リファクタリング支援(名前一括変更など)が効かない
• サーバー/クライアント大統一ならクライアント/サーバー超えて変更
される!
- 10.
C#がIDLなら
C# as aSchema
クライアント/サーバーの実装言語を
共にC#に固定することで、
通信スキーマそのものをC#で表現する
プロジェクト参照で済むので
IDLのバージョン管理が不要というのも運用上メリット
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
案D. C# toKotlinでコード共有(採用)
• C#を正としてUnity側中心にロジックを書いてしまい、Kotlin
側はC#からのコードジェネレートで生成する
• MicroBatchFramework
• https://github.com/Cysharp/MicroBatchFramework
• C#(.NET Core)でCLIツール作るのに便利なフレームワーク
• Roslyn(Microsoft.CodeAnalysis.CSharp)
• C#によるC#コンパイラ
• C#のAbstract Syntax Treeが取れる
- 22.
class Program :BatchBase
{
static async Task Main(string[] args)
{
await BatchHost.CreateDefaultBuilder().RunBatchEngineAsync<Program>(args);
}
public void Generate(
[Option("i", "入力するフォルダ")]string inputDirectory,
[Option("o", "出力するフォルダ")]string outputDirectory)
{
foreach (var inputFilePath in Directory.GetFiles(inputDirectory,
"*.cs", SearchOption.AllDirectories))
{
var tree = CSharpSyntaxTree.ParseText(File.ReadAllText(inputFilePath));
var parseInfo = Parse(tree);
foreach (var item in parseInfo)
{
var template = new KotlinTemplate
{
ClassInfo = item
};
var code = template.TransformText();
var outPath = Path.Combine(outputDirectory, item.ClassName) + ".kt";
File.WriteAllText(outPath, code, Encoding.UTF8); }
CSharpSyntaxTree.ParseTextで.cs
ファイルからSyntaxTreeを取得
テンプレートエンジン(T4)を使って
Kotlinコードを生成
MicroBatchFrameworkによる
CLI定義と実装
ASTを元にテンプレートに当ては
める情報を生成(自前実装)
- 23.
- 24.
- 25.
- 26.
vs Unity .csproj
•UnityはUnityの管理下のソースコードのみ参照可能
• サーバーのcsprojは柔軟に記述できる
• よって共有するコードの実体をUnityのほうに置いて、サー
バー側ではコードリンクで参照する
<ItemGroup>
<Compile Include="..¥Unity¥Assets¥Scripts¥Shared¥**¥*.cs" />
</ItemGroup>
シンボリックリンクとか、ビルドしてマ
ネージドDLLを配置とかやるとトラブルの
元なので、シンプルな手段が一番
シェアするディレクトリはasmdef
で切っておくとより良い
- 27.
Unity Shimsの実装
• Unity依存コードの除去
•理想的には完全除去が望ましいが、特に開発中でUnity側主導でコード
ができあがっている場合、残ってしまっていることが多い
• ダミーの型を用意して回避するのが手っ取り早くは楽
namespace UnityEngine
{
public class ScriptableObject {}
public class MonoBehaviour {}
public sealed class SerializeFieldAttribute : Attribute
{
}
// etc...
}
意外と問題なく動いたり動かなかったり。
とりあえずコンパイル通す→動かして問題出た
とこを何とかする、で工数的にそんな多くかか
らず何とかなる、ことも少なくないかな、と。
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
MagicOnion is...
• HighPerformance
• gRPC(HTTP/2) + MessagePack-CSharp
• Modern Architecture
• .NET Core, Container, OpenTelemetry
• C# Friendly
• C# as a Schema
• Unity Friendly
• Runtime/CodeGen(for IL2CPP)
- 37.