Unity:StrangeIoC小案例(非纯原创)
声明:UGUI是自己用素材弄的外,其余都不是原创
- 文件夹列表
- 最顶部的父亲为一个节点GameObject,名字为GameRoot,挂载一个脚本:Game Root(Script)
- Main Camera还有2个组件:GUI Layer和Flare Layer
- EventSystem还有2个组件:Touch Input Module和Base Input
- 以下四个节点均有Button组件,其余都没有,请注意:
OpenSkillUIBtn、 CloseSkillUIBtn、 SendMSGToSkillUIBtn、 RequestBtn
- 现在是案例展示
还没有点击开始的时候是什么都没有的,当点击运行按钮之后:
点击打开按钮
点击请求按钮
点击发送按钮
点击关闭按钮就和刚运行游戏的时候一样
现在是代码展示
- 以下是Scripts文件夹所有22个脚本的列表,我按照从上到下的顺序依次贴出代码
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();
}
}