MultiBattleProxy.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using UnityEngine;
  6. using MultiDup;
  7. public class MultiBattleProxy : MonoSingleton<MultiBattleProxy>
  8. {
  9. public enum State
  10. {
  11. /// <summary>
  12. /// 未连接,需要初始化(后自动连接)
  13. /// </summary>
  14. UnConnected = 0,
  15. /// <summary>
  16. /// 已连接, 需要登录
  17. /// </summary>
  18. Connected = 1,
  19. /// <summary>
  20. /// 已完成登录(并自动进入组队)
  21. /// </summary>
  22. Logined = 2,
  23. /// <summary>
  24. /// 离开房间, 不可以继续上报位置同步和状态信息
  25. /// </summary>
  26. Leaved = 3
  27. }
  28. TasPBSocketManager battleSocket; // 战斗 socket
  29. /// <summary>
  30. /// 当前状态, Logined状态为正常状态,其他状态战场逻辑不可以用
  31. /// </summary>
  32. public State CurrentState { get; private set; } = State.UnConnected;
  33. /// <summary>
  34. /// 队友列表
  35. /// </summary>
  36. public List<string> PlayerList = new List<string>();
  37. public MultiBattleProxy() {
  38. }
  39. public void Init(string ip, int port)
  40. {
  41. _close();
  42. battleSocket = new TasPBSocketManager();
  43. battleSocket.Connect(ip, port);
  44. // 挂载 服务端消息回调处理函数
  45. MessageCenter.Instance.addObsever(eProtocalCommand.ScBtLogin, _SCLogin); // 登录返回消息
  46. MessageCenter.Instance.addObsever(eProtocalCommand.ScBtPeopleList, _PeopleList); // 查询队友返回
  47. MessageCenter.Instance.addObsever(eProtocalCommand.ScBtPostion, _Position); // 位置更新通知
  48. MessageCenter.Instance.addObsever(eProtocalCommand.ScBtStatus, _Status); // 状态更新通知
  49. MessageCenter.Instance.addObsever(eProtocalCommand.ScBtBroadCast, _BroadCast); // 广播消息
  50. // MessageCenter.Instance.addObsever(eProtocalCommand.ScMdLeaveRoom, On_LeaveGame);
  51. battleSocket.OnDisconnected = () =>
  52. {
  53. LogHelper.Log("与战斗服务端的连接已断开!");
  54. this._close();
  55. };
  56. battleSocket.OnConnected = () =>
  57. {
  58. this.CurrentState = State.Connected;
  59. // Login(); // 连接好后自动进行信息提交
  60. };
  61. }
  62. public Action On_PepoleLogin;
  63. public Action<SC_BT_PeopleList> On_PeopleList;
  64. public Action<SC_BT_Status> On_BTStatus;
  65. public Action<SC_BT_Position> On_UpdatePosition;
  66. public Action<SC_BT_BroadCast> On_BroadCast;
  67. //public Action On_PepoleLeave;
  68. //public Action On_BattleOver;
  69. public void Login()
  70. {
  71. if (CurrentState == State.Connected)
  72. {
  73. var p = UserProxy.Instance.player;
  74. var msg = new CS_BT_Login() { Uid = p.uid, Zoneid = p.zoneid, Msg = "登录战斗服务" };
  75. battleSocket.SendMsg(eProtocalCommand.CsBtLogin, msg);
  76. LogHelper.Log("多人副本,向战斗服务器发送登录请求");
  77. }
  78. }
  79. public void GetPeopleList()
  80. {
  81. if (CurrentState == State.Logined)
  82. {
  83. var p = UserProxy.Instance.player;
  84. var msg = new CS_BT_PeopleList() { Uid = p.uid, Zoneid = p.zoneid };
  85. battleSocket.SendMsg(eProtocalCommand.CsBtPeopleList, msg);
  86. LogHelper.Log("多人副本,向战斗服务器发送队友列表请求");
  87. }
  88. else
  89. {
  90. LogHelper.LogError("多人副本,当前状态不可发送此消息!");
  91. }
  92. }
  93. public void BroadCast(string msg)
  94. {
  95. if (CurrentState == State.Logined)
  96. {
  97. var p = UserProxy.Instance.player;
  98. var _msg = new CS_BT_BroadCast() { SenderUid = p.uid, Zoneid = p.zoneid, Msg = msg };
  99. battleSocket.SendMsg(eProtocalCommand.CsBtBroadCast, _msg);
  100. LogHelper.Log("多人副本, 战场内发送广播消息." + msg);
  101. }
  102. else
  103. {
  104. LogHelper.LogError("多人副本,当前状态不可发送广播消息!");
  105. }
  106. }
  107. public void SendStatus(string propertiName, string value)
  108. {
  109. if (CurrentState == State.Logined)
  110. {
  111. var p = UserProxy.Instance.player;
  112. var _msg = new CS_BT_Status() { SenderUid = p.uid, Zoneid = p.zoneid, PropertyName = propertiName, Value = value };
  113. battleSocket.SendMsg(eProtocalCommand.CsBtStatus, _msg);
  114. LogHelper.Log($" 战场内发送状态更新消息. [{propertiName}:{value}] ");
  115. }
  116. else
  117. {
  118. LogHelper.LogError("多人副本,当前状态不可发送状态更新消息!");
  119. }
  120. }
  121. public void SendPostion(float x, float y, float z)
  122. {
  123. if (CurrentState == State.Logined)
  124. {
  125. var p = UserProxy.Instance.player;
  126. var _msg = new CS_BT_Position() { SenderUid = p.uid, Zoneid = p.zoneid, X = x, Y = y, Z = z };
  127. battleSocket.SendMsg(eProtocalCommand.CsBtPosition, _msg);
  128. LogHelper.Log($" 战场内发送位置更新消息. ");
  129. }
  130. else
  131. {
  132. LogHelper.LogError("多人副本,当前状态不可发送位置更新消息!");
  133. }
  134. }
  135. #region 接收消息回调
  136. private void _SCLogin(byte[] _data)
  137. {
  138. var msg = SC_BT_Login.Parser.ParseFrom(_data);
  139. var ok = int.TryParse(msg.Msg, out var roomId);
  140. Debug.Log(ok ? "战斗服务器登录成功!" : msg.Msg);
  141. if (ok)
  142. {
  143. this.CurrentState = State.Logined;
  144. }
  145. this.On_PepoleLogin?.Invoke(); // 这个基本么有必要关注
  146. }
  147. private void _PeopleList(byte[] _data)
  148. {
  149. var msg = SC_BT_PeopleList.Parser.ParseFrom(_data);
  150. Debug.Log("刷新队友列表!\n 新进:" + msg.NewerUid ?? "");
  151. this.PlayerList = msg.PlayerUids.ToList(); // 更新队友列表
  152. this.On_PeopleList?.Invoke(msg);
  153. }
  154. private void _Status(byte[] _data)
  155. {
  156. var msg = SC_BT_Status.Parser.ParseFrom(_data);
  157. Debug.Log("收到状态更新消息");
  158. this.On_BTStatus?.Invoke(msg);
  159. }
  160. private void _Position(byte[] _data)
  161. {
  162. var msg = SC_BT_Position.Parser.ParseFrom(_data);
  163. Debug.Log("收到位置更新消息");
  164. this.On_UpdatePosition?.Invoke(msg);
  165. }
  166. private void _BroadCast(byte[] _data)
  167. {
  168. var msg = SC_BT_BroadCast.Parser.ParseFrom(_data);
  169. Debug.Log("收到广播消息");
  170. this.On_BroadCast?.Invoke(msg);
  171. }
  172. #endregion
  173. public void _close()
  174. {
  175. MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtLogin, _SCLogin); // 登录返回消息
  176. MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtPeopleList, _PeopleList); // 查询队友返回
  177. MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtPostion, _Position); // 位置更新通知
  178. MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtStatus, _Status); // 状态更新通知
  179. MessageCenter.Instance.removeObserver(eProtocalCommand.ScBtBroadCast, _BroadCast); // 广播消息
  180. // MessageCenter.Instance.removeObserver(eProtocalCommand.ScMdLeaveRoom, On_LeaveGame);
  181. if (null != battleSocket)
  182. {
  183. LogHelper.Log("销毁battleSocket");
  184. battleSocket.Close();
  185. battleSocket = null;
  186. }
  187. }
  188. #region
  189. public void Update()
  190. {
  191. battleSocket?.Update();
  192. }
  193. private void OnDisable()
  194. {
  195. _close();
  196. }
  197. protected override void DoOnDestroy()
  198. {
  199. _close();
  200. }
  201. #endregion
  202. }