[Unity]使用StrangeIOC框架設計響應式編程
下載與安裝
- 下載地址 GitHub
StrangeIOC特性介紹
Strange框架的目的是為了在混亂的Unity項目代碼中,設計支持響應式編程設計模式
Strange框架中提供的特性大部分都是可選性的
使用EventDispatcher
完成事件分發功能
EventDispatcher
是strange框架內的默認分發系統。將會有Signals
信號能夠添加到一個分發系統內。
EventDispatcher
的使用步驟
-
創建
EventDispatcher
對象private EventDispatcher dispatcher = new EventDispatcher();
-
添加
Listener
監聽對象void Start () { //當遇到分發的事件為'Fire'時,會自動調用CallBack事件 dispatcher.AddListener ("Fire", ((IEvent payload) => { Debug.Log(payload.data); })); }
-
分發
Fire
類型的字符串//UGUI按鈕完成點擊事件 public void DidClickButton() { dispatcher.Dispatch ("Fire", "點擊了按鈕"); }
-
刪除響應的監聽者
Listener
dispatcher.RemoveListener ("Fire", ecb);
完成一個具體的需求
當程序內的一個游戲對象需要通過鍵盤控制時,我們可以通過如下代碼完成功能
-
HHGameController.cs
using UnityEngine; using System.Collections; using strange.extensions.dispatcher.eventdispatcher.impl; using strange.extensions.dispatcher.eventdispatcher.api; public class HelloView : MonoBehaviour { // Use this for initialization //指定物體對象 public HHPlayer Player; //當前事件對象 private Event e; void OnGUI() { e = Event.current; if (e == null) { return; } Player.Dispatcher.Dispatch (e.keyCode); } }
-
HHPlayer.cs
using UnityEngine; using System.Collections; using strange.extensions.dispatcher.eventdispatcher.impl; using strange.extensions.dispatcher.eventdispatcher.api; public class HHPlayer:MonoBehaviour { private EventDispatcher _dispatcher = null; public EventDispatcher Dispatcher{ get{ if (_dispatcher == null) { _dispatcher = new EventDispatcher (); } return _dispatcher; } } void Start() { this.InitDispatcher (); } private void InitDispatcher() { EventCallback vertical_callback = ((IEvent payload) => { Vector3 translate = new Vector3 (); translate.x = 0f; translate.y = 0f; translate.z = Input.GetAxis ("Vertical") * 0.03f; this.transform.Translate (translate); }); EventCallback horizontal_callback = ((IEvent payload) => { Vector3 rotate = new Vector3(); rotate.x = 0f; rotate.y = 1f; rotate.z = 0f; this.transform.Rotate(rotate,Input.GetAxis("Horizontal")); }); this.Dispatcher.AddListener (KeyCode.W, vertical_callback); this.Dispatcher.AddListener (KeyCode.S, vertical_callback); this.Dispatcher.AddListener (KeyCode.A, horizontal_callback); this.Dispatcher.AddListener (KeyCode.D, horizontal_callback); } }