[Unity]使用StrangeIOC框架中的Dispatcher設計響應式編程

[Unity]技術學習路線圖(長期更新)

[Unity]使用StrangeIOC框架設計響應式編程

下載與安裝

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);
            }
        }
    
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容