Unity:StrangeIoC小案例(非纯原创)

声明:UGUI是自己用素材弄的外,其余都不是原创

Unity:StrangeIoC小案例(非纯原创)


  • 文件夹列表

Unity:StrangeIoC小案例(非纯原创)


  • 最顶部的父亲为一个节点GameObject,名字为GameRoot,挂载一个脚本:Game Root(Script)
  • Main Camera还有2个组件:GUI Layer和Flare Layer
  • EventSystem还有2个组件:Touch Input Module和Base Input
    Unity:StrangeIoC小案例(非纯原创)

  • 以下四个节点均有Button组件,其余都没有,请注意:
    OpenSkillUIBtn、 CloseSkillUIBtn、 SendMSGToSkillUIBtn、 RequestBtn
    Unity:StrangeIoC小案例(非纯原创)

  • 现在是案例展示
    还没有点击开始的时候是什么都没有的,当点击运行按钮之后:
    Unity:StrangeIoC小案例(非纯原创)
    点击打开按钮
    Unity:StrangeIoC小案例(非纯原创)
    点击请求按钮
    Unity:StrangeIoC小案例(非纯原创)
    点击发送按钮
    Unity:StrangeIoC小案例(非纯原创)
    点击关闭按钮就和刚运行游戏的时候一样


现在是代码展示

  • 以下是Scripts文件夹所有22个脚本的列表,我按照从上到下的顺序依次贴出代码
    Unity:StrangeIoC小案例(非纯原创)

StartUpCommand

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

/// <summary>
/// 程序启动命令.
/// </summary>
public class StartUpCommand : EventCommand
{
    [Inject(ContextKeys.CONTEXT_VIEW)]
    public GameObject contextView { get; set; }

    public override void Execute()
    {
        //获取 UI 画布
        Transform canvas = contextView.transform.Find("Canvas");
        //加载并添加 MainUI
        GameObject go = Resources.Load("Prefabs/MainUI", typeof(GameObject)) as GameObject;
        GameObject mainUI = GameObject.Instantiate(go) as GameObject;
        //添加视图脚本, 或者直接绑定到预制件中都可以
        mainUI.AddComponent<MainUIView>();
        mainUI.transform.SetParent(canvas, false);
    }
}

CloseSkillUICommand

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

public class CloseSkillUICommand : EventCommand
{
    [Inject(ContextKeys.CONTEXT_VIEW)]
    public GameObject contextView { get; set; }

    public override void Execute()
    {
        //获取 UI 画布
        Transform canvas = contextView.transform.Find("Canvas");
        //销毁技能面板
        Transform skillUI = canvas.Find("SkillUI(Clone)");
        if(skillUI != null)
        {
            GameObject.Destroy(skillUI.gameObject);
        }
    }
}

OpenSkillUICommand

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

public class OpenSkillUICommand : EventCommand
{
    [Inject(ContextKeys.CONTEXT_VIEW)]
    public GameObject contextView { get; set; }

    public override void Execute()
    {
        //获取 UI 画布
        Transform canvas = contextView.transform.Find("Canvas");
        Transform skillUIT = canvas.Find("SkillUI(Clone)");
        if(skillUIT != null)
        {
            return;
        }
        //加载并添加 SkillUI
        GameObject go = Resources.Load("Prefabs/SkillUI", typeof(GameObject)) as GameObject;
        GameObject skillUI = GameObject.Instantiate(go) as GameObject;
        //添加视图脚本, 或者直接绑定到预制件中都可以
        skillUI.AddComponent<SkillUIView>();
        skillUI.transform.SetParent(canvas, false);
    }
}

SendMsgToSkillUICommand

using strange.extensions.command.impl;
using UnityEngine;

public class SendMsgToSkillUICommand : EventCommand
{
    public override void Execute()
    {
        MainUIMsgVO vo = (MainUIMsgVO)evt.data;
        Debug.Log("Command获取到发送的消息: " + vo.msg);

        dispatcher.Dispatch(NotificationCenter.SKILL_UI_ADD_MSG, vo.msg);
    }
}

MainUIMediator

using strange.extensions.dispatcher.eventdispatcher.api;
using strange.extensions.mediation.impl;

/// <summary>
/// 主界面中介类.
/// </summary>
public class MainUIMediator : EventMediator
{
    [Inject]
    public MainUIView view { get; set; }

    public override void OnRegister()
    {
        view.dispatcher.AddListener(MainUIView.OPEN_SKILL_UI_CLICK, OpenSkillUIClickHandler);
        view.dispatcher.AddListener(MainUIView.CLOSE_SKILL_UI_CLICK, CloseSkillUIClickHandler);
        view.dispatcher.AddListener(MainUIView.SEND_MSG_TO_SKILL_UI_CLICK, SendMSGToSkillUIClickHandler);

        view.Init();
    }

