UIMainMenu.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. using GFMain;
  2. using System;
  3. using System.Collections;
  4. using System.Collections.Generic;
  5. using UnityCommon;
  6. using UnityEngine;
  7. using UnityEngine.Events;
  8. using UnityEngine.UI;
  9. using UnityGameFramework.Runtime;
  10. namespace DTYJ
  11. {
  12. public class UIMainMenu : UIFormLogic
  13. {
  14. protected override void OnInit(object userData)
  15. {
  16. base.OnInit(userData);
  17. InitRoleSelect();
  18. Init浮动菜单();
  19. goHelpPanel.SetActive(false);
  20. //InitPositionJump();
  21. }
  22. private void Update()
  23. {
  24. Update_View();
  25. Update_FloatMenu();
  26. }
  27. #region 角色选择
  28. public GameObject goPane_角色选择;
  29. public Toggle toggle值班站长, toggle车站值班员, toggle站务员_站台, toggle站务员_站厅;
  30. void InitRoleSelect()
  31. {
  32. toggle值班站长.isOn = toggle车站值班员.isOn = toggle站务员_站台.isOn = false;
  33. toggle值班站长.onValueChanged.AddListener((v) => { OnToggleRole_Role(RoleName.值班站长, v); });
  34. toggle车站值班员.onValueChanged.AddListener((v) => { OnToggleRole_Role(RoleName.车站值班员, v); });
  35. toggle站务员_站台.onValueChanged.AddListener((v) => { OnToggleRole_Role(RoleName.站务员_站台, v); });
  36. toggle站务员_站厅.onValueChanged.AddListener((v) => { OnToggleRole_Role(RoleName.站务员_站厅, v); });
  37. SetToggleState(toggle站务员_站台, Main.Instance.onlineNetwork.networkManager.mode == Mirror.NetworkManagerMode.Host);
  38. Show角色选择面板(false);
  39. }
  40. RoleName roleSelected = 0;
  41. public void OnToggleRole_Role(RoleName roleName, bool value)
  42. {
  43. if (value) roleSelected = roleName;
  44. else roleSelected = 0;
  45. }
  46. bool isMan = true;
  47. public void OnDropdownGender(int index)
  48. {
  49. isMan = index == 0;
  50. }
  51. public void OnClickConfirmRole()
  52. {
  53. if (roleSelected == 0) MainEntry.CommonUI.messageBox.ShowMessage("请选择角色!");
  54. else OnlineCtrl.Instance.SelecteRoleName(roleSelected, isMan);
  55. }
  56. RoleName roleList = 0;
  57. public void SetRoleSelected(RoleName roleName)
  58. {
  59. roleList = roleName;
  60. SetToggleState(toggle值班站长, (roleList & RoleName.值班站长) == RoleName.值班站长);
  61. SetToggleState(toggle车站值班员, (roleList & RoleName.车站值班员) == RoleName.车站值班员);
  62. //SetToggleState(toggle站务员_站台, (roleList & RoleName.站务员_站台) == RoleName.站务员_站台);
  63. SetToggleState(toggle站务员_站台, Main.Instance.onlineNetwork.networkManager.mode == Mirror.NetworkManagerMode.Host || (roleList & RoleName.站务员_站台) == RoleName.站务员_站台);
  64. SetToggleState(toggle站务员_站厅, (roleList & RoleName.站务员_站厅) == RoleName.站务员_站厅);
  65. }
  66. private void SetToggleState(Toggle toggle, bool isSelected)
  67. {
  68. if (toggle.isOn && isSelected)
  69. toggle.isOn = false;
  70. toggle.interactable = !isSelected;
  71. }
  72. public void Show角色选择面板(bool value)
  73. {
  74. goPane_角色选择.SetActive(value);
  75. if (value)
  76. {
  77. SetRoleSelected(roleList);
  78. }
  79. }
  80. #endregion
  81. #region 视角返回
  82. public GameObject goPane_视角返回;
  83. private void Update_View()
  84. {
  85. if (MainEntry.CameraCtrl?.cameraStateCurrent != null)
  86. {
  87. goPane_视角返回.SetActive(MainEntry.CameraCtrl.cameraStateCurrent is MotionlessState);
  88. if (MainEntry.CameraCtrl.cameraStateCurrent is MotionlessState)
  89. {
  90. if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.D) || Input.GetMouseButtonDown(1))
  91. {
  92. OnClick视角返回();
  93. }
  94. }
  95. }
  96. }
  97. public void OnClick视角返回()
  98. {
  99. MainEntry.CameraCtrl?.ToPreCamerastate();
  100. CloseFloatMenu();
  101. }
  102. #endregion
  103. #region 浮动菜单
  104. public GameObject goPanel_浮动菜单;
  105. private GameObject floatMenuItemOrig;
  106. private readonly List<GameObject> floatMenuItems = new List<GameObject>();
  107. private Text textTitle;
  108. private void Init浮动菜单()
  109. {
  110. goPanel_浮动菜单.transform.GetChild(0).GetChild(1).GetComponent<Button>().onClick.AddListener(OnClickCloseFloatMenu);
  111. textTitle = goPanel_浮动菜单.transform.GetChild(0).GetChild(0).GetComponent<Text>();
  112. floatMenuItemOrig = goPanel_浮动菜单.transform.GetChild(0).GetChild(2).gameObject;
  113. floatMenuItemOrig.SetActive(false);
  114. CloseFloatMenu();
  115. }
  116. private void Update_FloatMenu()
  117. {
  118. if (goPanel_浮动菜单.activeSelf)
  119. {
  120. if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.D) || Input.GetMouseButtonDown(1))
  121. {
  122. CloseFloatMenu();
  123. }
  124. }
  125. }
  126. private void OnClickCloseFloatMenu()
  127. {
  128. CloseFloatMenu();
  129. }
  130. public void ShowFloatMenu(string title, string[] listItems, Action<string> callback)
  131. {
  132. textTitle.text = title;
  133. CleatAllItems();
  134. for (int i = 0; i < listItems.Length; i++)
  135. {
  136. var item = listItems[i];
  137. var goNew = Instantiate(floatMenuItemOrig, floatMenuItemOrig.transform.parent);
  138. goNew.SetActive(true);
  139. var btn = goNew.GetComponent<Button>();
  140. btn.GetComponentInChildren<Text>().text = item;
  141. btn.onClick.AddListener(() =>
  142. {
  143. callback?.Invoke(item);
  144. CloseFloatMenu();
  145. });
  146. floatMenuItems.Add(goNew);
  147. }
  148. ShowFloatMenuPanel();
  149. }
  150. private void CloseFloatMenu()
  151. {
  152. CleatAllItems();
  153. goPanel_浮动菜单.SetActive(false);
  154. }
  155. private void CleatAllItems()
  156. {
  157. for (int i = 0; i < floatMenuItems.Count; i++)
  158. {
  159. Destroy(floatMenuItems[i]);
  160. }
  161. floatMenuItems.Clear();
  162. }
  163. private void ShowFloatMenuPanel()
  164. {
  165. goPanel_浮动菜单.transform.GetChild(0).position = Input.mousePosition;
  166. goPanel_浮动菜单.SetActive(true);
  167. }
  168. #endregion
  169. #region 帮助文档
  170. public GameObject goHelpPanel;
  171. public void OnClickHelp()
  172. {
  173. goHelpPanel.SetActive(!goHelpPanel.activeSelf);
  174. }
  175. #endregion
  176. public void OnClickQuitApp()
  177. {
  178. if (goPane_角色选择.activeSelf)
  179. {
  180. MainEntry.CommonUI.messageBox.ShowMessage("退出当前系统?", MessageBoxParams.MessageType.ConfirmCancel, (v) =>
  181. {
  182. if (v == MessageBoxParams.ResultType.Confirm)
  183. Application.Quit();
  184. });
  185. }
  186. else
  187. {
  188. MainEntry.CommonUI.messageBox.ShowMessage("返回登录界面?", MessageBoxParams.MessageType.ConfirmCancel, (v) =>
  189. {
  190. if (v == MessageBoxParams.ResultType.Confirm)
  191. {
  192. MainEntry.CameraCtrl.ToNone();
  193. OnlineCtrl.Instance.RoleQuit();
  194. goPane_角色选择.SetActive(true);
  195. }
  196. });
  197. }
  198. }
  199. public GameObject goBtnOrig;
  200. //private List<string> listPostions = new List<string>() { "1出口", "2出口" };
  201. List<string> zhanwuyuanList = new List<string>() { "站台A端", "站台B端" };
  202. private Dictionary<string, GameObject> dicBtnJump = new Dictionary<string, GameObject>();
  203. public void ClearPositionJump()
  204. {
  205. foreach(var item in dicBtnJump.Values)
  206. {
  207. DestroyImmediate(item.gameObject);
  208. }
  209. dicBtnJump.Clear();
  210. }
  211. public void InitPositionJump()
  212. {
  213. goBtnOrig.SetActive(false);
  214. Transform tfRoot = GameObject.Find("快速定位").transform;
  215. for (int i = 0; i < tfRoot.childCount; ++i)
  216. {
  217. var tfP = tfRoot.GetChild(i).transform;
  218. var btnName = tfP.name;
  219. if (OnlineCtrl.Instance.mineRoleName == RoleName.站务员_站台)
  220. {//限制站台站务员跳转的位置,因为水灾上下层进行了区分的
  221. if (!zhanwuyuanList.Contains(btnName)) continue;
  222. }
  223. else
  224. {
  225. if (zhanwuyuanList.Contains(btnName)) continue;
  226. }
  227. var btnNew = Instantiate(goBtnOrig, goBtnOrig.transform.parent);
  228. btnNew.SetActive(true);
  229. btnNew.GetComponentInChildren<Text>().text = btnName;
  230. btnNew.GetComponent<Button>().onClick.AddListener(() =>
  231. {
  232. try
  233. {
  234. Player.localPlayer?.SetPosition(tfP);
  235. if (!(MainEntry.CameraCtrl.cameraStateCurrent is CinemachineState))
  236. MainEntry.CameraCtrl.ToCinemachine();
  237. }
  238. catch { }
  239. });
  240. dicBtnJump[btnName] = btnNew;
  241. }
  242. foreach (var t in TrainCtrl.TrainCtrlDic)
  243. {
  244. AddTrainJumpPosition(t.Value.myTrainNo);
  245. }
  246. }
  247. private Dictionary<string, GameObject> dicBtnTrainJump = new Dictionary<string, GameObject>();
  248. public void AddTrainJumpPosition(string trainNo)
  249. {
  250. if (dicBtnTrainJump.ContainsKey(trainNo)) return;
  251. var btnNew = Instantiate(goBtnOrig, goBtnOrig.transform.parent);
  252. btnNew.SetActive(true);
  253. btnNew.GetComponentInChildren<Text>().text = "列车:" + trainNo;
  254. btnNew.GetComponent<Button>().onClick.AddListener(() =>
  255. {
  256. try
  257. {
  258. if (TrainCtrl.TrainCtrlDic.ContainsKey(trainNo))
  259. {
  260. var tfView = TrainCtrl.TrainCtrlDic[trainNo].transform.Find("TrainHeadView");
  261. if (tfView != null)
  262. MainEntry.CameraCtrl.ToFollow(tfView);
  263. }
  264. }
  265. catch { }
  266. });
  267. dicBtnTrainJump[trainNo] = btnNew;
  268. }
  269. public void DeleteTrainJumpBnt(string trainNo)
  270. {
  271. if (dicBtnTrainJump.ContainsKey(trainNo))
  272. {
  273. DestroyImmediate(dicBtnTrainJump[trainNo].gameObject);
  274. dicBtnTrainJump.Remove(trainNo);
  275. }
  276. }
  277. }
  278. }