123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.Linq;
- using UnityEngine;
- using MultiDup;
- public class MultiBattleProxy : MonoSingleton<MultiBattleProxy>
- {
- public enum State
- {
- /// <summary>
- /// 未连接,需要初始化(后自动连接)
- /// </summary>
- UnConnected = 0,
- /// <summary>
- /// 已连接, 需要登录
- /// </summary>
- Connected = 1,
- /// <summary>
- /// 已完成登录(并自动进入组队)
- /// </summary>
- Logined = 2,
- /// <summary>
- /// 离开房间, 不可以继续上报位置同步和状态信息
- /// </summary>
- Leaved = 3
- }
- TasPBSocketManager battleSocket; // 战斗 socket
- /// <summary>
- /// 当前状态, Logined状态为正常状态,其他状态战场逻辑不可以用
- /// </summary>
- public State CurrentState { get; private set; } = State.UnConnected;
- /// <summary>
- /// 队友列表
- /// </summary>
- public List<string> PlayerList = new List<string>();
- public MultiBattleProxy() {
-
- }
- public void Init(string ip, int port)
- {
- _close();
- battleSocket = new TasPBSocketManager();
- battleSocket.Connect(ip, port);
- // 挂载 服务端消息回调处理函数
- MessageCenter.Instance.addObsever(eProtocalCommand.ScBtLogin, _SCLogin); // 登录返回消息
- MessageCenter.Instance.addObsever(eProtocalCommand.ScBtPeopleList, _PeopleList); // 查询队友返回
- MessageCenter.Instance.addObsever(eProtocalCommand.ScBtPostion, _Position); // 位置更新通知
- MessageCenter.Instance.addObsever(eProtocalCommand.ScBtStatus, _Status); // 状态更新通知
- MessageCenter.Instance.addObsever(eProtocalCommand.ScBtBroadCast, _BroadCast); // 广播消息
- // MessageCenter.Instance.addObsever(eProtocalCommand.ScMdLeaveRoom, On_LeaveGame);
- battleSocket.OnDisconnected = () =>
- {
- LogHelper.Log("与战斗服务端的连接已断开!");
- this._close();
- };
- battleSocket.OnConnected = () =>
- {
- this.CurrentState = State.Connected;
- // Login(); // 连接好后自动进行信息提交
- };
- }
- public Action On_PepoleLogin;
- public Action<SC_BT_PeopleList> On_PeopleList;
- public Action<SC_BT_Status> On_BTStatus;
- public Action<SC_BT_Position> On_UpdatePosition;
- public Action<SC_BT_BroadCast> On_BroadCast;
- //public Action On_PepoleLeave;
- //public Action On_BattleOver;
- public void Login()
- {
- if (CurrentState == State.Connected)
- {
- var p = UserProxy.Instance.player;
- var msg = new CS_BT_Login() { Uid = p.uid, Zoneid = p.zoneid, Msg = "登录战斗服务" };
- battleSocket.SendMsg(eProtocalCommand.CsBtLogin, msg);
- LogHelper.Log("多人副本,向战斗服务器发送登录请求");
- }
- }
- public void GetPeopleList()
- {
- if (CurrentState == State.Logined)
- {
- var p = UserProxy.Instance.player;
- var msg = new CS_BT_PeopleList() { Uid = p.uid, Zoneid = p.zoneid };
- battleSocket.SendMsg(eProtocalCommand.CsBtPeopleList, msg);
- LogHelper.Log("多人副本,向战斗服务器发送队友列表请求");
- }
- else
- {
- LogHelper.LogError("多人副本,当前状态不可发送此消息!");
- }
- }
- public void BroadCast(string msg)
- {
- if (CurrentState == State.Logined)
- {
- var p = UserProxy.Instance.player;
- var _msg = new CS_BT_BroadCast() { SenderUid = p.uid, Zoneid = p.zoneid, Msg = msg };
- battleSocket.SendMsg(eProtocalCommand.CsBtBroadCast, _msg);
- LogHelper.Log("多人副本, 战场内发送广播消息." + msg);
- }
- else
- {
- LogHelper.LogError("多人副本,当前状态不可发送广播消息!");
- }
- }
- public void SendStatus(string propertiName, string value)
- {
- if (CurrentState == State.Logined)
- {
- var p = UserProxy.Instance.player;
- var _msg = new CS_BT_Status() { SenderUid = p.uid, Zoneid = p.zoneid, PropertyName = propertiName, Value = value };
- battleSocket.SendMsg(eProtocalCommand.CsBtStatus, _msg);
- LogHelper.Log($" 战场内发送状态更新消息. [{propertiName}:{value}] ");
- }
- else
- {
- LogHelper.LogError("多人副本,当前状态不可发送状态更新消息!");
- }
- }
- public void SendPostion(float x, float y, float z)
- {
- if (CurrentState == State.Logined)
- {
- var p = UserProxy.Instance.player;
- var _msg = new CS_BT_Position() { SenderUid = p.uid, Zoneid = p.zoneid, X = x, Y = y, Z = z };
- battleSocket.SendMsg(eProtocalCommand.CsBtPosition, _msg);
- LogHelper.Log($" 战场内发送位置更新消息. ");
- }
- else
- {
- LogHelper.LogError("多人副本,当前状态不可发送位置更新消息!");
- }
- }
- #region 接收消息回调
- private void _SCLogin(byte[] _data)
- {
- var msg = SC_BT_Login.Parser.ParseFrom(_data);
- var ok = int.TryParse(msg.Msg, out var roomId);
- Debug.Log(ok ? "战斗服务器登录成功!" : msg.Msg);
- if (ok)
- {
- this.CurrentState = State.Logined;
- }
- this.On_PepoleLogin?.Invoke(); // 这个基本么有必要关注
- }
- private void _PeopleList(byte[] _data)
- {
- var msg = SC_BT_PeopleList.Parser.ParseFrom(_data);
- Debug.Log("刷新队友列表!\n 新进:" + msg.NewerUid ?? "");
- this.PlayerList = msg.PlayerUids.ToList(); // 更新队友列表
- this.On_PeopleList?.Invoke(msg);
- }
- private void _Status(byte[] _data)
- {
- var msg = SC_BT_Status.Parser.ParseFrom(_data);
- Debug.Log("收到状态更新消息");
- this.On_BTStatus?.Invoke(msg);
- }
- private void _Position(byte[] _data)
- {
- var msg = SC_BT_Position.Parser.ParseFrom(_data);
- Debug.Log("收到位置更新消息");
- this.On_UpdatePosition?.Invoke(msg);
- }
- private void _BroadCast(byte[] _data)
- {
- var msg = SC_BT_BroadCast.Parser.ParseFrom(_data);
- Debug.Log("收到广播消息");
- this.On_BroadCast?.Invoke(msg);
- }
- #endregion
- public void _close()
- {
- MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtLogin, _SCLogin); // 登录返回消息
- MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtPeopleList, _PeopleList); // 查询队友返回
- MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtPostion, _Position); // 位置更新通知
- MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtStatus, _Status); // 状态更新通知
- MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtBroadCast, _BroadCast); // 广播消息
- // MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdLeaveRoom, On_LeaveGame);
- if (null != battleSocket)
- {
- LogHelper.Log("销毁battleSocket");
- battleSocket.Close();
- battleSocket = null;
- }
- }
- #region
- public void Update()
- {
- battleSocket?.Update();
- }
- private void OnDisable()
- {
- _close();
- }
- protected override void DoOnDestroy()
- {
- _close();
- }
- #endregion
- }
|