215 lines
9.1 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;
namespace Assets.Scripts.Scenes.VideoRide
{
public class VideoUIManager : MonoBehaviour
{
GameObject button;
VideoGameManager manager;
VideoPlayer videoPlayer;
const float MAXPOWER = 450f;
const float MAXPOWER_RATE = 6f;
const float MAXHEARRATE = 200f;
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; }
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; }
//modal
GameObject settingPanel { get; set; }
GameObject resultPanel { 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();
RenderChart();
}
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/MiniMap/Panel/Timer").GetComponent<Text>();
distance = transform.Find("Panel/MiniMap/MiniMap/Panel/Distance").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)).ToString();
if (App.CurrentUser != null)
{
left.fillAmount = (float)(Math.Round(manager.CurrentPlayer.power) / MAXPOWER_RATE);
right.fillAmount = (float)(Math.Round((manager.CurrentPlayer.heartRate ?? 0f)) / MAXHEARRATE);
}
}
}
private void PauseClick(BaseEventData e)
{
manager.Pause();
}
private void DeviceClick(BaseEventData e)
{
UIManager.Show(UIManager.Instance.DevicePanel, null, true);
}
private void ChangeViewClick(BaseEventData e)
{
manager.ChangeView();
}
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();
}
);
}
GameObject GraphChart { get; set; }
GraphChartBase Graph { get; set; }
private void RenderChart()
{
var mapData = manager.GetMapData();
double x = 0;
Dictionary<double, double> dataSource = new Dictionary<double, double>();
List<double> dd = new List<double>();
foreach (var item in mapData.List)
{
if (!dataSource.ContainsKey(x))
{
dataSource.Add(x, item.Elevation);
}
x += item.Distance;
dd.Add(item.Elevation);
}
GraphChart = transform.Find("Panel/GraphChart").gameObject;
chartDataSourceScript = GraphChart.GetComponent<ChartDataSourceScript>();
Graph = GraphChart.GetComponent<GraphChartBase>();
chartDataSourceScript.SetDataSource(dd.ToArray());
}
#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
}
}