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();
        }
    }
 
复制代码

这样  我们就实现了信号的机制  信号也是官方推荐的方法

posted on   Sun‘刺眼的博客  阅读(2199)  评论(0编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示