    public override void OnRemove()
    {
        view.dispatcher.RemoveListener(MainUIView.OPEN_SKILL_UI_CLICK, OpenSkillUIClickHandler);
        view.dispatcher.RemoveListener(MainUIView.CLOSE_SKILL_UI_CLICK, CloseSkillUIClickHandler);
        view.dispatcher.RemoveListener(MainUIView.SEND_MSG_TO_SKILL_UI_CLICK, SendMSGToSkillUIClickHandler);
    }

    private void OpenSkillUIClickHandler(IEvent evt)
    {
        dispatcher.Dispatch(NotificationCenter.OPEN_SKILL_UI);
    }

    private void CloseSkillUIClickHandler(IEvent evt)
    {
        dispatcher.Dispatch(NotificationCenter.CLOSE_SKILL_UI);
    }

    private void SendMSGToSkillUIClickHandler(IEvent evt)
    {
        dispatcher.Dispatch(NotificationCenter.SEND_MSG_TO_SKILL_UI, evt.data);
    }
}

IMainUIModel

public interface IMainUIModel
{  
}

MainUIModel

public class MainUIModel : IMainUIModel
{   
}

IMainUIService

public interface IMainUIService
{  
}

MainUIService

public class MainUIService : IMainUIService
{   
}

MainUIView

using strange.extensions.dispatcher.eventdispatcher.api;
using strange.extensions.mediation.impl;
using UnityEngine.UI;

/// <summary>
/// 主界面视图脚本.
/// </summary>
public class MainUIView : View
{
    public const string OPEN_SKILL_UI_CLICK = "openSkillUIClick";
    public const string CLOSE_SKILL_UI_CLICK = "closeSkillUIClick";
    public const string SEND_MSG_TO_SKILL_UI_CLICK = "sendMsgToSkillUIClick";

    [Inject]
    public IEventDispatcher dispatcher { get; set; }

    private Button openSkillUIBtn;
    private Button closeSkillUIBtn;
    private Button sendMsgToSkillUIBtn;

    public void Init()
    {
        openSkillUIBtn = this.gameObject.transform.Find("OpenSkillUIBtn").GetComponent<Button>();
        openSkillUIBtn.onClick.AddListener(OpenSkillUIBtnClickHandler);

        closeSkillUIBtn = this.gameObject.transform.Find("CloseSkillUIBtn").GetComponent<Button>();
        closeSkillUIBtn.onClick.AddListener(CloseSkillUIBtnClickHandler);

        sendMsgToSkillUIBtn = this.gameObject.transform.Find("SendMSGToSkillUIBtn").GetComponent<Button>();
        sendMsgToSkillUIBtn.onClick.AddListener(SendMsgToSkillUIBtnClickHandler);
    }

    private void OpenSkillUIBtnClickHandler()
    {
        dispatcher.Dispatch(OPEN_SKILL_UI_CLICK);
    }

    private void CloseSkillUIBtnClickHandler()
    {
        dispatcher.Dispatch(CLOSE_SKILL_UI_CLICK);
    }

    private void SendMsgToSkillUIBtnClickHandler()
    {
        dispatcher.Dispatch(SEND_MSG_TO_SKILL_UI_CLICK, new MainUIMsgVO {msg = "嗨,我是来自 MainUI 发送的消息!"});
    }
}

MainUIMsgVO

public class MainUIMsgVO
{
    public string msg;
}

SkillRequestCommand

using strange.extensions.command.impl;
using strange.extensions.dispatcher.eventdispatcher.api;

public class SkillRequestCommand : EventCommand
{
    [Inject]
    public ISkillModel model { get; set; }

    [Inject]
    public ISkillService service { get; set; }

    public override void Execute()
    {
        //这里有异步操作, 为了使 Command 对象不被释放, 我们需要调用下面的方法持有当前 Command 对象的引用
        Retain();

        service.dispatcher.AddListener(SkillService.RECEIVE_DATA, OnReceiveDataHandler);
        service.Request("https://www.google.com/");
    }

    private void OnReceiveDataHandler(IEvent evt)
    {
        service.dispatcher.RemoveListener(SkillService.RECEIVE_DATA, OnReceiveDataHandler);

        model.data = ((SkillMsgVO)evt.data).msg;
        dispatcher.Dispatch(NotificationCenter.SKILL_UI_ADD_MSG, model.data);

        //异步操作完成, 可以释放对象了
        Release();
    }
}

SkillUIMediator

using strange.extensions.dispatcher.eventdispatcher.api;
using strange.extensions.mediation.impl;

public class SkillUIMediator : EventMediator
{
    [Inject]
    public SkillUIView view { get; set; }

    public override void OnRegister()
    {
        dispatcher.AddListener(NotificationCenter.SKILL_UI_ADD_MSG, skillUIAddMsgHandler);

        view.dispatcher.AddListener(SkillUIView.REQUEST_BTN_CLICK, requestBtnClickHandler);

        view.Init();
    }

    public override void OnRemove()
    {
        dispatcher.RemoveListener(NotificationCenter.SKILL_UI_ADD_MSG, skillUIAddMsgHandler);

        view.dispatcher.RemoveListener(SkillUIView.REQUEST_BTN_CLICK, requestBtnClickHandler);
    }

