GameUI.cs 13 KB

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