HotFix.Init学习笔记
请大家关注我的微博:@NormanLin_BadPixel坏像素
我们之前看的代码都是属于Modle命名空间下的,现在我们需要来看看热更下的代码了。我们的入口就是Init.Start方法。
public static void Start()
{
try
{
Hotfix.Scene.ModelScene = Game.Scene;
// 注册热更层回调
Game.Hotfix.Update = () => { Update(); };
Game.Hotfix.LateUpdate = () => { LateUpdate(); };
Game.Hotfix.OnApplicationQuit = () => { OnApplicationQuit(); };
// 注册热更层消息回调
ClientDispatcher clientDispatcher = new ClientDispatcher
{
HotfixCallback = (s, p) => { HotfixMessageDispatcher.Run(s, p); }
};
Game.Scene.GetComponent<NetOuterComponent>().MessageDispatcher = clientDispatcher;
Hotfix.Scene.AddComponent<UIComponent>();
Hotfix.Scene.AddComponent<OpcodeTypeComponent>();
Hotfix.Scene.AddComponent<MessageDispatherComponent>();
//Hotfix.EventSystem.Run(EventIdType.InitSceneStart);
Hotfix.EventSystem.Run(EventIdType.LandlordsInitSceneStart);
}
catch (Exception e)
{
Log.Error(e.ToStr());
}
}
作者的注释很详细咯。我们在这里,终于看到了之前在NetOuterComponent留下的坑,对网络消息的处理。在ClientDispatcher内。这里大家注意,网络消息也分为热更层的消息跟非热更层的消息,两者会做不同的处理,所以在这里创建ClientDispatcher的时候一并注册了热更层消息回调。
本来想在这里直接讲ClientDispatcher的,但是写完发现篇幅有点长,还讲了点其他东西,所以这里分下P吧。ClientDispatcher学习笔记
在注册了消息调度后,添加了热更层的UIComponent、OpcodeTypeComponent、MessageDispatherComponent。UI我们先不讲,其他两个在ClientDispatcher学习笔记里面顺带讲了。
最后,我们通过Hotfix.EventSystem调用了EventIdType.LandlordsInitSceneStart事件。而Hotfix.EventSystem,跟Model.EventSystem区别不大,大家可以自己去看一下。需要注意的是,在HotFix.EventSystem中注册的事件,也会注册到mono层。
// hotfix的事件也要注册到mono层,hotfix可以订阅mono层的事件
Action<List<object>> action = list => { Handle(aEventAttribute.Type, list); };
Game.EventSystem.RegisterEvent(aEventAttribute.Type, new EventProxy(action));
EventProxy跟MessageProxy同类型的功能。
我们来看看都有什么订阅了LandlordsInitSceneStart事件。
[Event(EventIdType.LandlordsInitSceneStart)]
public class InitSceneStart_CreateLandlordsLogin : AEvent
{
public override void Run()
{
//创建登录界面
UI ui = Hotfix.Scene.GetComponent<UIComponent>().Create(UIType.LandlordsLogin);
}
}
创建了个UI。。。好吧,这里如果不讲点UI方面的东西就讲不下去了。
这里说明一下UIComponent的一个作用,就是在创建UI实例的时候,会根据传入的UIType进行不同的初始化操作,每个UI的初始化都写在一个单独的类当中。具体怎么实现的我们之后再详细学(我大致浏览过嘿嘿),现在我们只要知道,当我们创建**UIType.LandlordsLogin**UI时,可以找到对应的初始化方法。我们来看看,这个UI到底是如何初始化的。
LandlordsLoginFactory
作者已经注释了许多,这里我们需要注意的是这段代码。
//创建登录界面实体
UI ui = ComponentFactory.Create<UI,GameObject>(login);
//添加登录界面组件
ui.AddComponent<LandlordsLoginComponent>();
这里第一眼我还以为是是Unity.GameObject.AddComponent呢,哈哈,其实是Entity.AddComponent。这里大家不要学我。LandlordsLoginComponent有点东西,我们分个P。