main函数中加载完dll就是 接下来就是挂载组件 那么加载组件都干了什么事呢
加载组件主要做的事情
1. 组件工厂创建组件
根据frompool参数选择从缓存池取或者反射创建一个组件 创建的组件都有一个instanceid的 属性 组件的唯一表示
component = (T)Activator.CreateInstance(type);
2. 添加组件到Game的eventsystem字典中 注意这个是全局的EventSystem
Game.EventSystem.Add(component);
public void Add(Component component)
{
this.allComponents.Add(component.InstanceId, component);Type type = component.GetType();
if (this.loadSystems.ContainsKey(type))
{
this.loaders.Enqueue(component.InstanceId);
}if (this.updateSystems.ContainsKey(type))
{
this.updates.Enqueue(component.InstanceId);
}if (this.startSystems.ContainsKey(type))
{
this.starts.Enqueue(component.InstanceId);
}if (this.lateUpdateSystems.ContainsKey(type))
{
this.lateUpdates.Enqueue(component.InstanceId);
}
}
可以看到 Game.EventSystem.Add(component); 就干了2件事
①把组件添加到全局字典
②根据各类 system字典是否包含组件type 加到个格子事件队列中
this.updateSystems等字典中的数据从哪来的 ?
上一节中有说到加载dll过程中相关代码
遍历程序集所有标记有ObjectSystemAttribute标签的类 =>找实现了相应接口 如实现了IUpdateSystem接口 就把该type加到this.updateSystems字典中
foreach (Type type in types[typeof(ObjectSystemAttribute)])
{
object[] attrs = type.GetCustomAttributes(typeof(ObjectSystemAttribute), false);if (attrs.Length == 0)
{
continue;
}object obj = Activator.CreateInstance(type);
switch (obj)
{
case IAwakeSystem objectSystem:
this.awakeSystems.Add(objectSystem.Type(), objectSystem);
break;
case IUpdateSystem updateSystem:
this.updateSystems.Add(updateSystem.Type(), updateSystem);
break;
case ILateUpdateSystem lateUpdateSystem:
this.lateUpdateSystems.Add(lateUpdateSystem.Type(), lateUpdateSystem);
break;
}
}
比如下面这个类TimerComponentUpdateSystem UpdateSystem是实现了IUpdateSystem接口的
[ObjectSystem]
public class TimerComponentUpdateSystem : UpdateSystem<TimerComponent>
{
public override void Update(TimerComponent self)
{
self.Update();
}
}
现在知道了 this.updateSystems等字典中数据是在程序开始加载dll时根据type作为key 实例作为value缓存起来的
那么 this.updates.Enqueue(component.InstanceId); 又是为了什么呢? 这里还不清楚
3. 调用组件iawake接口
Game.EventSystem.Awake(component);
如果组件实现了IAwake接口的话 调用该接口的Run方法 Run方法调用子类实现的Awake方法
比如上面贴的那个 TimerComponentUpdateSystem类
4. 创建完组件, 添加到父附件的组件字典中
this.componentDict.Add(type, component