using System.Collections; using System.Collections.Generic; using System.Text; using UnityEngine; using UnityWebSocket; using System; //using System.IO; public class WebSocketDemo : MonoBehaviour { public static WebSocketDemo instance; public string MainSceneName = "NTESDemoScene"; /// /// 主服务器 /// public static WebSocket socket_main; /// /// 移动服务 /// public static WebSocket socket_trans; public ushort mySyncid; //内网测试版 //string address = "ws://192.168.1.124:19000"; //string address1 = "ws://192.168.1.124:19001"; //string address2 = "ws://192.168.1.124:19002"; //string address3 = "ws://192.168.1.124:19003"; //string address4 = "ws://192.168.1.124:19004"; //string address5 = "ws://192.168.1.124:19005"; //string address6 = "ws://192.168.1.124:19006"; //string address7 = "ws://192.168.1.124:19007"; //string address8 = "ws://192.168.1.124:19008"; //网易服务器版 //string address = "ws://36.155.130.22:9000"; //string address1 = "ws://36.155.130.22:9001"; //string address2 = "ws://36.155.130.22:9002"; //string address3 = "ws://36.155.130.22:9003"; //string address4 = "ws://36.155.130.22:9004"; //string address5 = "ws://36.155.130.22:9005"; //string address6 = "ws://36.155.130.22:9006"; //string address7 = "ws://36.155.130.22:9007"; //string address8 = "ws://36.155.130.22:9008"; //umayle服务器,小程序版 string address = "wss://wss.umayle.com:19000"; string address1 = "wss://wss.umayle.com:19001"; string address2 = "wss://wss.umayle.com:19002"; string address3 = "wss://wss.umayle.com:19003"; string address4 = "wss://wss.umayle.com:19004"; string address5 = "wss://wss.umayle.com:19005"; string address6 = "wss://wss.umayle.com:19006"; string address7 = "wss://wss.umayle.com:19007"; string address8 = "wss://wss.umayle.com:19008"; private void Awake() { instance = this; DontDestroyOnLoad(gameObject); } private void Start() { //string ip=File.ReadAllText(Application.streamingAssetsPath + "/WebsocketSetting.txt"); // string address = "ws://"+ip.Split('=')[1]; //string address = "ws://36.155.130.22:30000"; // 创建实例 socket_main = new WebSocket(address); // 注册回调 socket_main.OnOpen += OnOpen; socket_main.OnClose += OnClose; socket_main.OnMessage += OnMessage; socket_main.OnError += OnError; UnityEngine.SceneManagement.SceneManager.LoadScene(MainSceneName); InvokeRepeating("CheckConnect", 5, 5); } public void InitTrans(byte which) { string address = ""; switch (which) { case 1: address = address1; break; case 2: address = address2; break; case 3: address = address3; break; case 4: address = address4; break; case 5: address = address5; break; case 6: address = address6; break; case 7: address = address7; break; case 8: address = address8; break; default: Debug.LogError("服务器编号错误"); return; } socket_trans = new WebSocket(address); socket_trans.OnOpen += OnOpen; socket_trans.OnClose += OnClose; socket_trans.OnMessage += OnMessage; socket_trans.OnError += OnError; //Debug.Log("连接服务:"+address); } private void OnOpen(object sender, OpenEventArgs e) { string url=((UnityWebSocket.WebSocket)sender).Address ; Debug.Log("连接成功:" + url); if(url!=address) { //trans byte[] data = new byte[6]; Array.Copy(BitConverter.GetBytes(104), 0, data, 0, 4); Array.Copy(BitConverter.GetBytes(mySyncid), 0, data, 4, 2); SendByTrans(data); } if (GameManager.Instance) { GameManager.Instance.Tip.TipHide(); } } private void OnClose(object sender, CloseEventArgs e) { Debug.Log(string.Format("关闭: StatusCode: {0}, Reason: {1},连接:{2}", e.StatusCode, e.Reason, ((UnityWebSocket.WebSocket)sender).Address)); } private void OnError(object sender, UnityWebSocket.ErrorEventArgs e) { Debug.LogError(string.Format("错误: {0}", e.Message)); } private void CheckConnect() { if (socket_main != null && socket_main.ReadyState == WebSocketState.Closed) { Debug.Log("重连main"); if (GameManager.Instance) { GameManager.Instance.Tip.TipConform(); return; } else socket_main.ConnectAsync(); } if (socket_trans != null && socket_trans.ReadyState == WebSocketState.Closed) { Debug.Log("重连trans"); if (GameManager.Instance) { GameManager.Instance.Tip.TipConform(); return; } else socket_trans.ConnectAsync(); } } private void OnDestroy() { if (socket_main != null && socket_main.ReadyState != WebSocketState.Closed) { socket_main.CloseAsync(); } if(socket_trans!=null && socket_trans.ReadyState!= WebSocketState.Closed) { socket_trans.CloseAsync(); } } public void ConnectMain() { // 连接 socket_main.ConnectAsync(); } public void ConnectTrans() { // 连接 socket_trans.ConnectAsync(); } public void SendByMain(byte[] data) { socket_main.SendAsync(data); } public void SendByTrans(byte[] data) { socket_trans.SendAsync(data); } bool isSend = false; private void OnMessage(object sender, MessageEventArgs e) { if (e.IsBinary) { //Debug.Log(string.Format("Receive Bytes ({1}): {0}", e.RawData, e.RawData.Length)); //收到消息 int type = BitConverter.ToInt32(e.RawData, 0); byte[] data = e.RawData; if (type == 99) { //收到id (initScene) ushort tmpid = BitConverter.ToUInt16(data, 4); Debug.Log("我的syncid为" + tmpid); byte[] myGrid = new byte[] { data[7], data[8] }; mySyncid = tmpid; if (MyPlayer.Me == null) { //第一次连接 if (!MyPlayer.players.ContainsKey(tmpid)) { mySyncid = tmpid; GameObject player = GameManager.Instance.GeneratePlayers(true,myGrid); MyPlayer.Me = player.AddComponent(); MyPlayer.Me.Init(tmpid, true,myGrid); InitTrans(data[6]); ConnectTrans(); } } else { //重连 MyPlayer.Me.Init(tmpid, true, null); } GetData(); } else if (type == 100) { //房间数据 (GameSence) int count = BitConverter.ToInt32(data, 4); int num = 8; Debug.Log("获取数据,房间共有" + count + "人"); for (int index = 0; index < count; index++) { ushort id = BitConverter.ToUInt16(data, num); num += 2; if (!MyPlayer.players.ContainsKey(id) && mySyncid != id) { Debug.Log("id为:" + id+",编号为:"+ data[num]+","+data[num + 1]); byte[] myGrid = new byte[] { data[num], data[num+1] }; GameObject obj = GameManager.Instance.GeneratePlayers(false, myGrid); MyPlayer player= obj.AddComponent(); player.Init(id, false, myGrid); } num += 2; } //允许发送 if (MyPlayer.Me != null) { MyPlayer.Me.ReadySend = true; } else { Debug.LogError("me为空"); } } else if (type == 101) { //有人上线(不发给自己) ushort tmpid = BitConverter.ToUInt16(data, 4); if (!MyPlayer.players.ContainsKey(tmpid) && mySyncid != tmpid) { byte[] myGrid = new byte[] { data[data.Length - 2], data[data.Length - 1] }; GameObject obj = GameManager.Instance.GeneratePlayers(false, myGrid); MyPlayer player = obj.AddComponent(); player.Init(tmpid, false, myGrid); Debug.Log("有人上线:" + tmpid); } if (!isSend) { isSend = true; Invoke("SendToOther", 5f); } } else if (type == 102) { //有人下线 ushort tmpid = BitConverter.ToUInt16(data, 4); if (MyPlayer.players.ContainsKey(tmpid) && mySyncid != tmpid) { //删除 MyPlayer player = MyPlayer.players[tmpid]; MyPlayer.players.Remove(tmpid); GameManager.Instance.RecoveryPlayers(player); } } else if(type==103) { //各子改变 ushort id = BitConverter.ToUInt16(data, 4); MyPlayer.Me.OnCellChange(id, new byte[] { data[6], data[7] }); } else if(type== 105) { //ping SendPing(); } else if (type == 1001) { //玩家移动 if (MyPlayer.Me.ReadySend) { int count = BitConverter.ToInt32(data, 4); int index = 8; Debug.Log(count + "个人动"); for (int i = 0; i < count; i++) { //id ushort tmpsyncid = BitConverter.ToUInt16(data, index); index += 2; //判断位 byte zhou = data[index]; index++; //位置 if (zhou<<7 != 0) { float posx = BitConverter.ToSingle(data, index); index += 4; MyPlayer.players[tmpsyncid].SetPx(posx); } var b = zhou >> 1; if (b<<7 != 0) { float posy = BitConverter.ToSingle(data, index); index += 4; MyPlayer.players[tmpsyncid].SetPy(posy); } var c = zhou >> 2; if (c<<7 != 0) { float posz = BitConverter.ToSingle(data, index); index += 4; MyPlayer.players[tmpsyncid].SetPz(posz); } var d = zhou >> 3; if (d<<7 != 0) { float roty = BitConverter.ToSingle(data, index); index += 4; MyPlayer.players[tmpsyncid].SetRy(roty); } MyPlayer.players[tmpsyncid].ChangeOnce(); } } } } else if (e.IsText) { Debug.Log(string.Format("Receive: {0}", e.Data)); } } /// /// 发送给别人自己的位置 /// private void SendToOther() { //发送自己的位置 isSend = false; MyPlayer.Me.SendSyncAnyWay(); } /// /// 只发type /// /// private void SendOnlyType(int type) { SendByMain(BitConverter.GetBytes(type)); } /// /// 获取房间数据 /// public void GetData() { byte[] data = new byte[6]; Array.Copy(BitConverter.GetBytes(100), 0, data, 0, 4); Array.Copy(BitConverter.GetBytes(mySyncid), 0, data, 4, 2); SendByMain(data); } /// /// 发送心跳 /// private void SendPing() { byte[] senddata = new byte[6]; Array.Copy(BitConverter.GetBytes(105), 0, senddata, 0, 4); Array.Copy(BitConverter.GetBytes(mySyncid), 0, senddata, 4, 2); SendByMain(senddata); //Debug.Log("发送心跳"); } }