1.9K Views
May 08, 17
スライド概要
講演者:河合 宜文(株式会社グラニ)
こんな人におすすめ
・C#大統一理論について興味のある方
・UniRxを使ったことがある/使ってみたい方
受講者が得られる知見
・C#で統一したプロジェクトの作り方
・UniRxの活用法、メリットとデメリット
講演動画:https://youtu.be/Lvbs22iZFPk
リアルタイム3Dコンテンツを制作・運用するための世界的にリードするプラットフォームである「Unity」の日本国内における販売、サポート、コミュニティ活動、研究開発、教育支援を行っています。ゲーム開発者からアーティスト、建築家、自動車デザイナー、映画製作者など、さまざまなクリエイターがUnityを使い想像力を発揮しています。
C# UniRx /
Yoshifumi Kawai CTO Grani, Inc.
About speaker • • • • • • • • •
About this session • •
About this session • •
• • • • • • •
• • • • • • • • •
• • • • • • • •
• • • • • • •
• • • • • • • •
• 4 • 4 • • AI • NPC vs 4 C#
• UniRx • LINQ to GameObject • MessagePack for C# • MagicOnion • MasterMemory • ReMotion • by Yoshifumi Kawai • etc...
using
Why C#? Why Unity? • • • • • • • • •
C# • • • • • • • • •
How to • • • •
) • • •
• IDL(Interface Definiton Language) • IDL = JSON proto • • IDL • C# • IDL IDL / ……
IDL • Visual Studio • • Unity • Git • • C# • C# • • ……
Visual Studio
C# C# • C# C# • C# 6.0(Visual Studio 2015) • • [MessagePackObject] => ***MessagePackFormatter • /
• • • / • • • • •
• • • / • • • • •
• / • • / • • • •
• / • • / • • • •
C# • C# • • • / • / • • • IDL
• • C# • • • • • • • ……
3
gRPC • Web API + Streaming • Google HTTP/2 • HTTP/2 HTTP/1 • gRPC • Web API • (Unity ) • (Unity Web API google RPC )
gRPC • Web API + Streaming • Google HTTP/2 • HTTP/2 HTTP/1 • gRPC • Web API • (Unity ) • (Unity Web API google RPC )
Unity gRPC • C# gRPC Unity • .NET 4.5 • • gRPC Client Unity • .NET 3.5 + IL2CPP • (C Core) iOS/Android • / • gRPC IDL Protocol Buffers / Unity • HTTP/2 gRPC
Unity gRPC • C# gRPC Unity • .NET 4.5 • • gRPC Client Unity • .NET 3.5 + IL2CPP • (C Core) iOS/Android • / • gRPC IDL Protocol Buffers / Unity • HTTP/2 gRPC
• • • • • • • • • ……
• • • • • • • • • ……
UNET • Unity • • • • • • UNET • C# • • C# Web API ,
Web API • • • • • • • • •
Web API • • • • • • • • •
• Web API
Streaming Service(gRPC Battle Engine)
F for AI • AI • F# • Excel • (DSL) .NET Framework F# C# gRPC BattleEngine AI F#
Streaming Server • • • • • • • • • •
We’re using UniRx • • • • • • •
We’re using UniRx • • • • • • •
UniRx • • • • • • • •
• • • • • • • : 3845 : 1186
• • • • • • • • • •
Rx • • • • •
Rx
3
// これで例外を共通ハンドリング
IObservable<TResponse> HnadleCommonError<TRequest, TResponse>(IObservable<TResponse> source
{
return source
.Catch((Exception ex) =>
{
// Exception使って共通エラーポップアップを出したりするとする
NavigationService.ShowMessagePopUpAsync("error", "errorMessage").Subscribe();
// 呼び元に真の意味で何も返さない
return Observable.Never<TResponse>();
});
}
Pitfall of Empty
•
•
IObservable<Unit> Test()
{
return Observable.FromCoroutine(() => TestCore());
}
IEnumerator TestCore()
{
yield return Observable.Empty<int>().ToYieldInstruction();
Debug.Log(“この行には到達する");
}
Pitfall of Empty
•
•
IObservable<Unit> Test()
{
return Observable.FromCoroutine(() => TestCore());
}
IEnumerator TestCore()
{
yield return Observable.Empty<int>().ToYieldInstruction();
Debug.Log("come here");
}
UI Framework Rx • • • • • • • •
Chaotic Rx • • • • • Ivory.Unity.Core.Scene.<OnAfterNavigate>c__AnonStorey76A:<>m__2DC7(Unit) UniRx.Operators.Do:OnNext(Unit) UniRx.Operators.ImmutableReturnUnitObservable:Subscribe(IObserver`1) UniRx.Operators.Do:Run() UniRx.Operators.DoObservable`1:SubscribeCore(IObserver`1, IDisposable) UniRx.Operators.OperatorObservableBase`1:Subscribe(IObserver`1) UniRx.Operators.OperatorObservableBase`1:Subscribe(IObserver`1) UniRx.Operators.SelectManyOuterObserver:OnNext(Unit) UniRx.Operators.SelectMany:OnNext(Unit) UniRx.Operators.SelectMany:OnNext(Unit) UniRx.Operators.SelectMany:OnNext(Unit) UniRx.Operators.Do:OnNext(Unit) UniRx.Operators.SelectMany:OnNext(Unit) UniRx.Operators.SelectManyOuterObserver:OnNext(Unit) UniRx.Operators.Do:OnNext(Unit) UniRx.Operators.ImmutableReturnUnitObservable:Subscribe(IObserver`1) UniRx.Operators.Do:Run() UniRx.Operators.DoObservable`1:SubscribeCore(IObserver`1, IDisposable) UniRx.Operators.OperatorObservableBase`1:Subscribe(IObserver`1) UniRx.Operators.SelectManyOuterObserver:Run() UniRx.Operators.SelectManyObservable`2:SubscribeCore(IObserver`1, IDisposable) UniRx.Operators.OperatorObservableBase`1:Subscribe(IObserver`1) UniRx.Operators.Do:Run() UniRx.Operators.DoObservable`1:SubscribeCore(IObserver`1, IDisposable) UniRx.Operators.OperatorObservableBase`1:Subscribe(IObserver`1) UniRx.Operators.SelectManyOuterObserver:OnNext(Unit) UniRx.Operators.SelectMany:OnNext(Unit) UniRx.Operators.WhenAll_:OnNext(Unit) UniRx.Operators.WhenAllCollectionObserver:OnCompleted() UniRx.Operators.AsUnitObservable:OnCompleted() UniRx.Operators.WhenAll:OnCompleted() UniRx.Operators.WhenAllCollectionObserver:OnCompleted() UniRx.Operators.ImmutableReturnUnitObservable:Subscribe(IObserver`1)
Model-View-(Reacitve)Presenter View Reactive Presenter Model
Model-View-(Reacitve)Presenter View Reactive Presenter Model
Chaotic-Reacitve-Model Reactive Presenter Model
Chaotic-Reacitve-Model Reactive Presenter Model
Rx • • • • • • • • • • Simplicity
Rx • • • • • • • • • •
• Before gRPC • • • • • • After gRPC • •
• • • • • • • • •
• • • • • • • • •
ZeroFormatter
• • • • •
• • • • • • • • •
MessagePack for C#
C# • • • • • • • • •
C# • • • • • • • • •
• • • • • • • •
• • • • • • • • •
• • • • • • • • •
DB • • • •
Architecture of MasterMemory Header LZ4+MsgPack Memory<T> LZ4+MsgPack LZ4+MsgPack LZ4+MsgPack
• • • • • • • • • •
• • • • • • • • • •
The Future Has Come • • C# • • • • • •
We're Hiring Unity Engineer/Technical Artist http://recruit.grani.jp/
Thank you!