powerfun-unity/Assets/Scenes/Ride/Scripts/SingleUIManager.cs

450 lines
22 KiB
C#
Raw Normal View History

using UnityEngine;
using UnityEngine.UI;
2021-03-28 18:17:15 +08:00
using XCharts;
using XUGL;
using System.Linq;
2021-03-29 20:32:30 +08:00
using System.Collections;
using Mapbox.Unity.Map;
using DG.Tweening;
using System;
using Assets.Scenes.Ride.Scripts.Model;
using UnityEngine.SceneManagement;
using System.Collections.Generic;
using Assets.Cyp.Common;
2021-04-15 10:13:01 +08:00
using System.Threading.Tasks;
using UnityEngine.EventSystems;
namespace Assets.Scenes.Ride.Scripts
{
public class SingleUIManager : MonoBehaviour
{
#region UI control
2021-04-15 10:13:01 +08:00
GameObject target;
GameObject rightPanel;//右边列表
GameObject leftPanel;//左边列表
GameObject nextSlopePanel;//下一个坡度面板
GameObject currentSlopePanel;//当前坡度面板
2021-04-15 10:13:01 +08:00
GameObject selectPanel;//骑行模式选择
GameObject selectPlayer;//伴侣骑行选择窗口
GameObject reviewPanel;
GameObject titlePanel;
GameObject quitPanel;//退出界面
Text nextSlopeText;//下一个坡度
Text nextSlopeDistanceText;//下一个坡度距离
Text currentSlopeText;//当前坡度
2021-04-15 10:13:01 +08:00
Text currentSlopeDistanceText;//当前坡度已骑行距离
Text currentSlopeToatalDistanceText;//当前坡度总距离
Text speedTxt;//当前速度
Text powerTxt;//功率
Text timerTxt;//计时器
2021-04-15 10:13:01 +08:00
Text ditance;//当前骑行距离
Text totalDistance;//当前骑行距离
Text candance;//踏频
Text heartRate;//心率
Text countDownTxt;//倒计时5s
Text mapName;//路书名称
2021-04-15 10:13:01 +08:00
Text fps;//fps
Text totalClimb;
Button startBtn;//开始按钮
Button simpleBtn;//进入简约模式按钮
Button pauseButton;//暂停按钮
Button settingButton;//设置那妞
Button deviceButton;//设备按钮
Button exitButton;//退出按钮
Button singleButton;//单人骑行按钮
Button shadowButton;//影子选手按钮
Button addButton;//添加伴侣骑行
Button saveButton;//退出panel保存按钮
Button cancelQuitButton;//退出panel取消按钮
Button closeQuitButton;//退出panel关闭按钮
LineChart elevationChart;//海拔图
RawImage img;//海拔图头像
#endregion
2021-03-28 18:17:15 +08:00
#region
2021-04-12 17:35:56 +08:00
public PlayerController playerController;//当前用户
public CyclingController mainController;//主控制器
#endregion
2021-03-29 20:32:30 +08:00
private float timeRemaining = 1f;
private int count = 0;
Image arrow;
AbstractMap map;
2021-03-28 18:17:15 +08:00
void Awake()
{
2021-04-15 10:13:01 +08:00
#region
fps = transform.Find("Panel/FPS").GetComponent<Text>();
arrow = transform.Find("Panel/Arrow").GetComponent<Image>();
map = transform.parent.Find("Map").GetComponent<AbstractMap>();
2021-04-12 17:35:56 +08:00
leftPanel = transform.Find("Panel/ReviewPanel").gameObject;
rightPanel = transform.Find("Panel/NearPanel").gameObject;
startBtn = transform.Find("Panel/StartButton").GetComponent<Button>();
simpleBtn = transform.Find("Panel/SimpleButton").GetComponent<Button>();
ditance = transform.Find("Panel/CyclingComputerPanel/Distance").GetComponent<Text>();
2021-04-15 10:13:01 +08:00
titlePanel = transform.Find("Panel/TitlePanel").gameObject;
totalDistance = transform.Find("Panel/TitlePanel/TotalDistance").GetComponent<Text>();
2021-04-12 17:35:56 +08:00
candance = transform.Find("Panel/PowerPanel/Cadance").GetComponent<Text>();
heartRate = transform.Find("Panel/PowerPanel/Hrv").GetComponent<Text>();
nextSlopePanel = transform.Find("Panel/NextSlopePanel").gameObject;
currentSlopePanel = transform.Find("Panel/CurrentSlopePanel").gameObject;
2021-04-15 10:13:01 +08:00
nextSlopeText = transform.Find("Panel/NextSlopePanel/NextSlopeText").GetComponent<Text>();
nextSlopeDistanceText = transform.Find("Panel/NextSlopePanel/NextSlopeDistance").GetComponent<Text>();
currentSlopeText = transform.Find("Panel/CurrentSlopePanel/CurrentSlopeText").GetComponent<Text>();
currentSlopeDistanceText = transform.Find("Panel/CurrentSlopePanel/CurrentSlopeDistance").GetComponent<Text>();
currentSlopeToatalDistanceText = transform.Find("Panel/CurrentSlopePanel/TotalSlopeDistance").GetComponent<Text>();
speedTxt = transform.Find("Panel/CyclingComputerPanel/Speed").GetComponent<Text>();
powerTxt = transform.Find("Panel/PowerPanel/Power").GetComponent<Text>();
timerTxt = transform.Find("Panel/CyclingComputerPanel/Timer").GetComponent<Text>();
countDownTxt = transform.Find("Panel/CountDown").GetComponent<Text>();
mapName = transform.Find("Panel/TitlePanel/MapName").GetComponent<Text>();
totalClimb = transform.Find("Panel/CyclingComputerPanel/TotalClimb").GetComponent<Text>();
elevationChart = transform.Find("Panel/ElevationChart").GetComponent<LineChart>();
img = transform.Find("Panel/ElevationChart/HeadImage").GetComponent<RawImage>();
selectPanel = transform.Find("Panel/SelectPanel").gameObject;
selectPlayer = transform.Find("Panel/SelectPlayer").gameObject;
reviewPanel = transform.Find("Panel/ReviewPanel").gameObject;
quitPanel = transform.Find("Panel/QuitPanel").gameObject;
pauseButton = transform.Find("Panel/ToolBarPanel/StartOrPauseButton").GetComponent<Button>();
settingButton = transform.Find("Panel/ToolBarPanel/SettingButton").GetComponent<Button>();
deviceButton = transform.Find("Panel/ToolBarPanel/DeviceButton").GetComponent<Button>();
exitButton = transform.Find("Panel/ToolBarPanel/ExitButton").GetComponent<Button>();
singleButton = transform.Find("Panel/SelectPanel/SingleButton").GetComponent<Button>();
shadowButton = transform.Find("Panel/SelectPanel/ShadowButton").GetComponent<Button>();
addButton = transform.Find("Panel/ReviewPanel/SingleArea/AddButton").GetComponent<Button>();
saveButton = transform.Find("Panel/QuitPanel/SaveButton").GetComponent<Button>();
cancelQuitButton = transform.Find("Panel/QuitPanel/CancelButton").GetComponent<Button>();
closeQuitButton = transform.Find("Panel/QuitPanel/CloseButton").GetComponent<Button>();
2021-04-12 17:35:56 +08:00
2021-04-15 10:13:01 +08:00
target = transform.parent.Find("Target").gameObject;
2021-04-12 17:35:56 +08:00
UIManager.AddEvent(startBtn.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, StartRide);
UIManager.AddEvent(simpleBtn.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, ClearPanel);
UIManager.AddEvent(pauseButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, PauseRide);
UIManager.AddEvent(settingButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, ShowSettingPanel);
UIManager.AddEvent(deviceButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, ShowDevicePanel);
UIManager.AddEvent(exitButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, StopRide);
UIManager.AddEvent(singleButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, SingleRide);
UIManager.AddEvent(shadowButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, ShadowRide);
UIManager.AddEvent(addButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, ShowSelectPlayer);
UIManager.AddEvent(saveButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, SaveRide);
UIManager.AddEvent(cancelQuitButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, CancelQuit);
UIManager.AddEvent(closeQuitButton.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, CloseQuit);
//startBtn.onClick.AddListener(StartRide);
//simpleBtn.onClick.AddListener(ClearPanel);
//pauseButton.onClick.AddListener(PauseRide);
//settingButton.onClick.AddListener(ShowSettingPanel);
//deviceButton.onClick.AddListener(ShowDevicePanel);
//exitButton.onClick.AddListener(StopRide);
//singleButton.onClick.AddListener(SingleRide);
//shadowButton.onClick.AddListener(ShadowRide);
//addButton.onClick.AddListener(ShowSelectPlayer);
//saveButton.onClick.AddListener(SaveRide);
//cancelQuitButton.onClick.AddListener(CancelQuit);
//closeQuitButton.onClick.AddListener(CloseQuit);
2021-04-15 10:13:01 +08:00
#endregion
2021-03-28 18:17:15 +08:00
}
2021-04-15 10:13:01 +08:00
void Start()
{
playerController = FindObjectOfType<PlayerController>();
mainController = FindObjectOfType<CyclingController>();
var route = mainController.GetRoute();
mapName.text = route.RouteInstance.Name;
2021-04-19 18:03:04 +08:00
totalDistance.text = Math.Round(mainController.GetMapData().TotalDistance, 1).ToString() + "KM";//总里程
2021-03-28 18:17:15 +08:00
RenderChart();
startIndex = playerController.CurrentIndex;
//继续骑行如果有伴侣就自动进入伴侣骑行
if (mainController.routeResult != null)
{
if (mainController.routeResult.Mode == CyclingModel.Review.ToString())
{
mainController.SetCyclingModel(CyclingModel.Review);
selectPanel.SetActive(false);
var reviewFactory = reviewPanel.transform.GetComponent<ReviewFactory>();
reviewFactory.Refresh();
}
else if (mainController.routeResult.Mode == CyclingModel.Single.ToString())
{
mainController.SetCyclingModel(CyclingModel.Single);
selectPanel.SetActive(false);
}
}
}
// Update is called once per frame
float tt = 1f;
void Update()
{
tt -= Time.deltaTime;
while (tt < 0) {
2021-04-15 10:13:01 +08:00
fps.text = (1 / Time.deltaTime).ToString();
MoveChartMarkPoint();
tt = 1;
}
//获取当前选中玩家绑定当前UI
if (playerController != null)
{
//绑定UI
2021-04-19 18:03:04 +08:00
speedTxt.text = $"{Math.Round(playerController.Speed,1)}";
powerTxt.text = $"{playerController.Power}";
timerTxt.text = Helper.FormatTicks(playerController.TotalTicks);
2021-04-19 18:03:04 +08:00
ditance.text = Math.Round(playerController.TotalDistance, 1).ToString("f1");
heartRate.text = $"{Math.Round(playerController.HeartRate, 0)}";
candance.text = $"{Math.Round(playerController.Cadance, 0)}";
//倒计时
if (count > 0)
{
timeRemaining -= Time.deltaTime;
if (timeRemaining <= 0)//定时器
{
count--;
if (count == 0)
{
2021-04-19 18:03:04 +08:00
mainController.SetStart();
countDownTxt.gameObject.SetActive(false);
}
timeRemaining = 1.0f;
}
}
countDownTxt.text = count.ToString();
//坡度相关数据
nextSlopeText.text = Math.Round(playerController.NextSlope, 1).ToString() + "%";
nextSlopeDistanceText.text ="-" + Math.Round(playerController.NextSlopeDistance, 0).ToString()+"M";
currentSlopeText.text = Math.Round(playerController.CurrentSlope, 1).ToString() + "%";
currentSlopeDistanceText.text = Math.Round(playerController.CurrentSlopeDistance, 0).ToString() + "M";
2021-04-15 10:13:01 +08:00
totalClimb.text = Math.Round(playerController.TotalClimb, 0).ToString();
//移动海拔图头像 TODO移动所有人的头像
//MoveChartMarkPoint();
}
if (target != null)
{
target.transform.position = playerController.transform.position; //new Vector3((float)Math.Round(player.transform.position.x,1), 0, (float)Math.Round(player.transform.position.z,1));
2021-04-15 10:13:01 +08:00
//target.transform.rotation = playerController.transform.rotation;//new Quaternion(playerController.transform.rotation.x, playerController.transform.rotation.y +1f, playerController.transform.rotation.z, playerController.transform.rotation.w);
target.transform.eulerAngles = new Vector3(0, playerController.transform.eulerAngles.y + 180f, 0);
//控制照片移动
((RectTransform)arrow.transform).position = Camera.main.WorldToScreenPoint(target.transform.position);
}
}
private void SingleRide(BaseEventData baseEventData)
2021-04-15 10:13:01 +08:00
{
selectPanel.SetActive(false);
mainController.SetCyclingModel(CyclingModel.Single);
2021-04-15 10:13:01 +08:00
//显示单人骑行列表
reviewPanel.SetActive(true);
}
private void ShadowRide(BaseEventData baseEventData)
2021-04-15 10:13:01 +08:00
{
mainController.SetCyclingModel(CyclingModel.Review);
2021-04-15 10:13:01 +08:00
selectPanel.SetActive(false);
//显示影子选手骑行列表
selectPlayer.SetActive(true);
}
private void ShowSelectPlayer(BaseEventData baseEventData)
2021-04-15 10:13:01 +08:00
{
selectPlayer.SetActive(true);
}
private void StartRide(BaseEventData baseEventData)
{
var antConnected = mainController.CheckAnt();//初始化ant+设备
//if (!antConnected)
//{
// throw new Exception("请先连接设备");
//}
//加个5秒钟倒计时
count = 5;
startBtn.gameObject.SetActive(false);
countDownTxt.gameObject.SetActive(true);
countDownTxt.text = count.ToString();
2021-03-29 20:32:30 +08:00
}
//暂停游戏
private void PauseRide(BaseEventData baseEventData)
{
2021-04-19 18:03:04 +08:00
mainController.SetPause();
startBtn.gameObject.SetActive(true);
}
private void SaveRide(BaseEventData baseEventData)
2021-04-15 10:13:01 +08:00
{
2021-04-19 18:03:04 +08:00
mainController.SetQuit();
if (playerController.TotalTicks > 0 && !mainController.isQuit )
2021-04-15 17:09:35 +08:00
{
playerController.Upload();
quitPanel.SetActive(false);
}
SceneManager.LoadScene("MainScene");
2021-04-15 10:13:01 +08:00
}
private void CancelQuit(BaseEventData baseEventData)
2021-04-15 10:13:01 +08:00
{
quitPanel.SetActive(false);
SceneManager.LoadScene("MainScene");
}
private void CloseQuit(BaseEventData baseEventData)
2021-04-15 10:13:01 +08:00
{
quitPanel.SetActive(false);
}
//结束游戏
private void StopRide(BaseEventData baseEventData)
{
2021-04-15 17:09:35 +08:00
if (playerController.TotalTicks > 0)
{
quitPanel.SetActive(true);
}
else
{
SceneManager.LoadScene("MainScene");
}
}
//显示设备连接
private void ShowDevicePanel(BaseEventData baseEventData)
{
2021-04-15 17:09:35 +08:00
UIManager.Show(UIManager.Instance.DevicePanel, transform.Find("Panel").GetComponent<PFUIPanel>());
}
//显示设置
private void ShowSettingPanel(BaseEventData baseEventData)
{
}
2021-03-29 20:32:30 +08:00
int isSimple = 1;
2021-04-15 10:13:01 +08:00
private bool clearLock = true;
private void ClearPanel(BaseEventData baseEventData)
2021-03-29 20:32:30 +08:00
{
2021-04-15 10:13:01 +08:00
if (clearLock)
{
clearLock = false;
leftPanel.transform.DOLocalMove(new Vector3(leftPanel.transform.localPosition.x + isSimple * -430f, leftPanel.transform.localPosition.y, leftPanel.transform.localPosition.z), 1);
titlePanel.transform.DOLocalMove(new Vector3(titlePanel.transform.localPosition.x, titlePanel.transform.localPosition.y + isSimple * 180f, titlePanel.transform.localPosition.z), 1);
rightPanel.transform.DOLocalMove(new Vector3(rightPanel.transform.localPosition.x + isSimple * 330f, rightPanel.transform.localPosition.y, rightPanel.transform.localPosition.z), 1).onComplete += () =>
{
clearLock = true;
isSimple *= -1;
};
}
}
private int maxCacheDataNumber = 100;//海拔图最大点数
private int totalCount;//路线实际点数
private int startIndex;//选中玩家起始索引
private int interval = 50;//选中玩家移动索引个数
private float[] elevationList;
//初始化海拔图
2021-03-28 18:17:15 +08:00
void RenderChart()
{
elevationChart.ClearData();
elevationList = mainController.GetLineChartData();
totalCount = elevationList.Length;
maxCacheDataNumber = Math.Min(totalCount, maxCacheDataNumber);
elevationChart.SetMaxCache(maxCacheDataNumber);
//for (int i = 0; i < maxCacheDataNumber; i++)
//{
// elevationChart.AddData(0, elevationList[i]);
//}
//elevationChart.RefreshChart();
ElevationToScreenPoint();
var endIndex = playerController.CurrentIndex;
var s = endIndex / maxCacheDataNumber;
var v = endIndex % maxCacheDataNumber;
maxCacheDataNumber = Math.Min(totalCount-s* maxCacheDataNumber, maxCacheDataNumber);
for (int i = 0; i < maxCacheDataNumber; i++)
2021-03-28 18:17:15 +08:00
{
initCount++;
if (initCount > maxCacheDataNumber) break;
AddOneData(s * maxCacheDataNumber + v + i);
2021-03-28 18:17:15 +08:00
}
elevationChart.RefreshChart();
2021-04-12 17:35:56 +08:00
if (App.CurrentUser != null)
{
Utils.DisplayImage(StartCoroutine, img, App.CurrentUser.WxHeadImg);
}
}
//长路线动态更新chart
private int initCount;
private float updateTime;
private int lastIndex;
private int chartAddNum;
void UpdateRealTimeChart()
{
var endIndex = playerController.CurrentIndex;
updateTime += Time.deltaTime;
if (updateTime >= 1)
{
int delta = endIndex - lastIndex;
if (delta >0 && initCount < totalCount)
{
lastIndex = endIndex;
AddOneData(initCount);
initCount++;
updateTime = 0;
chartAddNum++;
}
var v = (endIndex - chartAddNum) % maxCacheDataNumber;
//MoveChartMarkPoint(v);
2021-04-15 17:09:35 +08:00
App.CurrentUserHeadTexture = img.texture;
}
}
void AddOneData(int index)
{
2021-04-15 10:13:01 +08:00
string category = index.ToString();
elevationChart.AddData(0, elevationList[index]);
2021-04-15 10:13:01 +08:00
//elevationChart.AddXAxisData(category);
//elevationChart.AddXAxisData(index.ToString(), index);
2021-03-28 18:17:15 +08:00
}
private Dictionary<int, Vector2> pointMap = new Dictionary<int, Vector2>();
void ElevationToScreenPoint()
2021-03-28 18:17:15 +08:00
{
var xUnit =(float) Math.Round(854f * (Screen.width/1600f) / elevationList.Length);//x单位
var maxelev = (float)elevationList.Max();
var yUnit =(float)Math.Round(46f * (Screen.height / 900f) / maxelev);//y单位
var xoffset = 373f * (Screen.width / 1600f);
var yoffset = 175f * (Screen.height / 900f);
for (int i = 0; i < elevationList.Length; i++)
2021-03-29 20:32:30 +08:00
{
var c = new Vector2(i*xUnit+ xoffset, elevationList[i]*yUnit + yoffset);
pointMap.Add(i, c);
2021-03-29 20:32:30 +08:00
}
2021-03-28 18:17:15 +08:00
}
public GameObject testButton;
void MoveChartMarkPoint()
{
//var dataPoints = elevationChart.series.list[0].dataPoints.OrderBy(c => c.x).ToList();
//if (dataPoints.Count > 0)
//{
// var pinLoction = dataPoints[index];
// pinLoction.y = img.transform.localPosition.y;
// img.transform.localPosition = pinLoction;
//}
//if (pointMap.ContainsKey(playerController.CurrentIndex-1) )
//{
// Vector3 mousePos;
// //testButton.transform.localPosition = new Vector3(pointMap[playerController.CurrentIndex - 1].x, pointMap[playerController.CurrentIndex - 1].y, 0);
// //RectTransformUtility.ScreenPointToLocalPointInRectangle(transform.parent.GetComponent<RectTransform>(), new Vector3(pointMap[playerController.CurrentIndex - 1].x , pointMap[playerController.CurrentIndex - 1].y, 0), null, out mousePos);
// ((RectTransform)testButton.transform).position = new Vector3(pointMap[playerController.CurrentIndex - 1].x, pointMap[playerController.CurrentIndex - 1].y, 0);
// //testButton.transform.position = new Vector3( pointMap[index].x, 229f, 0);
// //testButton.transform.position = new Vector3(pointMap[playerController.CurrentIndex-1].x, pointMap[playerController.CurrentIndex-1].y, 0);
// //testButton.transform.DOMove(new Vector3(pointMap[playerController.CurrentIndex].x, pointMap[playerController.CurrentIndex].y,0),1).on;
// //testButton.transform.DOLocalMove(new Vector3(pointMap[playerController.CurrentIndex - 1].x-Screen.width/2, pointMap[playerController.CurrentIndex - 1].y, 0),0.5f);
// //pointMap.Remove(playerController.CurrentIndex - 1);
//}
}
}
}