    private void skillUIAddMsgHandler(IEvent evt)
    {
        view.AddText((string)evt.data);
    }

    private void requestBtnClickHandler(IEvent evt)
    {
        dispatcher.Dispatch(NotificationCenter.SKILL_REQUEST);
    }
}

ISkillModel

public interface ISkillModel
{
    string data { get; set; }
}

SkillModel

public class SkillModel : ISkillModel
{
    public string data { get; set; }
}

ISkillService

using strange.extensions.dispatcher.eventdispatcher.api;

public interface ISkillService
{
    IEventDispatcher dispatcher { get; set; }

    void Request(string url);
}

SkillService

using System.Collections;
using strange.extensions.context.api;
using strange.extensions.dispatcher.eventdispatcher.api;
using UnityEngine;

public class SkillService : ISkillService
{
    public const string RECEIVE_DATA = "receiveData";

    [Inject(ContextKeys.CONTEXT_VIEW)]
    public GameObject contextView { get; set; }

    [Inject]
    public IEventDispatcher dispatcher { get; set; }

    public void Request(string url)
    {
        contextView.GetComponent<GameRoot>().StartCoroutine(WaitASecond());
    }

    private IEnumerator WaitASecond()
    {
        yield return new WaitForSeconds(1.0f);

        dispatcher.Dispatch(RECEIVE_DATA, new SkillMsgVO{msg="我是服务端返回的数据!"});
    }
}

SkillUIView

using strange.extensions.dispatcher.eventdispatcher.api;
using strange.extensions.mediation.impl;
using UnityEngine.UI;

public class SkillUIView : View
{
    public const string REQUEST_BTN_CLICK = "requestBtnClick";

    [Inject]
    public IEventDispatcher dispatcher { get; set; }

    private Text outputText;
    private Button requestBtn;

    public void Init()
    {
        outputText = this.gameObject.transform.Find("OutputText").GetComponent<Text>();

        requestBtn = this.gameObject.transform.Find("RequestBtn").GetComponent<Button>();
        requestBtn.onClick.AddListener(RequestBtnClickHandler);
    }

    private void RequestBtnClickHandler()
    {
        dispatcher.Dispatch(REQUEST_BTN_CLICK);
    }

    public void AddText(string content)
    {
        outputText.text += content + "\n";
    }
}

SkillMsgVO

public class SkillMsgVO
{
    public string msg;
}

NotificationCenter

/// <summary>
/// 消息中心.
/// </summary>
public class NotificationCenter
{
    public const string OPEN_SKILL_UI = "openSkillUI";
    public const string CLOSE_SKILL_UI = "closeSkillUI";
    public const string SEND_MSG_TO_SKILL_UI = "sendMsgToSkillUI";

    public const string SKILL_REQUEST = "skillRequest";
    public const string SKILL_UI_ADD_MSG = "skillUIAddMsg";
}

GameContext

using strange.extensions.context.api;
using strange.extensions.context.impl;
using UnityEngine;

/// <summary>
/// 游戏上下文.
/// </summary>
public class GameContext : MVCSContext
{
    public GameContext () : base()
    {
    }

    public GameContext(MonoBehaviour view, bool autoStartup) : base(view, autoStartup)
    {
    }

    protected override void mapBindings()
    {
        mapModel();
        mapView();
        mapController();

        //调用 StartUp 命令启动程序
        commandBinder.Bind(ContextEvent.START).To<StartUpCommand>().Once();
    }

    /// <summary>
    /// 映射模型.
    /// </summary>
    private void mapModel()
    {
        injectionBinder.Bind<IMainUIService>().To<MainUIService>().ToSingleton();
        injectionBinder.Bind<IMainUIModel>().To<MainUIModel>().ToSingleton();

        injectionBinder.Bind<ISkillService>().To<SkillService>().ToSingleton();
        injectionBinder.Bind<ISkillModel>().To<SkillModel>().ToSingleton();
    }

    /// <summary>
    /// 映射视图.
    /// </summary>
    private void mapView()
    {
        mediationBinder.Bind<MainUIView>().To<MainUIMediator>();

        mediationBinder.Bind<SkillUIView>().To<SkillUIMediator>();
    }

    /// <summary>
    /// 映射控制器.
    /// </summary>
    private void mapController()
    {
        commandBinder.Bind(NotificationCenter.OPEN_SKILL_UI).To<OpenSkillUICommand>();
        commandBinder.Bind(NotificationCenter.CLOSE_SKILL_UI).To<CloseSkillUICommand>();
        commandBinder.Bind(NotificationCenter.SEND_MSG_TO_SKILL_UI).To<SendMsgToSkillUICommand>();

        commandBinder.Bind(NotificationCenter.SKILL_REQUEST).To<SkillRequestCommand>();
    }
}

GameRoot

using strange.extensions.context.impl;

/// <summary>
/// 游戏根容器类.
/// </summary>
public class GameRoot : ContextView
{
    void Awake()
    {
        //创建游戏上下文对象并启动
        context = new GameContext(this, true);
        context.Start();
    }
}