2022-03-30 18:41:06 +08:00

262 lines
11 KiB
C#

using Assets.Scenes.Ride.Scripts;
using Assets.Scenes.Ride.Scripts.Model;
using ChartAndGraph;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using DG.Tweening;
namespace Assets.Scripts.Scenes.VideoRide
{
public class VideoUIManager : MonoBehaviour
{
GameObject button;
VideoGameManager manager;
VideoPlayer videoPlayer;
const float MAXPOWER = 450f;
const float MAXPOWER_RATE = 600f;
const float MAXHEARRATE = 200f;
const float MAXWKG = 6f;
private ChartDataSourceScript chartDataSourceScript;
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 pauseBtn { 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; }
//ftp
GameObject ftpPanel { get; set; }
Image ftpImage { get; set; }
Text wkg { get; set; }
// Start is called before the first frame update
void Start()
{
UIManager.SetModalPanel(transform.Find("ModalPanel").GetComponent<PFUIPanel>());
manager = FindObjectOfType<VideoGameManager>();
videoPlayer = FindObjectOfType<VideoPlayer>();
button = transform.Find("Panel/Button").gameObject;
Init();
}
private void Init()
{
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
pauseBtn = transform.Find("Panel/ToolBarPanel/StartOrPauseButton").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;
//toolbar 事件注册
UIManager.AddEvent(pauseBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, PauseClick);
UIManager.AddEvent(changeViewBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, ChangeViewClick);
UIManager.AddEvent(deviceBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, DeviceClick);
UIManager.AddEvent(quitBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, QuitClick);
}
// Update is called once per frame
void Update()
{
if (manager != null && manager.CurrentPlayer != null)
{
//infoText.text = $"帧数:{manager.GetCurrentFrame()}";
power.text = Math.Round(manager.CurrentPlayer.power).ToString();
speed.text = Math.Round(manager.CurrentPlayer.speed).ToString();
heartRate.text = Math.Round((manager.CurrentPlayer.heartRate ?? 0d)).ToString();
cadance.text = Math.Round(manager.CurrentPlayer.cadance).ToString();
playerTimer.text = Helper.FormatTicks(videoPlayer.ticks);
distance.text = $"{Math.Round((manager.CurrentPlayer.totalDistance))}KM";
mapName.text = manager.GetMapRoute().Name;
left.fillAmount = (float)(Math.Round(manager.CurrentPlayer.power) / MAXPOWER_RATE);
right.fillAmount = (float)(Math.Round((manager.CurrentPlayer.heartRate ?? 0f)) / MAXHEARRATE);
slope.text = Math.Round(manager.CurrentPlayer.currentSlope,1).ToString();
wave.DORotate(new Vector3(0f, 0f, (float)manager.CurrentPlayer.currentSlope), 1f);
SetWaveColor(manager.CurrentPlayer.currentSlope);
//ftp
ftpImage.fillAmount = (float)(manager.CurrentPlayer.wkg / MAXWKG);
wkg.text = $"{manager.CurrentPlayer.wkg}w/kg";
}
}
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 PauseClick(BaseEventData e)
{
manager.Pause();
}
private void DeviceClick(BaseEventData e)
{
UIManager.Show(UIManager.Instance.DevicePanel, null, true);
}
public enum ViewMode
{
THIRD,
FIRST,
}
//当前是第一人称还是第三人称
public ViewMode _viewMode { get; set; }
private void ChangeViewClick(BaseEventData e)
{
var videoPlayer = FindObjectOfType<VideoPlayer>();
var nearByScript = FindObjectOfType<NearByScript>();
var rankingScript = FindObjectOfType<RankingScript>();
var currentPlayer = manager.CurrentPlayer == null ? videoPlayer.transform : manager.CurrentPlayer.transform;
_viewMode = _viewMode == ViewMode.THIRD ? ViewMode.FIRST : ViewMode.THIRD;
if (_viewMode == ViewMode.FIRST)
{
currentPlayer.DOMoveZ(-0.1f, 0f);
currentPlayer.DOMoveY(-1.1f, 0f);
ftpPanel.SetActive(true);
nearByScript.Hidehandler(null);
rankingScript.Hidehandler(null);
}
else
{
ftpPanel.SetActive(false);
currentPlayer.DOMoveZ(4, 0f);
currentPlayer.DOMoveY(-1f, 0f);
nearByScript.Showhandler(null);
rankingScript.Showhandler(null);
}
}
private void QuitClick(BaseEventData e)
{
UIManager.ShowConfirm("Quit", "Do you want to keep the record?",
() => {
videoPlayer?.Upload();
UIManager.CloseConfirm();
//show result
resultPanel.SetActive(true);
resultPanel.transform.SetAsLastSibling();
var videoResultScript = resultPanel.GetComponent<VideoResultScript>();
videoResultScript.InjectController(manager);
videoResultScript.SetDataSource(manager.cyclingController.recorderData);
},
2,
() => {
UIManager.CloseConfirm();
}
);
}
#region
private void EventHandler()
{
StringBuilder sb = new StringBuilder();
GameObject start = transform.Find("Panel/start").gameObject;
GameObject stop = transform.Find("Panel/stop").gameObject;
GameObject save = transform.Find("Panel/save").gameObject;
GameObject left = transform.Find("Panel/left").gameObject;
GameObject right = transform.Find("Panel/right").gameObject;
GameObject continueBtn = transform.Find("Panel/continue").gameObject;
GameObject change = transform.Find("Panel/change").gameObject;
UIManager.AddEvent(change, UnityEngine.EventSystems.EventTriggerType.PointerClick, async (s) =>
{
manager.ChangePlayer(-16379);
});
UIManager.AddEvent(continueBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, async (s) =>
{
await manager.ContinueAsync();
});
infoText = transform.Find("InfoText").GetComponent<Text>();
UIManager.AddEvent(button, UnityEngine.EventSystems.EventTriggerType.PointerClick, (s) =>
{
UIManager.Show(UIManager.Instance.DevicePanel, null, true);
});
UIManager.AddEvent(start, UnityEngine.EventSystems.EventTriggerType.PointerClick, (s) =>
{
videoPlayer.SetPower(200);
manager.StartGame();
});
UIManager.AddEvent(stop, UnityEngine.EventSystems.EventTriggerType.PointerClick, (s) =>
{
sb.AppendLine($"{manager.GetCurrentFrame()}:{0}");
Debug.Log(sb.ToString());
videoPlayer.SetPower(0);
manager.Pause();//暂停视频
});
UIManager.AddEvent(save, UnityEngine.EventSystems.EventTriggerType.PointerClick, (s) =>
{
videoPlayer.Complete();
});
UIManager.AddEvent(left, UnityEngine.EventSystems.EventTriggerType.PointerClick, (s) =>
{
sb.AppendLine($"{manager.GetCurrentFrame()}:{-5}");
});
UIManager.AddEvent(right, UnityEngine.EventSystems.EventTriggerType.PointerClick, (s) =>
{
sb.AppendLine($"{manager.GetCurrentFrame()}:{5}");
});
}
#endregion
}
}