![Creator SystemManager](https://hackmd.io/_uploads/HJqh6Pth6.png) ## SystemManager 管理所有子System及其生命週期,水平擴充系統,實體需要在遊戲啟動時建立。 --- `CreateSystem(type : new () => SubSystemBase)` 建立系統 * type:子系統型別 `GetSystem<T>(systemType:string):T` 取得已建立系統 * systemType:系統名稱 ## SubSystemBase 純系統不具連線功能 --- `GetOtherSystem<T>(systemType:string):T` 透過SubsystemBase取得其它系統 * systemType:系統名稱 `AddDependency(dependentSystem: string)` 設定系統依賴於其它系統(OnAttach需要等其它系統ready後,系統才才會觸發。) * systemType:系統名稱 `SetReady()` 通知SystemManager系統ready `Destroy()` 通知SystemManager回收系統 ``` //建立 abstract OnCreate():void //回收 abstract OnDestroy():void //連結 abstract OnAttach():void //脫離連結 abstract OnDetach():void ``` 系統的生命週期。 ## HttpSystemBase 使用http連線的系統 | 差異 | GET | POST | | -------- | -------- | -------- | | 查詢參數 | 直接寫在網址| 在MeeageBody| | 網址變化 | 因查詢改變 | 不變 | | 傳輸限制 | URL長度有限制| 沒有限制 | | 安全 | 明碼在URL中| 隱藏在封包中| | 資料結構 | 只充許用ASCII| 沒有限制| --- **Http with JSON** ``` export interface IJsonSerializable { Code?:number; Message?:number; } export interface IJsonDeSerializable { //error Code Code?:number; Message?:string; } ``` `GetByJson<T>(url: string, token?: string, isBearer?: boolean): Promise<T>` * T:回傳型別,繼承IJsonDeSerializable結構 * url:網址 * token:server認證用 * isBearer:是否使用bearerToken `PostByJson<T>(url: string, data:{ [key: string]: any }, token?: string, isBearer?: boolean): Promise<T>` * data:傳送資料,繼承IJsonSerializable結構 --- **Http with Proto** `PostByProto<T extends typeof Message>(url: string, data:Message, rspMessage:T, token?: string, isBearer?: boolean): Promise<InstanceType<T>>` * data:傳送資料,繼承Message結構 * T:回傳型別,繼承Message結構 * rspMessage:回傳型別靜態實體,繼承Message結構 `GetByProto<T extends typeof Message>(url: string, rspMessage:T, token?: string, isBearer?: boolean): Promise<InstanceType<T>>` [HTTP狀態碼](https://developer.mozilla.org/zh-TW/docs/Web/HTTP/Status) ## SocketSystemBase 使用Socket連線的系統 --- **建立自定連線** `CreateConnection(connectType : ConnectType, onConnected:()=>void, onDisConnect:()=>boolean, protocolImp : IProtocolHelper = null)` 1.建立連線 * connectType:辨識Socket連線唯一值,其它系統存取已建立的連線使用,依需求自行新增。 ``` export enum ConnectType{ None = 0, Login = 1, Game = 2, Chat = 3, } ``` * onConnected:連線成功回呼。 * onDisConnect:斷線回呼,回傳true表示執行斷線重連。 * protocolImp:傳輸結構實作,預設為Protobuf。 `socketNode.Connect(netOptions:NetConnectOptions)` 2.使用socketNode連線 * netOptions:連線設定,url與ip+port二選一。 ``` export interface NetConnectOptions { host?: string, port?: number, url?: string, // autoReconnect?: number, // -1 永久重連,0不自動重連,其他正整數為自動重試次數 } ``` --- **自定Protocol** ``` export interface IProtocolHelper { /** 返回header長度 */ getHeadlen(): number; /** 返回心跳包 */ getHearbeat(): NetData; /** 返回封包的長度 */ getPackageLen(msg: NetData): number; /** 處理request資料 */ handlerRequestPackage(requestType:number, message: any): Uint8Array; /** 處理response資料 */ handlerResponsePackage(respBytes: Uint8Array): IProtoMessage; } ``` --- **發送與傳送封包** `Request(requestType:number, message: Message, responseType: number = -1, force: boolean = false)` 發送封包 * requestCmd:request封包id。 * message:protobuf傳輸內容。 * responseType:掉包檢查,檢查是否有回傳訊息。 * force:即使socket不是工作狀態依然強制發送。 `RegisterResponeHandler(cmd: number, message:T, callback: NetCallFunc)` 註冊server封包 * cmd:封包id。 * message:封包型別。 * message:綁定函式。 `RemoveResponeHandler(cmd: number, callback: NetCallFunc)` 反註冊server封包 ## CocosCreate使用Protobuf 1.安裝npm 套件 * protobufjs: 處理Protobuf序列化與反序列化的核心函式庫。 * protobufjs-cli: 提供protobufjs的命令行工具,用於將 .proto 文件編譯為 JavaScript 或 TypeScript 代碼。 ``` ``` [Cocos Creator 3.8.0 使用 ](protobufjshttps://forum.cocos.org/t/topic/154256) [cocos creator使用protobuf详细方案](https://forum.cocos.org/t/topic/147058) ## Generate Protobuf