ET游戏框架整理笔记3: 常用内置组件功能

匿名 (未验证) 提交于 2019-12-02 23:52:01

上一节说道 挂载组件的几个步骤

1. 组件工厂创建组件

2. 如果有泛型类以组件为参数 并且实现了IUpdateSystem接口的话会调用它的update方法

如下面这个类

[ObjectSystem]
public class TimerComponentUpdateSystem : UpdateSystem<TimerComponent>
{




}

3. 组件添加到父组件字典中

-------------------------------------------------------上一节分界线-------------------------------------------------------


Options options = Game.Scene.AddComponent<OptionComponent, string[]>(args).Options;
StartConfig startConfig = Game.Scene.AddComponent<StartConfigComponent, string, int>(options.Config, options.AppId).StartConfig;

startconfig组件根据上面的文件路径加载配置 根据apptype初始化组件的各类配置文件 如下面这些

public StartConfig StartConfig { get; private set; }

public StartConfig DBConfig { get; private set; }

public StartConfig RealmConfig { get; private set; }

public StartConfig LocationConfig { get; private set; }

public List<StartConfig> MapConfigs { get; private set; }

public List<StartConfig> GateConfigs { get; private set; }


消息分发组件 MessageDispatcherComponent

[ObjectSystem]
public class MessageDispatcherComponentAwakeSystem : AwakeSystem<MessageDispatcherComponent>
{




}

创建该组件时调用load方法

/// <summary>






List<Type> types = Game.EventSystem.GetTypes(typeof(MessageHandlerAttribute));











IMHandler iMHandler = Activator.CreateInstance(type) as IMHandler;




iMHandler.GetMessageType();

















获取该Message的类型B,如下图的R2C_Ping

如下面这个就是一个消息处理类

[MessageHandler(AppType.AllServer)]
public class C2R_PingHandler : AMRpcHandler<C2R_Ping, R2C_Ping>
{





}

缓存的这些消息处理类在后面收发协议时候回用到



内网通信组件 NetInnerComponent

顾名思义 这个是内网通信用的 添加组件时候传入了内网的地址

Game.Scene.AddComponent<NetInnerComponent, string>(innerConfig.Address);

添加组件后会自动调用awake方法 看一下这个方法干了啥

public static void Awake(this NetInnerComponent self, string address)
{
self.Awake(NetworkProtocol.TCP, address, Packet.PacketSizeLength4);



}

public void Awake(NetworkProtocol protocol, string address, int packetSize = Packet.PacketSizeLength2)

















这里公司用的是websocket

然后就是开启websocket监听 配置文件中InnerConfig地址 127.0.0.1:20002

websocket通讯服务端大概这样的

*******************websocket服务端****************************************

第一步:创建HttpListener类,并启动监听:

var listener = new HttpListener();
listener.Prefixes.Add("http://10.10.13.140:8080/");
listener.Start();
第二步:等待连接

var context = listener.GetContext();
第三步:接收websocket

var wsContext = await context.AcceptWebSocketAsync(null);
var ws = wsContext.WebSocket;
Console.WriteLine("WebSocket connect");
第四步:开始异步接收数据

//接收数据
var wsdata = await ws.ReceiveAsync(abuf, cancel);
Console.WriteLine(wsdata.Count);
byte[] bRec = new byte[wsdata.Count];
Array.Copy(buf, bRec, wsdata.Count);
Console.WriteLine(Encoding.Default.GetString(bRec));
第五步:释放资源

//注意,使用完,记得释放,不然会有内存泄漏
ws.Dispose();

ET不一样的是在接收到websocket消息后 ,调用一个OnAccept方法 创建session组件 然后调用start方法

public void OnAccept(AChannel channel)
{



}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!