340 lines
14 KiB
C#
340 lines
14 KiB
C#
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<PFUIPanel>());
|
|
manager = FindObjectOfType<VideoGameManager>();
|
|
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<CanvasGroup>();
|
|
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>().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<Text>();
|
|
ComputerPanel = transform.Find("Panel/ComputerPanel").gameObject;
|
|
WatchPanel = transform.Find("Panel/WatchPanel").gameObject;
|
|
power = transform.Find("Panel/ComputerPanel/Power").GetComponent<Text>();
|
|
cadance = transform.Find("Panel/ComputerPanel/Cadance").GetComponent<Text>();
|
|
heartRate = transform.Find("Panel/ComputerPanel/Hr").GetComponent<Text>();
|
|
speed = transform.Find("Panel/ComputerPanel/Speed").GetComponent<Text>();
|
|
left = transform.Find("Panel/ComputerPanel/Left").GetComponent<Image>();
|
|
right = transform.Find("Panel/ComputerPanel/Right").GetComponent<Image>();
|
|
//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<Text>();
|
|
distance = transform.Find("Panel/MiniMap/Panel/Distance").GetComponent<Text>();
|
|
mapName = transform.Find("Panel/MiniMap/Head/MapName").GetComponent<Text>();
|
|
slope = transform.Find("Panel/MiniMap/Panel/Circle/slope").GetComponent<Text>();
|
|
wave = transform.Find("Panel/MiniMap/Panel/Circle/wave");
|
|
waveimage = wave.GetComponent<Image>();
|
|
//FtpPanel
|
|
ftpPanel = transform.Find("Panel/FtpPanel").gameObject;
|
|
ftpImage = transform.Find("Panel/FtpPanel/ftp").GetComponent<Image>();
|
|
wkg = transform.Find("Panel/FtpPanel/wkg").GetComponent<Text>();
|
|
//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<NearByScript>();
|
|
var rankingScript = FindObjectOfType<RankingScript>();
|
|
var arController = FindObjectOfType<ARTrainingController>();
|
|
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>();
|
|
videoResultScript.InjectController(manager);
|
|
videoResultScript.SetDataSource(manager.cyclingController.recorderData);
|
|
}
|
|
public void SaveAndShowResult()
|
|
{
|
|
if (manager._aRMode == VideoGameManager.ARMode.INSPECT)
|
|
SceneManager.LoadScene("MainScene");
|
|
videoPlayer = FindObjectOfType<VideoPlayer>();
|
|
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>();
|
|
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();
|
|
});
|
|
}
|
|
}
|
|
}
|
|
} |