先創建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();
}
}
這樣 我們就實現了信號的機制 信號也是官方推薦的方法
