using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using DG.Tweening; namespace DuckHunter { public class GameUI : MonoBehaviour { [SerializeField] Text textScore; [SerializeField] Text textScoreBest; [SerializeField] Text textHitScore; [SerializeField] Button btnReset; [SerializeField] Button btnAim; [SerializeField] Button btnCrosshair; [SerializeField] Button btnBack; [SerializeField] Button btnCalibrationOffset; [SerializeField] RectTransform duckForGameStart; [SerializeField] GameObject textGameOver; [SerializeField] GameObject textGameCompleted; [SerializeField] GameObject bottomBox; [SerializeField] Slider levelSlider; [SerializeField] Material outlight; public static GameUI Instance; void Awake() { Instance = this; btnReset.onClick.AddListener(() => { AudioManager.Instance.PlayBtn(); UnityEngine.SceneManagement.SceneManager.LoadScene("DuckHunter"); }); if (!CommonConfig.StandaloneModeOrPlatformB) { if (GlobalData.MyDeviceMode == DeviceMode.Gun || BluetoothAim.ins && BluetoothAim.ins.isMainConnectToInfraredDevice()) { //btnAim.gameObject.SetActive(false); btnCrosshair.gameObject.SetActive(true); //获取设置值和一个存储值 bool onInitOpen = InfraredDemo._ins ? InfraredDemo._ins.bInitCrosshairShow() : true; Image crossHairImage = btnCrosshair.GetComponentInChildren(); crossHairImage.material = onInitOpen ? outlight : null; btnCrosshair.onClick.AddListener(delegate () { AudioManager.Instance.PlayBtn(); bool onlyShow = !CrossHair.Instance.GetOnlyShow(); CrossHair.Instance.SetOnlyShow(onlyShow); //记录准心值 if (InfraredDemo._ins) InfraredDemo._ins.setCrosshairValue(onlyShow); if (onlyShow) { crossHairImage.material = outlight; } else { crossHairImage.material = null; } }); //校准 btnCalibrationOffset.gameObject.SetActive(true); btnCalibrationOffset.onClick.AddListener(delegate () { AudioMgr.ins.PlayBtn(); SmartBowController.Instance.ResetAim(); }); } else { btnAim.gameObject.SetActive(true); btnAim.onClick.AddListener(() => { if (btnAim.GetComponent().isLongPress) return; AudioManager.Instance.PlayBtn(); SmartBowController.Instance.ResetAim(); }); btnAim.gameObject.AddComponent().onLongPress += () => { AudioManager.Instance.PlayBtn(); if (SB_EventSystem.ins) SB_EventSystem.ins.AwakenSimulateMouse(); }; } } btnBack.onClick.AddListener(() => { AudioManager.Instance.PlayBtn(); // UnityEngine.SceneManagement.SceneManager.LoadScene("Home", UnityEngine.SceneManagement.LoadSceneMode.Single); //野鸭退出时候操作一次分数 Debug.Log("野鸭btnBack上传的积分:" ); GameManager.Instance.onUploadScore(); //结束游戏页面 GameManager.Instance.userGameAnalyse1.showResultView(() => { UnityEngine.SceneManagement.SceneManager.LoadScene("Home", UnityEngine.SceneManagement.LoadSceneMode.Single); }); }); InitLevelSlider(); levelSlider.onValueChanged.AddListener(OnLevelSliderUpdate); //根据模式切换图标 tempRTF = GlobalData.MyDeviceMode == DeviceMode.Archery ? arrowsRTF : bulletRTF; tempRTF.gameObject.SetActive(true); } void OnDestroy() { if (Instance == this) Instance = null; DOTween.KillAll(false); } // Update is called once per frame void Update() { GameManager gm = GameManager.Instance; if (!gm) return; // int t = (int)(Time.time - startTime); // int m = t / 60; // int s = t % 60; // string mStr = m < 10 ? "0" + m : m.ToString(); // string sStr = s < 10 ? "0" + s : s.ToString(); // textTime.text = $"{mStr}:{sStr}"; } void InitLevelSlider() { RenderLevelSliderText(); levelSlider.SetValueWithoutNotify(GameManager.Instance.level); } void OnLevelSliderUpdate(float v) { GameManager.DefaultLevel = GameManager.Instance.level = (int)v; RenderLevelSliderText(); } void RenderLevelSliderText() { var tal2 = levelSlider.transform.Find("Text").GetComponent(); tal2.textFormatArgs = new object[] { GameManager.Instance.level }; tal2.ApplyToText(); } int _renderHitScore = 0; Tween _sequenceRenderHitScore; public void RenderHitScore(int score, int bestScore) { if (!GameManager.Instance) return; if (_sequenceRenderHitScore != null) { _sequenceRenderHitScore.Kill(); _sequenceRenderHitScore = null; } _sequenceRenderHitScore = DOTween.To(() => _renderHitScore, v => { _renderHitScore = v; textScore.text = _renderHitScore.ToString(); }, score, 0.5f); if (bestScore > 0) { textScoreBest.gameObject.SetActive(true); var tal2 = textScoreBest.GetComponent(); tal2.textFormatArgs = new object[] { bestScore }; tal2.ApplyToText(); } } public bool CheckHitDuckForGameStart(Vector2 screenPosition) { return RectTransformUtility.RectangleContainsScreenPoint(duckForGameStart, screenPosition); } public void HandleGameStart(System.Action callback, bool startImmediate) { if (startImmediate) TextGameScreenCenter.Instance.ShowText(TextGameScreenCenter.TextName.GAME_START_HIDE); else TextGameScreenCenter.Instance.ShowText(TextGameScreenCenter.TextName.GAME_START_FADEOUT); TweenCallback cb = () => { bottomBox.SetActive(true); duckForGameStart.gameObject.SetActive(false); levelSlider.gameObject.SetActive(false); callback?.Invoke(); }; if (startImmediate) cb.Invoke(); else { Sequence sequence = DOTween.Sequence(); sequence.Append(duckForGameStart.transform.DOMoveX(Screen.width * 1.125f, 1f)); sequence.AppendCallback(cb); } } List arrowsFadeSeqList = new List(); [SerializeField] RectTransform arrowsRTF; [SerializeField] RectTransform bulletRTF; RectTransform tempRTF; public void RenderArrowCount(int count) { if (count == 0 && arrowsFadeSeqList.Count > 0) return; if (arrowsFadeSeqList.Count > 0) { for (int i = arrowsFadeSeqList.Count - 1; i >= 0; i--) { var seq = arrowsFadeSeqList[i]; arrowsFadeSeqList.RemoveAt(i); seq.Kill(); } } for (int i = 1; i < tempRTF.childCount; i++) { RectTransform iconRTF = tempRTF.GetChild(i) as RectTransform; Image iconIMG = iconRTF.GetComponent(); iconIMG.color = Color.white; iconRTF.gameObject.SetActive(i <= count); if (count == 0) { if (i <= 3) iconRTF.gameObject.SetActive(true); var seq = DOTween.Sequence(); arrowsFadeSeqList.Add(seq); seq.Append(iconIMG.DOFade(0.5f, 0.2f)); seq.Append(iconIMG.DOFade(1f, 0f)); seq.SetLoops(-1); } } } [SerializeField] RectTransform duckCountRTF; int _renderHitDuckCount = 0; List _duckIconListSequences = new List(); /// /// 渲染鸭子的状态图标列表 /// public void RenderHitDuckCount(int duckType) { if (duckType > 0) { _renderHitDuckCount++; RectTransform iconRTF = duckCountRTF.GetChild(_renderHitDuckCount) as RectTransform; Image iconIMG = iconRTF.GetComponent(); iconIMG.sprite = Resources.Load("DuckHunter/Textures/Icons/Duck" + duckType); } else if (duckType == 0) { _renderHitDuckCount++; RectTransform iconRTF = duckCountRTF.GetChild(_renderHitDuckCount) as RectTransform; Image iconIMG = iconRTF.GetComponent(); var seq = DOTween.Sequence(); _duckIconListSequences.ForEach(e => e.Restart()); _duckIconListSequences.Add(seq); seq.AppendCallback(() => { Color c = iconIMG.color; c.a = 1; iconIMG.color = c; }); seq.Append(iconIMG.DOFade(0.2f, 0.2f)); seq.Append(iconIMG.DOFade(1f, 0f)); seq.SetLoops(-1); } else { _duckIconListSequences.ForEach(e => e.Kill()); for (int i = 1; i < duckCountRTF.childCount; i++) { RectTransform iconRTF = duckCountRTF.GetChild(i) as RectTransform; Image iconIMG = iconRTF.GetComponent(); var seq = DOTween.Sequence(); Color c = iconIMG.color; c.a = 1; iconIMG.color = c; seq.Append(iconIMG.DOFade(0.5f, 0.2f)); seq.Append(iconIMG.DOFade(1f, 0f)); seq.SetLoops(-1); } } } Sequence _sequenceShowTextHitScore; public void ShowTextHitScore(int score, Vector2 screenPosition) { if (_sequenceShowTextHitScore != null) { _sequenceShowTextHitScore.Kill(); _sequenceShowTextHitScore = null; } textHitScore.gameObject.SetActive(true); textHitScore.text = score.ToString(); textHitScore.transform.position = screenPosition; _sequenceShowTextHitScore = DOTween.Sequence(); _sequenceShowTextHitScore.Append(textHitScore.DOFade(0.8f, 0)); float lpy = textHitScore.transform.localPosition.y; _sequenceShowTextHitScore.Append(textHitScore.transform.DOLocalMoveY(lpy + 100, 0.5f)); _sequenceShowTextHitScore.AppendInterval(1.5f); _sequenceShowTextHitScore.Append(textHitScore.DOFade(0, 0.5f)); _sequenceShowTextHitScore.AppendCallback(() => textHitScore.gameObject.SetActive(false)); } [SerializeField] Text textLevel; public void RenderLevel(int level) { var tal2 = textLevel.GetComponent(); tal2.textFormatArgs = new object[] { level }; tal2.ApplyToText(); } [SerializeField] RectTransform arrowBox; public void AddArrowOnScreen(Vector2 screenPosition) { //arrowBox.GetChild(0) var o = Instantiate(arrowBox.GetChild((int)GlobalData.MyDeviceMode).gameObject, arrowBox); var tf = o.transform; tf.position = screenPosition; tf.gameObject.SetActive(true); Image img = tf.GetComponent(); Sequence seq = DOTween.Sequence(); seq.AppendInterval(2.5f); seq.Append(img.DOFade(0, 0.5f)); seq.AppendCallback(() => Destroy(o)); } } }