ExecuteTrainUIView.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300
  1. using ProjectBase.Event;
  2. using ProjectBase.UI;
  3. using ShotSimulator.Event;
  4. using ShotSimulator.Train;
  5. using ShotSimulator.Train.Info;
  6. using System;
  7. using System.Collections;
  8. using System.Collections.Generic;
  9. using UnityEngine;
  10. using UnityEngine.Localization.Components;
  11. using UnityEngine.UI;
  12. namespace ShotSimulator.UI
  13. {
  14. public class ExecuteTrainUIView : BaseUIView
  15. {
  16. public Sprite[] countdownTex;
  17. public Image countdownImage;
  18. public GameObject countDownPanel;
  19. public GameObject trainingPanel;
  20. public JumpingNumberTextComponent score_JumpNumComponent;
  21. public Text precisionText;
  22. public Text timeText;
  23. public Text bulletNumsText;
  24. public GameObject pausePanel;
  25. public Button pauseButton;
  26. public Button replayButton;
  27. public Button continueButton;
  28. public Button exitButton;
  29. private GameObject current_ReloadTipObj;
  30. public GameObject reloadedTipObj;
  31. public GameObject emptyMagazineTipText;
  32. public GameObject ChamberEmptyTipObj;
  33. public GameObject emptyMagazineTipObj;
  34. public GameObject reloadingTipObj;
  35. public LocalizeStringEvent ReloadedTipLocalize;
  36. private BaseTrainHandle m_TrainHandle;
  37. private int bulletLowNums;
  38. protected override void InitUIObjects()
  39. {
  40. base.InitUIObjects();
  41. pauseButton.onClick.AddListener(OnPauseButtonClick);
  42. replayButton.onClick.AddListener(OnReplayButtonClick);
  43. continueButton.onClick.AddListener(OnContinueButtonClick);
  44. exitButton.onClick.AddListener(OnExitButtonClick);
  45. ReloadedTipLocalize.StringReference.Arguments = new object[1];
  46. }
  47. protected override void UpdateArguments(params object[] args)
  48. {
  49. base.UpdateArguments(args);
  50. m_TrainHandle = args[0] as BaseTrainHandle;
  51. }
  52. protected override void UpdateViewCallBack()
  53. {
  54. base.UpdateViewCallBack();
  55. bulletLowNums = m_TrainHandle.FirearmData.magazineCapacity / 5;
  56. }
  57. private void Update()
  58. {
  59. if (m_TrainHandle != null)
  60. {
  61. if (m_TrainHandle.IsRunning && !m_TrainHandle.IsPause)
  62. {
  63. if (m_TrainHandle.TrainInfo.finishType == TrainTaskFinishType.Time)
  64. {
  65. timeText.text = SecondToFormattedTime((int)m_TrainHandle.m_TaskTimer.remainingTime);
  66. }
  67. }
  68. }
  69. }
  70. private string SecondToFormattedTime(int seconds)
  71. {
  72. TimeSpan timeSpan = TimeSpan.FromSeconds(seconds);
  73. return timeSpan.ToString(@"mm\:ss");
  74. }
  75. protected override void OnShowCallBack()
  76. {
  77. base.OnShowCallBack();
  78. EventCenter.GetInstance().RegisterEvent(EventKey.OnTrainResultMetricsDataUpdated, OnTrainResultMetricsDataUpdated);
  79. EventCenter.GetInstance().RegisterEvent(EventKey.OnBulletNumsChanged, OnBulletNumsChanged);
  80. EventCenter.GetInstance().RegisterEvent(EventKey.OnMagazineStateChanged, OnMagazineStateChanged);
  81. EventCenter.GetInstance().RegisterEvent(EventKey.OnShootWitchEmptyBullets, OnShootWitchEmptyBullets);
  82. EventCenter.GetInstance().RegisterEvent(EventKey.OnShootWitchChamberEmpty, OnShootWitchChamberEmpty);
  83. EventCenter.GetInstance().RegisterEvent(EventKey.OnExecutingTrainDataUpdated, OnExecutingTrainDataUpdated);
  84. EventCenter.GetInstance().RegisterEvent(EventKey.OnChamberStateUpdated, OnChamberStateUpdated);
  85. countdownImage.sprite = countdownTex[countdownTex.Length - 1];
  86. countDownPanel.SetActive(true);
  87. trainingPanel.SetActive(true);
  88. pausePanel.SetActive(false);
  89. emptyMagazineTipText.SetActive(false);
  90. ChamberEmptyTipObj.SetActive(false);
  91. if (current_ReloadTipObj != null)
  92. {
  93. current_ReloadTipObj.SetActive(false);
  94. }
  95. score_JumpNumComponent.Init();
  96. precisionText.text = "N/A";
  97. switch (m_TrainHandle.TrainInfo.finishType)
  98. {
  99. case TrainTaskFinishType.Time:
  100. timeText.text = SecondToFormattedTime((int)m_TrainHandle.TrainInfo.duration);
  101. break;
  102. case TrainTaskFinishType.Number:
  103. timeText.text = string.Format("{0}/{1}", m_TrainHandle.TrainInfo.maxNumber, m_TrainHandle.TrainInfo.maxNumber);
  104. break;
  105. default:
  106. timeText.text = "-/-";
  107. break;
  108. }
  109. if (m_TrainHandle.TrainInfo.m_TrainFirearmConfig.isNeedConsumeBullet)
  110. {
  111. bulletNumsText.text = "-:-";
  112. }
  113. else
  114. {
  115. bulletNumsText.text = "¡Þ";
  116. }
  117. StartCoroutine(StartCountdown());
  118. }
  119. protected override void OnHideCallBack()
  120. {
  121. base.OnHideCallBack();
  122. EventCenter.GetInstance().UnregisterEvent(EventKey.OnTrainResultMetricsDataUpdated, OnTrainResultMetricsDataUpdated);
  123. EventCenter.GetInstance().UnregisterEvent(EventKey.OnBulletNumsChanged, OnBulletNumsChanged);
  124. EventCenter.GetInstance().UnregisterEvent(EventKey.OnMagazineStateChanged, OnMagazineStateChanged);
  125. EventCenter.GetInstance().UnregisterEvent(EventKey.OnShootWitchEmptyBullets, OnShootWitchEmptyBullets);
  126. EventCenter.GetInstance().UnregisterEvent(EventKey.OnShootWitchChamberEmpty, OnShootWitchChamberEmpty);
  127. EventCenter.GetInstance().UnregisterEvent(EventKey.OnExecutingTrainDataUpdated, OnExecutingTrainDataUpdated);
  128. EventCenter.GetInstance().UnregisterEvent(EventKey.OnChamberStateUpdated, OnChamberStateUpdated);
  129. }
  130. private IEnumerator StartCountdown()
  131. {
  132. for (int i = countdownTex.Length - 1; i >= 0; i--)
  133. {
  134. countdownImage.sprite = countdownTex[i];
  135. countdownImage.SetNativeSize();
  136. yield return new WaitForSeconds(1f);
  137. }
  138. countDownPanel.SetActive(false);
  139. TrainTaskLoader.GetInstance().StartTrainTask();
  140. }
  141. private void OnTrainResultMetricsDataUpdated(BaseEventData eventData)
  142. {
  143. TrainResultEventData data = eventData as TrainResultEventData;
  144. if (data != null)
  145. {
  146. switch (data.type)
  147. {
  148. case MetricsType.Score:
  149. OnScoreUpdated(data.value);
  150. break;
  151. case MetricsType.Precision:
  152. OnPrecisionUpdated(data.value);
  153. break;
  154. }
  155. }
  156. }
  157. private void OnScoreUpdated(double value)
  158. {
  159. score_JumpNumComponent.SetNum((int)value);
  160. }
  161. private void OnPrecisionUpdated(double value)
  162. {
  163. precisionText.text = value.ToString("P0");
  164. }
  165. private void OnBulletNumsChanged(BaseEventData eventData)
  166. {
  167. BulletNumsEventData data = eventData as BulletNumsEventData;
  168. if (data != null)
  169. {
  170. string color = data.magazineBulletNums <= bulletLowNums ? "red" : "white";
  171. bulletNumsText.text = string.Format("<color={0}>{1}</color>:{2}", color, data.magazineBulletNums, data.magazineCapacity);
  172. if (current_ReloadTipObj != null)
  173. {
  174. current_ReloadTipObj.gameObject.SetActive(false);
  175. }
  176. if (data.magazineBulletNums == 0)
  177. {
  178. current_ReloadTipObj = emptyMagazineTipObj;
  179. current_ReloadTipObj.SetActive(true);
  180. }
  181. }
  182. }
  183. private void OnChamberStateUpdated(BaseEventData eventData)
  184. {
  185. ChamberStateEventData data = eventData as ChamberStateEventData;
  186. if (data != null)
  187. {
  188. if (data.IsChambered)
  189. {
  190. ChamberEmptyTipObj.SetActive(false);
  191. }
  192. }
  193. }
  194. private void OnMagazineStateChanged(BaseEventData eventData)
  195. {
  196. MagazineStateEventData data = eventData as MagazineStateEventData;
  197. if (data != null)
  198. {
  199. if (current_ReloadTipObj != null)
  200. {
  201. current_ReloadTipObj.gameObject.SetActive(false);
  202. }
  203. switch (data.state)
  204. {
  205. case MagazineState.Separation:
  206. current_ReloadTipObj = reloadingTipObj;
  207. current_ReloadTipObj.SetActive(true);
  208. break;
  209. case MagazineState.ReLoad:
  210. StartCoroutine(ShowReloadedTip(data.reloadedTime));
  211. break;
  212. }
  213. }
  214. }
  215. private IEnumerator ShowReloadedTip(float reloadTime)
  216. {
  217. emptyMagazineTipText.SetActive(false);
  218. ReloadedTipLocalize.StringReference.Arguments[0] = reloadTime.ToString("F1");
  219. ReloadedTipLocalize.StringReference.RefreshString();
  220. current_ReloadTipObj = reloadedTipObj;
  221. current_ReloadTipObj.SetActive(true);
  222. yield return new WaitForSeconds(3f);
  223. current_ReloadTipObj.SetActive(false);
  224. }
  225. private void OnShootWitchEmptyBullets(BaseEventData eventData)
  226. {
  227. emptyMagazineTipText.SetActive(true);
  228. }
  229. private void OnShootWitchChamberEmpty(BaseEventData eventData)
  230. {
  231. ChamberEmptyTipObj.SetActive(true);
  232. }
  233. private void OnExecutingTrainDataUpdated(BaseEventData eventData)
  234. {
  235. ExecutingTrainEventData data = eventData as ExecutingTrainEventData;
  236. if (data != null)
  237. {
  238. if (m_TrainHandle.TrainInfo.finishType == TrainTaskFinishType.Number)
  239. {
  240. timeText.text = string.Format("{0}/{1}", data.currentNumber, data.maxNumber);
  241. }
  242. }
  243. }
  244. private void OnPauseButtonClick()
  245. {
  246. TrainTaskLoader.GetInstance().SetContinueOrPauseTrain(true);
  247. pausePanel.SetActive(true);
  248. }
  249. private void OnReplayButtonClick()
  250. {
  251. TrainTaskLoader.GetInstance().ReStartTrain();
  252. }
  253. private void OnContinueButtonClick()
  254. {
  255. TrainTaskLoader.GetInstance().SetContinueOrPauseTrain(false);
  256. pausePanel.SetActive(false);
  257. }
  258. private void OnExitButtonClick()
  259. {
  260. TrainTaskLoader.GetInstance().FinishTrain();
  261. }
  262. }
  263. }