
## 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