洪流學(xué)堂袍啡,讓你快人幾步踩官。你好却桶,我是你的技術(shù)探路者鄭洪智,你可以叫我大智蔗牡。
本篇文章首發(fā)于我的公眾號(hào):洪流學(xué)堂
今天給你分享一個(gè)Unity開源項(xiàng)目颖系,我們一起來(lái)看看吧!
UniRx是什么?
UniRx (Unity響應(yīng)式編程插件) 重寫了.Net的響應(yīng)式擴(kuò)展辩越。.Net官方的Rx很棒嘁扼,但是在Unity中無(wú)法使用,并且與IOS的IL2CPP有兼容性問(wèn)題黔攒。這個(gè)庫(kù)這些問(wèn)題并且添加了一些Unity專屬的工具類趁啸。 支持的平臺(tái)有:PC/Mac/Android/iOS/WP8/WindowsStore/等等,并且支持Unity4.6之后的所有版本督惰。
源碼地址:
https://github.com/neuecc/UniRx
UniRx 在 Unity Asset Store 的地址(免費(fèi)):
http://u3d.as/content/neuecc/uni-rx-reactive-extensions-for-unity/7tT
為什么用Rx?
一般來(lái)說(shuō)不傅,網(wǎng)絡(luò)操作需要用到 WWW
和 Coroutine
。但是使用 Coroutine
對(duì)于異步操作來(lái)說(shuō)不是一個(gè)好的選擇赏胚,原因如下:
- 協(xié)程不能有返回值访娶,因?yàn)樗祷仡愋捅仨毷荌Enumerator
- 協(xié)程不能處理異常,因?yàn)?yield return 語(yǔ)句沒辦法被 try-catch
會(huì)造成代碼大面積的強(qiáng)耦合觉阅。
Rx就是為了解決異步問(wèn)題而來(lái)的崖疤。Rx可以讓異步操作更優(yōu)雅,使用事件驅(qū)動(dòng)編程典勇,使用LINQ操作劫哼。
游戲循環(huán) (every Update, OnCollisionEnter, etc), 傳感器數(shù)據(jù) (Kinect, Leap Motion, VR Input, etc.) 都是事件。Rx將事件轉(zhuǎn)化為響應(yīng)式的序列割笙,通過(guò)LINQ操作可以很簡(jiǎn)單地組合起來(lái)权烧,還支持時(shí)間操作。
Unity通常是單線程,但是UniRx可以讓多線程更容易豪嚎。
UniRx 可以簡(jiǎn)化 uGUI 的編程搔驼,所有的UI事件 (clicked, valuechanged, etc) 可以轉(zhuǎn)化為 UniRx 的事件流。
下面的代碼實(shí)現(xiàn)了雙擊的檢測(cè):
var clickStream = Observable.EveryUpdate()
.Where(_ => Input.GetMouseButtonDown(0));
clickStream.Buffer(clickStream.Throttle(TimeSpan.FromMilliseconds(250)))
.Where(xs => xs.Count >= 2)
.Subscribe(xs => Debug.Log("DoubleClick Detected! Count:" + xs.Count));
這個(gè)例子僅用5行代碼侈询,展示出了下面的特性:
- 將游戲循環(huán)為 (Update) 變成事件流
- 組合事件流
- 合并自身事件流
- 基于時(shí)間的操作非常簡(jiǎn)單
如果以上鏈接無(wú)法下載或者下載太慢舌涨,可以在洪流學(xué)堂回復(fù)
UniRx
獲取網(wǎng)盤鏈接。
擴(kuò)展閱讀
- 【Unity開源項(xiàng)目精選】ML-Agents:給你的游戲加入AI
- 【Unity開源項(xiàng)目精選】AssetStudio:提取Unity游戲的資源
- 【Unity開源項(xiàng)目精選】xLua:Unity熱更新首選
- 【Unity開源項(xiàng)目精選】Unity引擎源碼的C#部分
- 【Unity開源項(xiàng)目精選】Entitas:Unity DOTS的先行者
我是大智扔字,你的技術(shù)探路者囊嘉,下次見!
別走革为!點(diǎn)贊扭粱,收藏哦!
好震檩,你可以走了琢蛤。