GameUI.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. using UnityEngine.UI;
  5. using DG.Tweening;
  6. namespace DuckHunter
  7. {
  8. public class GameUI : MonoBehaviour
  9. {
  10. [SerializeField] Text textScore;
  11. [SerializeField] Text textScoreBest;
  12. [SerializeField] Text textHitScore;
  13. [SerializeField] Button btnReset;
  14. [SerializeField] Button btnAim;
  15. [SerializeField] Button btnCrosshair;
  16. [SerializeField] Button btnBack;
  17. [SerializeField] Button btnCalibrationOffset;
  18. [SerializeField] RectTransform duckForGameStart;
  19. [SerializeField] GameObject textGameOver;
  20. [SerializeField] GameObject textGameCompleted;
  21. [SerializeField] GameObject bottomBox;
  22. [SerializeField] Slider levelSlider;
  23. [SerializeField] Material outlight;
  24. public static GameUI Instance;
  25. void Awake()
  26. {
  27. Instance = this;
  28. btnReset.onClick.AddListener(() =>
  29. {
  30. AudioManager.Instance.PlayBtn();
  31. UnityEngine.SceneManagement.SceneManager.LoadScene("DuckHunter");
  32. });
  33. if (GlobalData.MyDeviceMode == DeviceMode.Gun || BluetoothAim.ins && BluetoothAim.ins.isMainConnectToInfraredDevice())
  34. {
  35. btnAim.gameObject.SetActive(false);
  36. btnCrosshair.gameObject.SetActive(true);
  37. //获取设置值和一个存储值
  38. bool onInitOpen = InfraredDemo._ins ? InfraredDemo._ins.bInitCrosshairShow() : true;
  39. Image crossHairImage = btnCrosshair.GetComponentInChildren<Image>();
  40. crossHairImage.material = onInitOpen ? outlight : null;
  41. btnCrosshair.onClick.AddListener(delegate () {
  42. AudioManager.Instance.PlayBtn();
  43. bool onlyShow = !CrossHair.Instance.GetOnlyShow();
  44. CrossHair.Instance.SetOnlyShow(onlyShow);
  45. //记录准心值
  46. if (InfraredDemo._ins) InfraredDemo._ins.setCrosshairValue(onlyShow);
  47. if (onlyShow)
  48. {
  49. crossHairImage.material = outlight;
  50. }
  51. else
  52. {
  53. crossHairImage.material = null;
  54. }
  55. });
  56. //校准
  57. btnCalibrationOffset.gameObject.SetActive(true);
  58. btnCalibrationOffset.onClick.AddListener(delegate () {
  59. AudioMgr.ins.PlayBtn();
  60. SmartBowController.Instance.ResetAim();
  61. });
  62. }
  63. else {
  64. btnAim.gameObject.SetActive(true);
  65. btnAim.onClick.AddListener(() =>
  66. {
  67. if (btnAim.GetComponent<LongPressMonitor>().isLongPress) return;
  68. AudioManager.Instance.PlayBtn();
  69. SmartBowController.Instance.ResetAim();
  70. });
  71. btnAim.gameObject.AddComponent<LongPressMonitor>().onLongPress += () =>
  72. {
  73. AudioManager.Instance.PlayBtn();
  74. if (SB_EventSystem.ins) SB_EventSystem.ins.AwakenSimulateMouse();
  75. };
  76. }
  77. btnBack.onClick.AddListener(() => {
  78. AudioManager.Instance.PlayBtn();
  79. // UnityEngine.SceneManagement.SceneManager.LoadScene("Home", UnityEngine.SceneManagement.LoadSceneMode.Single);
  80. //野鸭退出时候操作一次分数
  81. Debug.Log("野鸭btnBack上传的积分:" );
  82. GameManager.Instance.onUploadScore();
  83. //结束游戏页面
  84. GameManager.Instance.userGameAnalyse1.showResultView(() => {
  85. UnityEngine.SceneManagement.SceneManager.LoadScene("Home", UnityEngine.SceneManagement.LoadSceneMode.Single);
  86. });
  87. });
  88. InitLevelSlider();
  89. levelSlider.onValueChanged.AddListener(OnLevelSliderUpdate);
  90. //根据模式切换图标
  91. tempRTF = GlobalData.MyDeviceMode == DeviceMode.Archery ? arrowsRTF : bulletRTF;
  92. tempRTF.gameObject.SetActive(true);
  93. }
  94. void OnDestroy()
  95. {
  96. if (Instance == this) Instance = null;
  97. DOTween.KillAll(false);
  98. }
  99. // Update is called once per frame
  100. void Update()
  101. {
  102. GameManager gm = GameManager.Instance;
  103. if (!gm) return;
  104. // int t = (int)(Time.time - startTime);
  105. // int m = t / 60;
  106. // int s = t % 60;
  107. // string mStr = m < 10 ? "0" + m : m.ToString();
  108. // string sStr = s < 10 ? "0" + s : s.ToString();
  109. // textTime.text = $"{mStr}:{sStr}";
  110. }
  111. void InitLevelSlider()
  112. {
  113. RenderLevelSliderText();
  114. levelSlider.SetValueWithoutNotify(GameManager.Instance.level);
  115. }
  116. void OnLevelSliderUpdate(float v)
  117. {
  118. GameManager.DefaultLevel = GameManager.Instance.level = (int)v;
  119. RenderLevelSliderText();
  120. }
  121. void RenderLevelSliderText()
  122. {
  123. var tal2 = levelSlider.transform.Find("Text").GetComponent<TextAutoLanguage2>();
  124. tal2.textFormatArgs = new object[] { GameManager.Instance.level };
  125. tal2.ApplyToText();
  126. }
  127. int _renderHitScore = 0;
  128. Tween _sequenceRenderHitScore;
  129. public void RenderHitScore(int score, int bestScore)
  130. {
  131. if (!GameManager.Instance) return;
  132. if (_sequenceRenderHitScore != null)
  133. {
  134. _sequenceRenderHitScore.Kill();
  135. _sequenceRenderHitScore = null;
  136. }
  137. _sequenceRenderHitScore = DOTween.To(() => _renderHitScore, v =>
  138. {
  139. _renderHitScore = v;
  140. textScore.text = _renderHitScore.ToString();
  141. }, score, 0.5f);
  142. if (bestScore > 0)
  143. {
  144. textScoreBest.gameObject.SetActive(true);
  145. var tal2 = textScoreBest.GetComponent<TextAutoLanguage2>();
  146. tal2.textFormatArgs = new object[] { bestScore };
  147. tal2.ApplyToText();
  148. }
  149. }
  150. public bool CheckHitDuckForGameStart(Vector2 screenPosition)
  151. {
  152. return RectTransformUtility.RectangleContainsScreenPoint(duckForGameStart, screenPosition);
  153. }
  154. public void HandleGameStart(System.Action callback, bool startImmediate)
  155. {
  156. if (startImmediate) TextGameScreenCenter.Instance.ShowText(TextGameScreenCenter.TextName.GAME_START_HIDE);
  157. else TextGameScreenCenter.Instance.ShowText(TextGameScreenCenter.TextName.GAME_START_FADEOUT);
  158. TweenCallback cb = () =>
  159. {
  160. bottomBox.SetActive(true);
  161. duckForGameStart.gameObject.SetActive(false);
  162. levelSlider.gameObject.SetActive(false);
  163. callback?.Invoke();
  164. };
  165. if (startImmediate) cb.Invoke();
  166. else
  167. {
  168. Sequence sequence = DOTween.Sequence();
  169. sequence.Append(duckForGameStart.transform.DOMoveX(Screen.width * 1.125f, 1f));
  170. sequence.AppendCallback(cb);
  171. }
  172. }
  173. List<Sequence> arrowsFadeSeqList = new List<Sequence>();
  174. [SerializeField] RectTransform arrowsRTF;
  175. [SerializeField] RectTransform bulletRTF;
  176. RectTransform tempRTF;
  177. public void RenderArrowCount(int count)
  178. {
  179. if (count == 0 && arrowsFadeSeqList.Count > 0) return;
  180. if (arrowsFadeSeqList.Count > 0)
  181. {
  182. for (int i = arrowsFadeSeqList.Count - 1; i >= 0; i--)
  183. {
  184. var seq = arrowsFadeSeqList[i];
  185. arrowsFadeSeqList.RemoveAt(i);
  186. seq.Kill();
  187. }
  188. }
  189. for (int i = 1; i < tempRTF.childCount; i++)
  190. {
  191. RectTransform iconRTF = tempRTF.GetChild(i) as RectTransform;
  192. Image iconIMG = iconRTF.GetComponent<Image>();
  193. iconIMG.color = Color.white;
  194. iconRTF.gameObject.SetActive(i <= count);
  195. if (count == 0)
  196. {
  197. if (i <= 3) iconRTF.gameObject.SetActive(true);
  198. var seq = DOTween.Sequence();
  199. arrowsFadeSeqList.Add(seq);
  200. seq.Append(iconIMG.DOFade(0.5f, 0.2f));
  201. seq.Append(iconIMG.DOFade(1f, 0f));
  202. seq.SetLoops(-1);
  203. }
  204. }
  205. }
  206. [SerializeField] RectTransform duckCountRTF;
  207. int _renderHitDuckCount = 0;
  208. List<Sequence> _duckIconListSequences = new List<Sequence>();
  209. /// <summary>
  210. /// 渲染鸭子的状态图标列表
  211. /// </summary>
  212. public void RenderHitDuckCount(int duckType)
  213. {
  214. if (duckType > 0)
  215. {
  216. _renderHitDuckCount++;
  217. RectTransform iconRTF = duckCountRTF.GetChild(_renderHitDuckCount) as RectTransform;
  218. Image iconIMG = iconRTF.GetComponent<Image>();
  219. iconIMG.sprite = Resources.Load<Sprite>("DuckHunter/Textures/Icons/Duck" + duckType);
  220. }
  221. else if (duckType == 0)
  222. {
  223. _renderHitDuckCount++;
  224. RectTransform iconRTF = duckCountRTF.GetChild(_renderHitDuckCount) as RectTransform;
  225. Image iconIMG = iconRTF.GetComponent<Image>();
  226. var seq = DOTween.Sequence();
  227. _duckIconListSequences.ForEach(e => e.Restart());
  228. _duckIconListSequences.Add(seq);
  229. seq.AppendCallback(() =>
  230. {
  231. Color c = iconIMG.color;
  232. c.a = 1;
  233. iconIMG.color = c;
  234. });
  235. seq.Append(iconIMG.DOFade(0.2f, 0.2f));
  236. seq.Append(iconIMG.DOFade(1f, 0f));
  237. seq.SetLoops(-1);
  238. }
  239. else
  240. {
  241. _duckIconListSequences.ForEach(e => e.Kill());
  242. for (int i = 1; i < duckCountRTF.childCount; i++)
  243. {
  244. RectTransform iconRTF = duckCountRTF.GetChild(i) as RectTransform;
  245. Image iconIMG = iconRTF.GetComponent<Image>();
  246. var seq = DOTween.Sequence();
  247. Color c = iconIMG.color;
  248. c.a = 1;
  249. iconIMG.color = c;
  250. seq.Append(iconIMG.DOFade(0.5f, 0.2f));
  251. seq.Append(iconIMG.DOFade(1f, 0f));
  252. seq.SetLoops(-1);
  253. }
  254. }
  255. }
  256. Sequence _sequenceShowTextHitScore;
  257. public void ShowTextHitScore(int score, Vector2 screenPosition)
  258. {
  259. if (_sequenceShowTextHitScore != null)
  260. {
  261. _sequenceShowTextHitScore.Kill();
  262. _sequenceShowTextHitScore = null;
  263. }
  264. textHitScore.gameObject.SetActive(true);
  265. textHitScore.text = score.ToString();
  266. textHitScore.transform.position = screenPosition;
  267. _sequenceShowTextHitScore = DOTween.Sequence();
  268. _sequenceShowTextHitScore.Append(textHitScore.DOFade(0.8f, 0));
  269. float lpy = textHitScore.transform.localPosition.y;
  270. _sequenceShowTextHitScore.Append(textHitScore.transform.DOLocalMoveY(lpy + 100, 0.5f));
  271. _sequenceShowTextHitScore.AppendInterval(1.5f);
  272. _sequenceShowTextHitScore.Append(textHitScore.DOFade(0, 0.5f));
  273. _sequenceShowTextHitScore.AppendCallback(() => textHitScore.gameObject.SetActive(false));
  274. }
  275. [SerializeField] Text textLevel;
  276. public void RenderLevel(int level)
  277. {
  278. var tal2 = textLevel.GetComponent<TextAutoLanguage2>();
  279. tal2.textFormatArgs = new object[] { level };
  280. tal2.ApplyToText();
  281. }
  282. [SerializeField] RectTransform arrowBox;
  283. public void AddArrowOnScreen(Vector2 screenPosition)
  284. {
  285. //arrowBox.GetChild(0)
  286. var o = Instantiate(arrowBox.GetChild((int)GlobalData.MyDeviceMode).gameObject, arrowBox);
  287. var tf = o.transform;
  288. tf.position = screenPosition;
  289. tf.gameObject.SetActive(true);
  290. Image img = tf.GetComponent<Image>();
  291. Sequence seq = DOTween.Sequence();
  292. seq.AppendInterval(2.5f);
  293. seq.Append(img.DOFade(0, 0.5f));
  294. seq.AppendCallback(() => Destroy(o));
  295. }
  296. }
  297. }