NetworkAnimPlayer.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using Mirror;
  5. using LitJson;
  6. using System;
  7. using UnityCommon;
  8. namespace DTYJ
  9. {
  10. /// <summary>
  11. /// 网络动画播放器
  12. /// </summary>
  13. public class NetworkAnimPlayer : NetworkBehaviour
  14. {
  15. public static NetworkAnimPlayer instance;
  16. private void Awake()
  17. {
  18. instance = this;
  19. }
  20. /// <summary>
  21. /// 普通一次性动画 电梯上下行、紧急停车按钮动画等
  22. /// </summary>
  23. /// <param name="path"></param>
  24. /// <param name="animName"></param>
  25. [Command(requiresAuthority = false)]
  26. public void CmdPlayAnim(string path, string animName)
  27. {
  28. RPCPlayAnim(path, animName);
  29. }
  30. [ClientRpc]
  31. public void RPCPlayAnim(string path, string animName)
  32. {
  33. var anim = GameObject.Find(path).GetComponent<Animation>();
  34. anim.Play(string.IsNullOrEmpty(animName) ? anim.name : animName);
  35. }
  36. #region 普通门的动画
  37. /// <summary>
  38. /// 记录门开关状态 string 动画路径 bool true - 开
  39. /// </summary>
  40. private Dictionary<string, bool> dicNormalAnimSwitch = new Dictionary<string, bool>();
  41. /// <summary>
  42. /// 普通开关动画 如:门等
  43. /// </summary>
  44. /// <param name="path"></param>
  45. /// <param name="animName"></param>
  46. [Command(requiresAuthority = false)]
  47. public void CmdPlayAnimNormalSwitch(string path_animName)
  48. {
  49. if (dicNormalAnimSwitch.ContainsKey(path_animName))
  50. dicNormalAnimSwitch[path_animName] = !dicNormalAnimSwitch[path_animName];
  51. else
  52. dicNormalAnimSwitch[path_animName] = true;
  53. RpcPlayAnimNormalSwitch(path_animName, dicNormalAnimSwitch[path_animName]);
  54. }
  55. [ClientRpc]
  56. public void RpcPlayAnimNormalSwitch(string path_animName, bool isOpen)
  57. {
  58. Debug.Log(path_animName + isOpen);
  59. var arr = path_animName.Split('|');
  60. var anim = GameObject.Find(arr[0]).GetComponent<Animation>();
  61. var animationName = arr[1];
  62. Debug.Log(anim);
  63. Debug.Log("animationName:" + animationName);
  64. Debug.Log(anim.clip.name);
  65. anim[animationName].time = isOpen ? 0 : anim[animationName].length;
  66. anim[animationName].speed = isOpen ? 1 : -1;
  67. anim[animationName].wrapMode = WrapMode.Once;
  68. anim.CrossFade(animationName);
  69. }
  70. [TargetRpc]
  71. public void RpcPlayAnimNormalSwitch_conn(NetworkConnection target, string path_animName, bool isOpen)
  72. {
  73. var arr = path_animName.Split('|');
  74. var anim = GameObject.Find(arr[0]).GetComponent<Animation>();
  75. var animationName = arr[1];
  76. anim[animationName].time = isOpen ? 0 : anim[animationName].length;
  77. anim[animationName].speed = isOpen ? 1 : -1;
  78. anim[animationName].wrapMode = WrapMode.Once;
  79. anim.CrossFade(animationName);
  80. }
  81. /// <summary>
  82. /// 同步门动画状态
  83. /// </summary>
  84. [Server]
  85. public void AsyncPlayAnimNormalSwitch(NetworkConnection target)
  86. {
  87. foreach (var item in dicNormalAnimSwitch)
  88. {
  89. RpcPlayAnimNormalSwitch_conn(target, item.Key, item.Value);
  90. }
  91. }
  92. #endregion
  93. #region 设置设备状态
  94. public void SendCmdToServer(int cmd, object obj)
  95. {
  96. var cmdData = new { cmd = cmd, data = obj };
  97. CmdSendCmdToServer(Newtonsoft.Json.JsonConvert.SerializeObject(cmdData));
  98. }
  99. /// <summary>
  100. /// 发送命令到协同服务器
  101. /// </summary>
  102. /// <param name="json"></param>
  103. [Command(requiresAuthority = false)]
  104. public void CmdSendCmdToServer(string json)
  105. {
  106. Debug.Log("发送消息到协同服务器:" + json);
  107. try
  108. {
  109. //CMDData cMDData = new CMDData();
  110. //cMDData.cmd = cmd;
  111. //cMDData.data = JsonMapper.ToObject(jsonData);
  112. //var json = JsonMapper.ToJson(cMDData);
  113. OnlineCtrl.Instance.SendCmdToServer(json);
  114. }
  115. catch (Exception e)
  116. {
  117. Debug.LogError(e.Message);
  118. }
  119. }
  120. //[Command(requiresAuthority = false)]
  121. //public void CmdSetEquipState(string equipType, int state_0, int state_2)
  122. //{
  123. // RpcSetEquipState(equipType, state_0, state_2);
  124. //}
  125. //[ClientRpc]
  126. //public void RpcSetEquipState(string equipType, int state_0, int state_2)
  127. //{
  128. //}
  129. #endregion
  130. #region 消息处理
  131. [Server]
  132. public void OnMsgReceived2(int cmd, JsonData obj)
  133. {
  134. string jsonStr = obj.ToJson();
  135. switch (cmd)
  136. {
  137. case 10101:
  138. TrainHandle(jsonStr);
  139. break;
  140. case 10105:
  141. TrainDoorHandle(jsonStr);
  142. break;
  143. case 10201:
  144. AFCGateMachine(jsonStr);
  145. break;
  146. case 10202:
  147. AFCTVM(jsonStr);
  148. break;
  149. case 10301:
  150. PlatformDoorClose(jsonStr);
  151. break;
  152. case 10302:
  153. PlatformDoorCtrl(jsonStr);
  154. break;
  155. case 10401:
  156. VerticalElevator(jsonStr);
  157. break;
  158. case 10402:
  159. Elevator(jsonStr);
  160. break;
  161. case 10501:
  162. KeLiu(jsonStr);
  163. break;
  164. case 10601:
  165. ShuiZai(jsonStr);
  166. break;
  167. default:
  168. break;
  169. }
  170. }
  171. //[Server]
  172. //public void OnMsgReceived(CMDData cmdData)
  173. //{
  174. //switch (cmdData.cmd)
  175. //{
  176. // case 10101:
  177. // TrainHandle(cmdData);
  178. // break;
  179. // case 10201:
  180. // AFCGateMachine(cmdData);
  181. // break;
  182. // case 10202:
  183. // AFCTVM(cmdData);
  184. // break;
  185. // case 10301:
  186. // PlatformDoorClose(cmdData);
  187. // break;
  188. // case 10302:
  189. // PlatformDoorCtrl(cmdData);
  190. // break;
  191. // case 10401:
  192. // VerticalElevator(cmdData);
  193. // break;
  194. // case 10402:
  195. // Elevator(cmdData);
  196. // break;
  197. // default:
  198. // break;
  199. //}
  200. //}
  201. #region 列车控制
  202. readonly Dictionary<string, TrainCtrl> dicTrains = new Dictionary<string, TrainCtrl>();
  203. public void TrainHandle(string jsonData)
  204. {
  205. var trainInfo = JsonMapper.ToObject<TrainInfo>(jsonData);
  206. //var trainInfo = cmdData.GetData<TrainInfo>();
  207. if (dicTrains.ContainsKey(trainInfo.trainNo))
  208. dicTrains[trainInfo.trainNo].MsgHandle(trainInfo);
  209. else
  210. {
  211. var prefabTrain = OnlineNetworkManager.singleton.spawnPrefabs[2];
  212. GameObject train = GameObject.Instantiate(prefabTrain);
  213. train.transform.position = Vector3.up * 1000 * dicTrains.Count;
  214. train.name = trainInfo.trainNo;
  215. NetworkServer.Spawn(train);
  216. //train.transform.position = Vector3.up * 1000 * dicTrains.Count;
  217. //train.name = trainInfo.trainNo;
  218. dicTrains[trainInfo.trainNo] = train.GetComponent<TrainCtrl>();
  219. dicTrains[trainInfo.trainNo].RpcSetName(trainInfo.trainNo);
  220. }
  221. }
  222. public void TrainDoorHandle(string jsonData)
  223. {
  224. TrainDoorState trainDoorState = JsonMapper.ToObject<TrainDoorState>(jsonData);
  225. RpcSetTrainDoor(trainDoorState.trainNo, trainDoorState.state);
  226. if (trainDoorState.state == 1)
  227. {
  228. if (TrainCtrl.trainStop_xiaxing == trainDoorState.trainNo)
  229. {
  230. OnlineCtrl.Instance.chengKeCtrl.ShangChe(2);
  231. OnlineCtrl.Instance.chengKeCtrl.XiaChe(trainDoorState.trainNo);
  232. }
  233. if (TrainCtrl.trainStop_shangxing == trainDoorState.trainNo)
  234. {
  235. OnlineCtrl.Instance.chengKeCtrl.ShangChe(1);
  236. OnlineCtrl.Instance.chengKeCtrl.XiaChe(trainDoorState.trainNo);
  237. }
  238. }
  239. }
  240. [ClientRpc]
  241. public void RpcSetTrainDoor(string trainNo, int doorState)
  242. {
  243. if (TrainCtrl.TrainCtrlDic.ContainsKey(trainNo))
  244. TrainCtrl.TrainCtrlDic[trainNo].TrainDoor(doorState);
  245. }
  246. #endregion
  247. /// <summary>
  248. /// 闸机控制
  249. /// </summary>
  250. /// <param name="cmdData"></param>
  251. public void AFCGateMachine(string jsonStr)
  252. {
  253. AFCZhaJi data = JsonMapper.ToObject<AFCZhaJi>(jsonStr);
  254. RpcAFCGateMachine(data.gateMachineNo, data.state, data.direction);
  255. }
  256. [ClientRpc]
  257. public void RpcAFCGateMachine(string gateMachineNo, int state, int dir)
  258. {
  259. ZhaJiCtrl.Instance.SetGateState(gateMachineNo, state, dir);
  260. }
  261. public void AFCTVM(string jsonStr)
  262. {
  263. AFCTVM data = JsonMapper.ToObject<AFCTVM>(jsonStr);
  264. RpcAFCTVM(data.tvmNo, data.state);
  265. }
  266. [ClientRpc]
  267. public void RpcAFCTVM(string tvmNo, int state)
  268. {
  269. TvmCtrl.Instance.SetTVM(tvmNo, state);
  270. }
  271. public void PlatformDoorClose(string jsonStr)
  272. {
  273. ZhanTaiMenSuoBi data = JsonMapper.ToObject<ZhanTaiMenSuoBi>(jsonStr);
  274. RpcPlatformDoorCtrl(data.platformDoorNo, data.state);
  275. }
  276. /// <summary>
  277. /// 单活动门控制状态
  278. /// </summary>
  279. /// <param name="cmdData"></param>
  280. public void PlatformDoorCtrl(string jsonStr)
  281. {
  282. //ZhanTaiMenKongZhi data = JsonMapper.ToObject<ZhanTaiMenKongZhi>(jsonStr);
  283. //RpcPlatformDoorCtrl(data.platformDoorNo, data.state);
  284. }
  285. [ClientRpc]
  286. public void RpcPlatformDoorCtrl(string platformDoorNo, int state)
  287. {
  288. PlatformDoorController.Instance.SetDoor(platformDoorNo, state);
  289. }
  290. public void VerticalElevator(string jsonStr) { }
  291. public void Elevator(string jsonStr)
  292. {
  293. DianFuTi data = JsonMapper.ToObject<DianFuTi>(jsonStr);
  294. RpcElevator(data.elevatorNo, data.state);
  295. }
  296. [ClientRpc]
  297. public void RpcElevator(string nnumber, int state)
  298. {
  299. DianFuTiCtrl.Instance.SetState(nnumber, state);
  300. }
  301. public void KeLiu(string jsonStr)
  302. {
  303. KeLiuData data = JsonMapper.ToObject<KeLiuData>(jsonStr);
  304. ControllerPanel.instance?.CmdSetJinZhanSpeed((int)data.speedOfEntry);
  305. }
  306. private void ShuiZai(string jsonStr)
  307. {
  308. ShuiZaiData data = JsonMapper.ToObject<ShuiZaiData>(jsonStr);
  309. ControllerPanel.instance?.CmdSetShuiZai(data.isTurnOn, (float)data.strength);
  310. }
  311. #endregion
  312. }
  313. }