用Unity同时开发【微信小游戏】【安卓】【IOS】游戏#6.2 WebSocket通信
【系列文章目錄】
文章目錄
- 【系列文章目錄】
- 前言
- 一、導入UnityWebSocket插件
- 二、在TS中使用
前言
本篇來實現(xiàn)WebSocket通信
一、導入UnityWebSocket插件
要在Unity中使用WebSocket我查看了官方文檔
 我一直覺得Unity是一個把所有東西都為開發(fā)者準備好的引擎
 然而這次我錯了,它擺爛了,Unity并沒有為我們提供WebScoket的內(nèi)容
 
所以只好使用插件了,這里我使用的是UnityWebSocket
 網(wǎng)上也有很多教程用的是BestHttp
 我也心動過,但是它好貴,坐等打折好了
言歸正傳,首先我們先在UnityWebSocket的Release頁面下載插件
 然后將它導入到我們的項目中
 這個插件提供的Demo來供我們參考
二、在TS中使用
這個插件的使用是在C#中的,我們需要封裝一層來讓它能被TS使用
 這里我定義了一個WebSocketClient
需要注意的是,我們需要聲明使用的Action類型,才能正常使用
_jsEnv.UsingAction<string>(); _jsEnv.UsingAction<CloseStatusCode, string>();別忘了為它生成一下膠水代碼
接下來我們來在TS中繼續(xù)工作
import { UnityWebSocket, WebSocketClient } from "csharp"; import { TSLog } from "../../CustomLog/TSLog"; import { IBaseMessageData, SocketMessageType, WebSocketState } from "../NetDefine";//C#中我增加了一個Null類型 export enum WebSocketState {Null = 0,Connecting = 1,Open = 2,Closing = 3,Closed = 4 }export interface IWebSocket {/*** 連接WebSocket* @param address 連接地址*/Connect(address: string): void;/*** 發(fā)送數(shù)據(jù)* @param data Json數(shù)據(jù)* @param droppable 是否可拋棄,true在未連接狀態(tài)下會被拋棄,false會等待連接后發(fā)送數(shù)據(jù)*/Send(data: IBaseMessageData, droppable?: boolean): void;/*** 關閉連接*/Close(): void;/*** 監(jiān)聽消息* @param state 監(jiān)聽的類型* @param fun 回調(diào)函數(shù)*/ListenMessage(state: SocketMessageType, fun: Function): void;/*** 移除監(jiān)聽* @param state 監(jiān)聽的類型* @param fun 回調(diào)函數(shù)*/RemoveListen(state: SocketMessageType, fun: Function): void; }export class JSWebSocket extends WebSocketClient implements IWebSocket {private _waitSendCash: Array<string> = new Array<string>();private _messageHandler: Map<SocketMessageType, Array<Function>> = new Map<SocketMessageType, Array<Function>>();constructor() {super();this.JSOnOpen = this.Socket_OnOpen.bind(this);this.JSOnMessage = this.Socket_OnMessage.bind(this);this.JSOnClose = this.Socket_OnClose.bind(this);this.JSOnError = this.Socket_OnError.bind(this);}RemoveListen(state: SocketMessageType, fun: Function): void {if (this._messageHandler.has(state)) {let array = this._messageHandler.get(state);let newArray = new Array<Function>();array.forEach(v => {if (v != fun) {newArray.push(v);}});this._messageHandler.set(state, newArray);array.length = 0;array = null;}}ListenMessage(state: SocketMessageType, fun: Function): void {if (!this._messageHandler.has(state)) {this._messageHandler.set(state, new Array<Function>());}this._messageHandler.get(state).push(fun);}public Send(data: IBaseMessageData, droppable: boolean = true): void {let jstr = JSON.stringify(data);TSLog.Log("stringify:" + jstr)//判斷連接if (this.State != WebSocketState.Open) {//未連接且非可拋棄數(shù)據(jù)加入待發(fā)送池if (!droppable) {this._waitSendCash.push(jstr);}}else {//已連接直接發(fā)送this.SendByte(jstr);}}private Socket_OnOpen(address: string) {TSLog.Log("OnConnect---->" + address);if (this._waitSendCash.length > 0) {TSLog.Log("sendcash")this._waitSendCash.forEach(jstr => {this.SendByte(jstr);});}this._waitSendCash.length = 0;}private Socket_OnMessage(jstr: string) {TSLog.Log("OnMessage---->" + jstr);if (jstr == "echo.websocket.events sponsored by Lob.com") return;let jsdata: IBaseMessageData = JSON.parse(jstr) as IBaseMessageData;//解析Json根據(jù)類型分發(fā)Actionif (this._messageHandler.has(jsdata.type)) {let handlers = this._messageHandler.get(jsdata.type);for (let i = 0; i < handlers.length; i++) {if (handlers[i] != null) {try {handlers[i](jsdata);}catch (e) {TSLog.Error(e);}}}}}private Socket_OnClose(errCode: UnityWebSocket.CloseStatusCode, reason: string) {TSLog.Log("OnClose---->" + reason);}private Socket_OnError(message: string) {TSLog.Log("Connect---->" + message);} }這樣我們在TS中就可以使用WebSocket了
這里我定義了一個全局的mainSocket
export const mainSocket:IWebSocket = new JSWebSocket();以及一些配置和數(shù)據(jù)接口
export let mainSocketAddress: string = "wss://echo.websocket.events"; export let httpAddress: string = "";export interface IBaseMessageData {type: SocketMessageType; }export enum SocketMessageType {Null = 0,Test = 1 }export enum WebSocketState {Null = 0,Connecting = 1,Open = 2,Closing = 3,Closed = 4 }在游戲中我們會有很多個功能使用到Socket
 我不想在Socket中去為每個功能寫處理
 而是在每個功能的Hanlder中去處理
 這里我寫了一個TestHanlder來測試
然后我們就可以調(diào)用了
new TestHandler().Connect() //連接服務器.ReqTest(5, 1) //請求數(shù)據(jù).Close(5000); //關閉連接嗯,挺簡潔的,測試了也沒有什么問題
 
 具體內(nèi)容還需要與服務端聯(lián)調(diào),目前以及實現(xiàn)了功能
總結(jié)
以上是生活随笔為你收集整理的用Unity同时开发【微信小游戏】【安卓】【IOS】游戏#6.2 WebSocket通信的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 云计算和虚拟化的关系
- 下一篇: BBU与RRU
