我想為這個系列之前的一篇文章做一些補充。此前我們添加了一個按住 Shift 可以奔跑的效果。有些游戲則是使用 Shift 鍵來切換走跑狀態(tài)的。通過我們的 Observable 控制器可以非常簡單的完成修改。
基于信號架構的一個好處是,我們可以只改變信號的產生,而不用修改響應信號的代碼。我們原來定義的 Run 信號是這樣的:
Run = this.UpdateAsObservable()
.Select(_ => Input.GetButton("Fire3"))
.ToReadOnlyReactiveProperty();
每一次 Update, 如果 Shift (“Fire3” 輸入軸)被按下 Run 就返回 true, 否則就返回 false。(僅僅是為了使用方便,我們將它轉化成了響應式屬性)
將其改變被按鍵切換狀態(tài)就像下面這樣簡單:
var runValue = false;
Run = this.UpdateAsObservable()
.Where(_ => Input.GetButtonDown("Fire3"))
.Do(_ => runValue = !runValue)
.Select(_ => runValue)
.ToReadOnlyReactiveProperty();
runValue 是使用了閉包特性的狀態(tài)。在每次 Shift 按鈕被按下的 Update, 我們將 runValue 取反并重新賦值。此處的 Do 方法不是必須要有的;我們完全可以將 Do 中的函數(shù)移到 Select 中執(zhí)行。然而 Do 明確指出有一些副作用正在發(fā)生。就像在這個例子中,狀態(tài)值被操縱了,這就可以作為你的程序員伙伴的警告標志(也包括未來的你)。
當然你必須要小心沒有其他地方會引用 runValue, 所以你可能希望通過將它隱藏在特定的函數(shù)中,來保護它。
最重要的是,除了那些負責生成運行信號的代碼,我們沒有改變任何其他任何一行代碼。那些沒有修改的代碼也依然能按照預期運行!