Unity StrangeIoc框架 (三)signal信號方式


先創建TestRoot

using UnityEngine;
using System.Collections;
using strange.extensions.context.impl;

public class TestRoot : ContextView {

    void Start()
    {
        context = new TestContext(this);
    }
}

創建TestContext   在TestContext中我們需要把事件命令修改為 信號命令

using UnityEngine;
using System.Collections;
using strange.extensions.context.impl;
using strange.extensions.context.api;
using strange.extensions.command.api;
using strange.extensions.command.impl;

public class TestContext : MVCSContext {

    public TestContext(MonoBehaviour view)
        : base(view)
    {

    }


    public TestContext(MonoBehaviour view, ContextStartupFlags flags)
        : base(view, flags)
    {

    }
  
   override public IContext Start()     {         base.Start();         StartSignal startSignal = (StartSignal)injectionBinder.GetInstance<StartSignal>();         startSignal.Dispatch();         return this;     }
protected override void addCoreComponents() { base.addCoreComponents(); injectionBinder.Unbind<ICommandBinder>(); injectionBinder.Bind<ICommandBinder>().To<SignalCommandBinder>().ToSingleton(); } protected override void mapBindings() { injectionBinder.Bind<SuccessSignal>().ToSingleton();
        injectionBinder.Bind<IService>().To<TestService>();

        mediationBinder.Bind<TestView>().To<TestMediator>();

        commandBinder.Bind<RequestSignal>().To<RequestCommand>();
        commandBinder.Bind<StartSignal>().To<StartCommand>().Once();
} }

strange中IcommandBinder 事件綁定是在addCoreComponents中進行的 所以我們重寫他 調用它原本的方法 再將ICommandBinder移除,在將他綁定到信號上signalCommandBinder  重寫Start()  然后派發  這樣就完成了        最后在mapBinding中進行之前一樣的綁定 。

我們寫一個腳本 把所有的信號都放在里面。   在具體情況中可以分模塊將信號放在一起

  public class StartSignal : Signal
    {
    }
    public class ClickSignal : Signal
    {
    }
    public class RequestSignal : Signal<string>
    { 
   }
public class SuccessSignal : Signal {
   }

StartCommand與之前的事件方法沒有區別

public class StartCommand : Command
    {
        [Inject(ContextKeys.CONTEXT_VIEW)]
        public GameObject contextView { get; set; }
        public override void Execute()
        {
            GameObject test = new GameObject("test");
            test.AddComponent<TestView>();
            test.transform.SetParent(contextView.transform);
        }
    }

TestView 有略微的不同    直接實例信號進行派發

public class TestView : View
    {
        public ClickSignal signal_Click = new ClickSignal();
        void OnGUI()
        {
            if (GUI.Button(new Rect(0, 0, 100, 40), "click"))
            {
                signal_Click.Dispatch();
            }
        }
    }

在TestMediator中進行監聽  然后執行方法

 public class TestMediator : Mediator
    {
        [Inject]
        public TestView view { get; set; }

        [Inject]
        public RequestSignal signal_Request { get; set; }

        public override void OnRegister()
        {
            view.signal_Click.AddListener(OnClick);
        }
        public void OnClick()
        {
            signal_Request.Dispatch("www.baidu.com");
        }
    }

當被點擊后會進行signal_Request信號的事件派發   RequestSignal 通過注入獲取

在RequestCommand中  我們service 通過注入獲取  然后對他進行了signal_succesd信號的監聽

public class RequestCommand : Command
    {
        [Inject]
        public IService service { get; set; }
        public override void Execute()
        {
            Retain();
            service.signal_succesd.AddListener(OnComplete);
            service.Request();
        }
        void OnComplete()
        {
            service.signal_succesd.RemoveListener(OnComplete);
            Debug.Log("get data finish");

            Release();
        }

    }

既然添加了監聽 那么肯定有地方會進行成功后的信號派發    在TestService 中  我們對成功的信號進行派發

public class TestService : IService
    {
        [Inject(ContextKeys.CONTEXT_VIEW)]
        public GameObject contextView { get; set; }
        [Inject]
        public SuccessSignal signal_succesd { get; set; }

        public void Request()
        {
            contextView.GetComponent<MonoBehaviour>().StartCoroutine(Wait());
        }
        /// <summary>
        /// 模擬網絡請求延遲1秒
        /// </summary>
        /// <returns></returns>
        IEnumerator Wait()
        {
            yield return new WaitForSeconds(1);
            signal_succesd.Dispatch();
        }
    }

這樣  我們就實現了信號的機制  信號也是官方推薦的方法

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM