GameUI.cs 13 KB

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