using Assets.Scenes.Ride.Scripts; using System; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI; using DG.Tweening; using UnityEngine.SceneManagement; using Assets.Scenes.Ride.Scripts.Model.CyclingModels; using static Assets.Scripts.Scenes.VideoRide.VideoGameManager; using Assets.AR; namespace Assets.Scripts.Scenes.VideoRide { public class VideoUIManager : MonoBehaviour { private const float MAXPOWER = 450f; private const float MAXPOWER_RATE = 600f; private const float MAXHEARRATE = 200f; private const float MAXWKG = 6f; private const float MAX_HEART_RATIO = 0.9f; GameObject ComputerPanel { get; set; } GameObject WatchPanel { get; set; } GameObject explosive { get; set; } GameObject button; GameObject remainTime; VideoGameManager manager; VideoPlayer videoPlayer; Text infoText { get; set; } //ComputerPanel Text power { get; set; } Text cadance { get; set; } Text heartRate { get; set; } Text speed { get; set; } Text totalDistance { get; set; } Text totalClimbed { get; set; } Text ridingTime { get; set; } Text mapName { get; set; } Image left { get; set; } Image right { get; set; } //ToolBarPanel GameObject settingBtn { get; set; } GameObject deviceBtn { get; set; } GameObject changeViewBtn { get; set; } GameObject quitBtn { get; set; } //minimap Text playerTimer { get; set; } Text distance { get; set; } Text slope { get; set; } Transform wave { get; set; } Image waveimage { get; set; } //modal GameObject settingPanel { get; set; } GameObject resultPanel { get; set; } GameObject gameRoomResultPanel { get; set; } //ftp GameObject ftpPanel { get; set; } Image ftpImage { get; set; } Text wkg { get; set; } private void Start() { UIManager.SetModalPanel(transform.Find("ModalPanel").GetComponent()); manager = FindObjectOfType(); Init(); } private void Update() { if (manager != null) { mapName.text = manager.GetMapRoute().Name; if (manager.CurrentPlayer != null) { power.text = Math.Round(manager.CurrentPlayer.power).ToString(); speed.text = manager.CurrentPlayer.speed.ToString("f1"); heartRate.text = Math.Round((manager.CurrentPlayer.heartRate ?? 0d)).ToString(); cadance.text = Math.Round(manager.CurrentPlayer.cadance).ToString(); playerTimer.text = Helper.FormatTicks(manager.CurrentPlayer.ticks); distance.text = $"{Math.Round((manager.CurrentPlayer.totalDistance),2)}KM"; left.fillAmount = (float)(Math.Round(manager.CurrentPlayer.power) / MAXPOWER_RATE); right.fillAmount = (float)(Math.Round((manager.CurrentPlayer.heartRate ?? 0f)) / MAXHEARRATE); SetSlopePanel(); ftpImage.fillAmount = (float)(manager.CurrentPlayer.wkg / MAXWKG); wkg.text = $"{manager.CurrentPlayer.wkg}w/kg"; SetHeartRateAlert(); } } } //心率过高的时候显示 private void SetHeartRateAlert() { if (manager.CurrentPlayer.UserId == App.CurrentUser.Id) { explosive.SetActive(ComputeHearRateRatio(manager.CurrentPlayer.heartRate ?? 0) > MAX_HEART_RATIO); } else { explosive.SetActive(false); } } //距离终点 public void ShowUpRemainTime(double remain) { if (remain > 110) return; remain -= 20; var canvas = remainTime.GetComponent(); if (remain <= 0) { if (canvas.alpha == 1) canvas.DOFade(0, 1).onComplete = () => { remainTime.SetActive(false); }; } else { remainTime.SetActive(true); remainTime.transform.Find("Bg/Distance").GetComponent().text = remain.ToString().PadLeft(2,'0'); if (canvas.alpha == 0) canvas.DOFade(1, 1f); } } // 220 - 年龄= 最大心率 ratio = heartRate /最大心率 private float ComputeHearRateRatio(int heartRate) { var age = DateTime.Now.Year - App.CurrentUser.Birthday?.Year; if (DateTime.Now.Month - App.CurrentUser.Birthday?.Month > 0 && DateTime.Now.Day - App.CurrentUser.Birthday?.Day > 0) { age += 1; } age = age ?? 0; var ratio = heartRate / (220 - age); return (float)ratio; } public void SetCurrentMode(VideoGameManager.ARMode aRMode) { if (aRMode == VideoGameManager.ARMode.INSPECT) { ComputerPanel.SetActive(false); WatchPanel.SetActive(true); } else { WatchPanel.SetActive(false); ComputerPanel.SetActive(true); } } private void Init() { remainTime = transform.Find("Panel/Remain").gameObject; infoText = transform.Find("InfoText").GetComponentInChildren(); ComputerPanel = transform.Find("Panel/ComputerPanel").gameObject; WatchPanel = transform.Find("Panel/WatchPanel").gameObject; power = transform.Find("Panel/ComputerPanel/Power").GetComponent(); cadance = transform.Find("Panel/ComputerPanel/Cadance").GetComponent(); heartRate = transform.Find("Panel/ComputerPanel/Hr").GetComponent(); speed = transform.Find("Panel/ComputerPanel/Speed").GetComponent(); left = transform.Find("Panel/ComputerPanel/Left").GetComponent(); right = transform.Find("Panel/ComputerPanel/Right").GetComponent(); //ToolBarPanel settingBtn = transform.Find("Panel/ToolBarPanel/SettingButton").gameObject; quitBtn = transform.Find("Panel/ToolBarPanel/ExitButton").gameObject; changeViewBtn = transform.Find("Panel/ToolBarPanel/ChangeView").gameObject; deviceBtn = transform.Find("Panel/ToolBarPanel/DeviceButton").gameObject; //minmap playerTimer = transform.Find("Panel/MiniMap/Panel/Timer").GetComponent(); distance = transform.Find("Panel/MiniMap/Panel/Distance").GetComponent(); mapName = transform.Find("Panel/MiniMap/Head/MapName").GetComponent(); slope = transform.Find("Panel/MiniMap/Panel/Circle/slope").GetComponent(); wave = transform.Find("Panel/MiniMap/Panel/Circle/wave"); waveimage = wave.GetComponent(); //FtpPanel ftpPanel = transform.Find("Panel/FtpPanel").gameObject; ftpImage = transform.Find("Panel/FtpPanel/ftp").GetComponent(); wkg = transform.Find("Panel/FtpPanel/wkg").GetComponent(); //modal settingPanel = transform.Find("Panel/SettingPanel").gameObject; resultPanel = transform.Find("Panel/ResultPanel").gameObject; gameRoomResultPanel = transform.Find("Panel/GameRoomResult").gameObject; // explosive = transform.Find("Panel/Explosive").gameObject; //toolbar 事件注册 UIManager.AddEvent(settingBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, ShowSetting); UIManager.AddEvent(changeViewBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, ChangeViewClick); UIManager.AddEvent(deviceBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, DeviceClick); UIManager.AddEvent(quitBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, QuitClick); } //设置坡度信息 private void SetSlopePanel() { var normalizedSlope = (float)Math.Round(manager.CurrentPlayer.currentSlope, 1); slope.text = normalizedSlope > 0 ? "+"+normalizedSlope.ToString():normalizedSlope.ToString(); var strength = 3;//增强旋转角度系数 if (normalizedSlope > 10) { normalizedSlope = 10f; } if (normalizedSlope < -10) { normalizedSlope = -10f; } wave.DORotate(new Vector3(0f, 0f, normalizedSlope*strength),1f); SetWaveColor(normalizedSlope); } private void SetWaveColor(double currentSlope) { if (currentSlope > 7) { waveimage.color = PFConstants.Red; } else if (currentSlope > 3) { waveimage.color = PFConstants.Orange; } else if (currentSlope > 0) { waveimage.color = PFConstants.Yellow; } else { waveimage.color = PFConstants.Green; } } private void ShowSetting(BaseEventData e) { UIManager.ShowRideSettingPanel(); } private void DeviceClick(BaseEventData e) { UIManager.Show(UIManager.Instance.DevicePanel, null, true); } private void ChangeViewClick(BaseEventData e) { var nearByScript = FindObjectOfType(); var rankingScript = FindObjectOfType(); var arController = FindObjectOfType(); var cameraImage = changeViewBtn.transform.Find("Camera").gameObject; manager._viewMode = manager._viewMode == ViewMode.THIRD ? ViewMode.FIRST : ViewMode.THIRD; if (manager._viewMode == ViewMode.FIRST) { ftpPanel.SetActive(manager._aRMode != ARMode.INSPECT); nearByScript.Hidehandler(null); rankingScript.Hidehandler(null); cameraImage.SetActive(true); arController.RiderCameraDistance = CameraDistance.FirstPerson; } else { ftpPanel.SetActive(false); nearByScript.Showhandler(null); rankingScript.Showhandler(null); cameraImage.SetActive(false); arController.RiderCameraDistance = CameraDistance.Middle; } } public void ShowResultPanel() { resultPanel.SetActive(true); resultPanel.transform.SetAsLastSibling(); var videoResultScript = resultPanel.GetComponent(); videoResultScript.InjectController(manager); videoResultScript.SetDataSource(manager.cyclingController.recorderData); } public void SaveAndShowResult() { if (manager._aRMode == VideoGameManager.ARMode.INSPECT) SceneManager.LoadScene("MainScene"); videoPlayer = FindObjectOfType(); videoPlayer?.Upload(); //show result if (manager.cyclingController is GameModel) { gameRoomResultPanel.SetActive(true); gameRoomResultPanel.transform.SetAsLastSibling(); } else { resultPanel.SetActive(true); resultPanel.transform.SetAsLastSibling(); var videoResultScript = resultPanel.GetComponent(); videoResultScript.InjectController(manager); videoResultScript.SetDataSource(manager.cyclingController.recorderData); } } private void QuitClick(BaseEventData e) { var idMainRider = manager.CurrentPlayer != null && manager.CurrentPlayer.UserId == App.CurrentUser.Id; var shortDistance = idMainRider && (manager.CurrentPlayer.ticks == 0 || manager.cyclingController.recorderData.RiderDatas.Count == 0 || manager.CurrentPlayer.EndDistance - manager.CurrentPlayer.StartDistance < 0.1f); if (shortDistance) { UIManager.ShowConfirm(App.GetLocalString("Quit"), App.GetLocalString("Current ride distance too short to save."), () => { UIManager.CloseConfirm(); SceneManager.LoadSceneAsync("MainScene"); }, 2, () => { UIManager.CloseConfirm(); }); return; } if (manager._aRMode == VideoGameManager.ARMode.RIDE) { UIManager.ShowConfirm(App.GetLocalString("Quit"), App.GetLocalString("Do you want to keep the record?"), () => { SaveAndShowResult(); UIManager.CloseConfirm(); }, 2, () => { UIManager.CloseConfirm(); } ); } else { UIManager.ShowConfirm(App.GetLocalString("Quit"), App.GetLocalString("Do you want to quit?"), () => { UIManager.CloseConfirm(); SceneManager.LoadSceneAsync("MainScene"); }, 2, () => { UIManager.CloseConfirm(); }); } } } }