StrangeIOC 个人学习笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_40271181/article/details/79558483

学习Unity有一段时间了,最近打算找工作了,但是先要做一个Demo练练手,现在需要一个游戏框架来做客户端。根据所知道的Unity的框架,除了MVC就是StrangeIOC了,所以打算使用StrangeIOC来做这个游戏Demo。

现在先来回顾一下对StrangeIOC的使用:
1. 启动这个框架:ContextView => Awake() => context = new MVCSContext(this); 需要注意的点:暂无
2.启动框架:MVCSContext => 构造函数(MonoBehaviour view):base(view){} => override MapBinding(){}
3.这里使用IEvent来驱动,脚本分为Model、View、Command、Service四个部分
4.View:实现UI方面的工作,不涉及逻辑层,UI的显示,更新、以及UI界面点击的检测监听。Awake()、Start()方法要注意,不要覆盖或重写了基类里面的方法。

public class BattleView : View {

    [Inject]
    public IEventDispatcher dispatcher { get; set; }//View层和Mediator层不是全局的dispatcher,需要单独声明一个

    // Update is called once per frame
    void Update () {
        if(Input.GetMouseButtonDown(0))
        {
            Debug.Log("MouseClick");
            dispatcher.Dispatch(ViewEvents.FireRequest);
        }
    }
}

上面是我们把鼠标点击事件进行了监听,然后通过dispatcher将这个事件传出去。这个事件我们事先使用枚举声明好:

public enum ViewEvents
{
    FireRequest
}

5.Mediator层:这个类里面,主要实现的功能是与controller层、service层、model层的交互。

public class BattleMediator : Mediator
{

    //后面需要操作View层,这里将view层取得,然后通过DI
    //注入到这里面
    //注意,这里声明的是一个属性,因为它的值的获得是ioc容器给的
    [Inject]
    public BattleView battleView { get; set; }


    //这里tag的括号里是表明是全局的dispatcher
    [Inject(ContextKeys.CONTEXT_DISPATCHER)]
    public IEventDispatcher dispatcher { get; set; }


    public override void OnRegister()
    {
        dispatcher.AddListener(CommandList.FireRequest, ReceiveRequest);
    }


    public override void OnRemove()
    {
        base.OnRemove();
    }

    // Use this for initialization
    void Start()
    {
        battleView.dispatcher.AddListener(ViewEvents.FireRequest,OnCLickDown);
    }

    // Update is called once per frame
    void Update()
    {
        //可以开火
        if(Input.GetKeyDown (KeyCode.A))
        {
            dispatcher.Dispatch(CommandList.ReleaseToFire);
        }
    }

    void OnCLickDown()
    {
        dispatcher.Dispatch(CommandList.Fire);
    }


    void ReceiveRequest(IEvent iev)
    {
        Debug.Log("报告船长,获取敌方坐标: "+iev.data.ToString()+" ,是否发射?");
    }
}

View :事件触发时,用一个dispatcher传递出来
Mediator:通过[inject] DI来获得View(这个事先), 在OnRegister()里面View.dispatcher.AddListener(事件,回调的函数)。

  1. 使用前,我们要先想着怎么启动这个框架吧,这就需要第一类了 =>ContextView。我们要先声明一个类 RootContextView:ContextView, 我们在这个类里的Awake()方法里,来启动它。
  2. 怎么在RootContextView里启动呢?这里就引出第二个类 => MVCSContext。MVSCContext类的作用是进行各种映射绑定(之后在讲)。
展开阅读全文

没有更多推荐了,返回首页