Slide 1

Slide 1 text

Reactive Programming by UniRx for Asynchronous & Event Processing 2014/07/30 Yoshifumi Kawai - @neuecc

Slide 2

Slide 2 text

Self Introduction @ CTO C# 5.0 + .NET Framework 4.5 + ASP.NET MVC 5 C# Web @ Microsoft MVP for Visual C# / C# Web http://neue.cc/ Twitter @neuecc

Slide 3

Slide 3 text

What’s Reactive Programming?

Slide 4

Slide 4 text

Functional Reactive Programming http://en.wikipedia.org/wiki/Functional_reactive_programming Excel …… Reactive Extensions FRP (Haskell ) 2009 .NET Reactive Extensions

Slide 5

Slide 5 text

Functional Reactive Programming http://en.wikipedia.org/wiki/Functional_reactive_programming Excel …… Reactive Extensions FRP (Haskell ) 2009 .NET Reactive Extensions UniRx ReactiveExtensions(Rx) Unity

Slide 6

Slide 6 text

Gartner’s Hype Cycle 2013 Application Architecture/Application Development On the Rise - Reactive Programming

Slide 7

Slide 7 text

Technology Radar Languages & Framework ThoughtWorks Technology Radar July 2014 Rx ADOPT OK TRIAL ASSESS HOLD

Slide 8

Slide 8 text

Across Languages RxJava Netflix for Java/Scala ReactiveCocoa GitHub 5073 for Objective-C RxJS/bacon.js JavaScript RxJS bacon.js

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

UniRx

Slide 11

Slide 11 text

UniRx 100 Asset Store Reactive Programming Reactive Extensions RxJava Wiki

Slide 12

Slide 12 text

UniRx - Reactive Extensions for Unity

Slide 13

Slide 13 text

Reactive Extensions(Rx) is LINQ C# LINQ LINQ(to Objects) C# Rx LINQ LINQ Reactive Programming Rx

Slide 14

Slide 14 text

UniRx is .NET(C#) Rx Unity https://github.com/neuecc/UniRx http://u3d.as/7tT (Asset Store, Price : FREE) Rx + Unity C# …… https://rx.codeplex.com/ Bart De Smet Microsoft Unity :)

Slide 15

Slide 15 text

Q C# LINQ Rx 5 …… 3 @IT http://www.atmarkit.co.jp/fdotnet/introrx/introrx_01/introrx_01_01.html AOT Safe LINQ iOS AOT Unity + iOS AOT http://neue.cc/2014/07/01_474.html

Slide 16

Slide 16 text

Reactive Extensions is LINQ to Events LINQ to Asynchronous

Slide 17

Slide 17 text

Event is Observable Sequence Rx IObservable time OnTap 3 Tap 5 Tap 1 Tap

Slide 18

Slide 18 text

IEnumerable <-> IObservable IObservable time IEnumerable length IEnumerable length .Where(x => x % 2 == 0) IObservable time .Where(x => x % 2 == 0) Where LINQ

Slide 19

Slide 19 text

Push Event Stream Event Processing Interactive/Visualize

Slide 20

Slide 20 text

Internet of Things Push Kinect Oculus Twitter Streaming PubSub, WebSocket Logs are Stream(Fluentd, Amazon Kinesis, Azure Event Hubs) MonoBehaviour Update , OnMouseClick, etc...

Slide 21

Slide 21 text

LINQ

Slide 22

Slide 22 text

LINQ LINQ LINQ

Slide 23

Slide 23 text

Better EventHandling

Slide 24

Slide 24 text

Limitations of .NET Events // public event Action OnHitDamage; // player.OnHitDamage += (damage) => { if (damage >= 1000) { // " " } }; player.OnHitDamage -= /* */

Slide 25

Slide 25 text

Observable Sequence to the Rescue IObservable onHitDamage = player.OnHitDamage; var criticalHit = onHitDamage .Where(x =>x >= 1000); var subscription = criticalHit.Subscribe(damage => /* ... */); subscription.Dispose(); LINQ

Slide 26

Slide 26 text

Lifecycle Resource Management // Disposable CompositeDisposable subscriptions = new CompositeDisposable(); void Awake() { var player = new Player(); var enemy1 = new Player(); var enemy2 = new Player(); // player.OnHitDamage.Subscribe().AddTo(subscriptions); enemy1.OnHitDamage.Subscribe().AddTo(subscriptions); enemy2.OnHitDamage.Subscribe().AddTo(subscriptions); } void OnDestroy() { // subscriptions.Dispose(); }

Slide 27

Slide 27 text

Curing Your Asynchronous Programming Blues

Slide 28

Slide 28 text

yield return is awaitable IEnumerator GetBingText() { var www = new WWW("http://bing.com/"); yield return www; // Debug.Log(www.text); } It’s Unity’s awesome feature!

Slide 29

Slide 29 text

But... IEnumerator GetGoogle() { var www = new WWW("http://google.com/"); yield return www; } IEnumerator OnMouseDown() { try { // yield return StartCoroutine(GetGoogle()); } catch { } } IEnumerator yield return try-catch

Slide 30

Slide 30 text

IEnumerator GetGoogle(Action onCompleted, Action onError) { var www = new WWW("http://google.com/"); yield return www; if (!www.error) onError(new Exception(www.error)); else onCompleted(www.text); } ……(JavaScript ) IEnumerator

Slide 31

Slide 31 text

Rx Unity ObservableWWW.Get("http://google.co.jp/") .SelectMany(x => ObservableWWW.Get(x)) // .Retry(3) // 3 .Subscribe( x => Debug.Log(x), // ex => Debug.LogException(ex)); // Rx x x x

Slide 32

Slide 32 text

Why can Rx apply to asynchronous? x IEnumerable IObservable IObservable time event async IE

Slide 33

Slide 33 text

Why can Rx apply to asynchronous? x IEnumerable IObservable IObservable time event async IE Orchestrate Rx

Slide 34

Slide 34 text

var parallel = Observable.WhenAll( ObservableWWW.Get("http://google.com/"), ObservableWWW.Get("http://bing.com/"), ObservableWWW.Get("http://unity3d.com/")); parallel.Subscribe(xs => { Debug.Log(xs[0].Substring(0, 100)); // google Debug.Log(xs[1].Substring(0, 100)); // bing Debug.Log(xs[2].Substring(0, 100)); // unity });

Slide 35

Slide 35 text

IObservable time IObservable time WhenAll Observable.WhenAll( ObservableWWW.Get(), ObservableWWW.Get(), ObservableWWW.Get()) Subscribe(xs => xs[0], xs[1], xs[2])

Slide 36

Slide 36 text

Conclusion

Slide 37

Slide 37 text

Reactive Programming UniRx Available Now GitHub - https://github.com/neuecc/UniRx/ Asset Store(FREE) – http://u3d.as/7tT Update (v4.4)