部分代码重构

This commit is contained in:
lishuo committed 2023-05-15 15:11:50 +08:00
1 parent 431d128ad8
commit 191efae2dd
46 files changed
+214 -209

No files matched your search

@@ -0,0 +1,136 @@
using ChartAndGraph;
using System;
using System.Linq;
using UnityEngine;
using Assets.Scenes.Ride.Scripts.Model.RiderModels;
namespace Assets.Scripts.Scenes.VideoRide
{
public class ElevationBarDataFeed : MonoBehaviour
{
VideoGameManager manager { get; set; }
[SerializeField]
Material _lightColor;
[SerializeField]
Material _mediumColor;
[SerializeField]
Material _hardColor;
[SerializeField]
Material _heavyColor;
GameObject headPanel { get; set; }
void Start()
{
manager= FindObjectOfType<VideoGameManager>();
BarChart barChart = GetComponent<BarChart>();
barChart.DataSource.ClearCategories();
barChart.DataSource.ClearValues();
if (barChart != null)
{
var list = manager.GetMapData().List;
for (int i = 0; i < list.Count; i++)
{
barChart.DataSource.AddCategory($"Player {i}", getChartMaterial(list[i].Grade));
barChart.DataSource.SetValue($"Player {i}", "Group 1", list[i].Elevation);
}
}
headPanel = Resources.Load<GameObject>("UI/Prefab/AR/HeadPanel");
}
float timer = 1f;
private void Update()
{
timer -= Time.deltaTime;
while (timer < 0)
{
timer += 0.5f;
}
MoveOnlinePlayerHead();
}
//移动海拔线上人物位置
private void MoveOnlinePlayerHead()
{
if (manager.cyclingController == null)
return;
var players = manager.cyclingController.riders;
players = players.Where(c => ((OnlineRiderModel)c).IsWatcher == false).ToList();
var headList = FindObjectsOfType<HeadScript>();
var videoPlayer = manager.CurrentPlayer;
foreach (var item in players)
{
BarChart barChart = GetComponent<BarChart>();
Vector3 vector3 = Vector3.back;
var distance = item.EndDistance; //% manager.mapRoute.Distance;
var currentIndex = Mathf.Clamp((float)(distance / manager.mapRoute.Distance * manager.GetMapData().List.Count),0, manager.GetMapData().List.Count-1);
barChart.GetBarTrackPosition($"Player {Math.Round(currentIndex,0)}", "Group 1", out vector3);
var currentHead = headList.Where(c => c.UserId == item.UserId).FirstOrDefault();
if (currentHead == null)
{
var onlineHead = Instantiate(headPanel, transform);
onlineHead.GetComponent<HeadScript>().UserId = item.UserId;
onlineHead.transform.position = vector3;
currentHead = onlineHead.GetComponent<HeadScript>();
}
else
{
currentHead.transform.position = vector3;
}
//控制海拔图头像
if (manager.CurrentUserId == item.UserId)
{
currentHead.transform.Find("Main").gameObject.SetActive(true);
currentHead.transform.SetAsLastSibling();
}
else
{
currentHead.transform.Find("Main").gameObject.SetActive(false);
currentHead.transform.SetAsFirstSibling();
}
}
//删除离线的人
foreach (var item in headList)
{
if (item.UserId != 0)
{
var player = players.Where(c => c.UserId == item.UserId).FirstOrDefault();
if (player == null)
{
item.gameObject.Destroy();
}
}
}
}
private ChartDynamicMaterial getChartMaterial(double grade = 0d)
{
//1: ≥7°坡 红色
//2: 3°~7°坡 橙色
//3: 0°~3°坡 黄色
//4: ≤0°坡 绿色
ChartDynamicMaterial chartDynamicMaterial;
if (grade > 7)
{
chartDynamicMaterial = new ChartDynamicMaterial(_heavyColor);
}
else if (grade > 3)
{
chartDynamicMaterial = new ChartDynamicMaterial(_hardColor);
}
else if (grade > 0)
{
chartDynamicMaterial = new ChartDynamicMaterial(_mediumColor);
}
else
{
chartDynamicMaterial = new ChartDynamicMaterial(_lightColor);
}
return chartDynamicMaterial;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c3b2e5abc80332645b6ab677873adeec
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,33 @@
using UnityEngine;
using UnityEngine.UI;
namespace Assets.Scripts.Scenes.VideoRide
{
public class ExplosiveScript : MonoBehaviour
{
Image image;
private void Awake()
{
image = transform.GetComponent<Image>();
}
float flag = 0f;
float alph = 0f;
private void Update()
{
flag += Time.deltaTime;
if (flag >= 0.5f)
{
alph -= Time.deltaTime;
if (alph <= 0)
{
flag = 0;
}
}
else
{
alph += Time.deltaTime;
}
image.color = new Color(image.color.r, image.color.g, image.color.b, alph);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 7a04020ffe9892d498bfe3031bac76ce
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+18
View File
@@ -0,0 +1,18 @@
using UnityEngine;
namespace Assets.Scripts.Scenes.VideoRide
{
public class HeadScript : MonoBehaviour
{
public string UserName { get; set; }
public int UserId { get; set; }
private void Start()
{
}
private void Update()
{
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1092a970c15e99c47b4fce5495b5a7f2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+82
View File
@@ -0,0 +1,82 @@
using PolyAndCode.UI;
using System;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.Scripts.Scenes.VideoRide
{
public class ListItem : MonoBehaviour, ICell
{
//UI
public Text nameLabel;
public Text genderLabel;
public Text idLabel;
public Text powerLabel;
public GameObject master;
//Model
private ContactInfo _contactInfo;
private int _cellIndex;
public string Id;
public string Rank;
public string Name;
private float timer = 1f;
private VideoGameManager manager { get; set; }
private void Start()
{
manager = FindObjectOfType<VideoGameManager>();
GetComponent<Button>().onClick.AddListener(ButtonListener);
}
private void Update()
{
timer -= Time.deltaTime;
while (timer < 0)
{
if (manager != null)
{
var riders = manager.cyclingController?.riders;
if (riders != null)
{
var current = riders.FirstOrDefault(c => c.UserId.ToString() == Id);
if (current == null)
{
gameObject.SetActive(false);
gameObject.Destroy();
}
}
}
timer += 1f;
}
}
//This is called from the SetCell method in DataSource
public void ConfigureCell(ContactInfo contactInfo, int cellIndex)
{
Id = contactInfo.id;
_cellIndex = cellIndex;
_contactInfo = contactInfo;
nameLabel.text = contactInfo.Name;
genderLabel.text = contactInfo.Gender;
idLabel.text = contactInfo.id;
powerLabel.text = contactInfo.Power.ToString("f0") + "W";
}
public void UpdateItem(string name,string gender,string id)
{
nameLabel.text = name;
genderLabel.text = gender;
idLabel.text = id;
master.SetActive(manager.CurrentPlayer?.UserId.ToString() == id);
}
private void ButtonListener()
{
if(manager._aRMode == VideoGameManager.ARMode.INSPECT)
manager.ChangePlayer(Convert.ToInt32(Id));
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 057cbb0cadd9caf4c9031a94f9ca6d39
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,83 @@
using Assets.Scenes.Ride.Scripts;
using DG.Tweening;
using System.Linq;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
namespace Assets.Scripts.Scenes.VideoRide
{
public class NearByScript: MonoBehaviour
{
Text rideNum {get;set;}
Text btnRideNum { get; set; }
GameObject Hide { get; set; }
GameObject Show { get; set; }
VideoPlayer videoPlayer { get; set; }
private bool isAnimating = false;
VerticalLayoutGroup group { get; set; }
GameObject stickyItem { get; set; }
VideoGameManager manager { get; set; }
RectTransform viewRec { get; set; }
private void Start()
{
rideNum = transform.Find("Head/RideNum/Number").GetComponent<Text>();
btnRideNum = transform.Find("Head/Show/Panel/Number").GetComponent<Text>();
Hide = transform.Find("Head/Hide").gameObject;
Show = transform.Find("Head/Show").gameObject;
var viewPort = transform.Find("List/Viewport");
stickyItem = transform.Find("List/VideoPlayerInfo").gameObject;
UIManager.AddEvent(Hide, UnityEngine.EventSystems.EventTriggerType.PointerClick, Hidehandler);
UIManager.AddEvent(Show, UnityEngine.EventSystems.EventTriggerType.PointerClick, Showhandler);
manager = FindObjectOfType<VideoGameManager>();
viewRec = ((RectTransform)viewPort);
}
public void Hidehandler(BaseEventData data)
{
if (isAnimating)
return;
isAnimating = true;
transform.DOLocalMoveX(913, 1f).onComplete += () => {
Show.SetActive(true);
Hide.SetActive(false);
isAnimating = false;
};
}
public void Showhandler(BaseEventData data)
{
if (isAnimating)
return;
isAnimating = true;
Show.SetActive(false);
Hide.SetActive(true);
transform.DOLocalMoveX(667.55f, 1f).onComplete += () => {
isAnimating = false;
};
}
float timer = 1f;
private void Update()
{
timer -= Time.deltaTime;
while (timer < 0) {
var list = MapUDPService.GetOnlineUsers(App.RouteIdParam);//最新列表
list = list.Where(c => c.IsWatcher == false).ToList();
rideNum.text = $"{list.Count}";
btnRideNum.text = rideNum.text;
if (manager._aRMode == VideoGameManager.ARMode.RIDE)
{
stickyItem.SetActive(true);
viewRec.DOLocalMoveY(256, 0f);
viewRec.DOSizeDelta(new Vector2(viewRec.sizeDelta.x, 546), 0);
}
else
{
stickyItem.SetActive(false);
viewRec.DOLocalMoveY(300, 0f);
viewRec.DOSizeDelta(new Vector2(viewRec.sizeDelta.x,590f), 0);
}
timer += 1f;
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 626b431b9a468f94b89fce5f20a2cc36
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,151 @@
using Assets.Scenes.Ride.Scripts;
using Assets.Scenes.Ride.Scripts.Model.RiderModels;
using PolyAndCode.UI;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.Scripts.Scenes.VideoRide
{
public class ContactInfo
{
public string Name;
public string Gender;
public string id;
public double Power;
}
class NearVideoPlayerList : MonoBehaviour, IRecyclableScrollRectDataSource
{
[SerializeField]
RecyclableScrollRect _recyclableScrollRect;
[SerializeField]
RectTransform _rectTransform;
[SerializeField]
private int _dataLength;
private bool _isInit;
//Dummy data List
private List<ContactInfo> _contactList = new List<ContactInfo>();
private VideoGameManager manager { get; set; }
//Recyclable scroll rect's data source must be assigned in Awake.
private void Awake()
{
InitData();
_recyclableScrollRect.DataSource = this;
manager = FindObjectOfType<VideoGameManager>();
}
private void InitData()
{
if (_contactList != null) _contactList.Clear();
var list = MapUDPService.GetOnlineUsers(App.RouteIdParam);
list = list.Where(c => c.IsWatcher == false).ToList();
var currentPlayer = list.Where(c => c.IsSelf).FirstOrDefault();
list = list.Where(c => c.Id != App.CurrentUser.Id).ToList();
foreach (var item in list)
{
_isInit = true;
ContactInfo obj = new ContactInfo();
obj.Name = item.Name;
obj.Gender = "";
obj.id = item.Id.ToString();
obj.Power = item.Power;
_contactList.Add(obj);
}
}
float timer = 1f;
private void Update()
{
timer -= Time.deltaTime;
while (timer < 0)
{
if (manager.CurrentPlayer == null)
return;
var totalDitance = manager.GetMapData().TotalDistance;
var currentDistance = manager.CurrentPlayer.totalDistance;
var currenList = GetComponentsInChildren<ListItem>(true);
var list = MapUDPService.GetOnlineUsers(App.RouteIdParam,manager.cyclingController.recorderData.RoomId);//最新列表
list = list.Where(c => c.IsWatcher == false).ToList();
var currentPlayerInfo = list.Where(c => c.Id.ToString() == manager.CurrentPlayer.UserId.ToString()).FirstOrDefault();
list = list.Where(c => c.Id != App.CurrentUser.Id).OrderByDescending(c=>c.EndDistance).ToList();
if (currenList.Count() == 0 && list.Count() > 0)
{
InitData();
if (_recyclableScrollRect.SelfInitialize)
{
_recyclableScrollRect.ReloadData();
}
}
var currentPlayer = manager.CurrentPlayer;
if (currentPlayer == null)
return;
foreach (ListItem o in currenList)
{
if (currentPlayer.UserId.ToString() == o.Id)
continue;
var needUpdate = list.Where(c => c.Id.ToString() == o.Id).FirstOrDefault();
if (needUpdate != null && currentPlayerInfo != null)
{
var left = Math.Round((needUpdate.EndDistance - currentPlayerInfo.EndDistance) * 1000);
o.UpdateItem(needUpdate.Name, left.ToString() + "M", needUpdate.Id.ToString());
o.gameObject.SetActive(true);
o.transform.SetSiblingIndex((int)left);
}
else
{
o.gameObject.SetActive(false);
}
}
foreach (var item in list)
{
var newOne = _contactList.Where(c => c.id == item.Id.ToString()).FirstOrDefault();
if (newOne == null)
{
var one = new ContactInfo();
one.Name = item.Name;
one.Gender = "";
one.id = item.Id.ToString();
_contactList.Add(one);
_recyclableScrollRect.ReloadData();
}
}
timer +=1f;
}
}
#region DATA-SOURCE
/// <summary>
/// Data source method. return the list length.
/// </summary>
public int GetItemCount()
{
return _contactList.Count;
}
/// <summary>
/// Data source method. Called for a cell every time it is recycled.
/// Implement this method to do the necessary cell configuration.
/// </summary>
public void SetCell(ICell cell, int index)
{
//Casting to the implemented Cell
var item = cell as ListItem;
item.ConfigureCell(_contactList[index], index);
}
#endregion
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ad9c66572ce69ea4fba3bc35e6db3d86
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,44 @@
using UnityEngine;
using UnityEngine.UI;
namespace Assets.Scripts.Scenes.VideoRide
{
public class RankingItemScript:MonoBehaviour
{
Text rankingText;
Text nameText;
Text timerText;
RawImage head;
RawImage country;
private void Awake()
{
rankingText = transform.Find("Rank").GetComponent<Text>();
nameText = transform.Find("Name").GetComponent<Text>();
timerText = transform.Find("Distance").GetComponent<Text>();
// head = transform.Find("Head").GetComponent<RawImage>();
country = transform.Find("Country").GetComponent<RawImage>();
}
public void SetRanking(string ranking)
{
rankingText.text = ranking.PadLeft(2,'0');
}
public void SetName(string name)
{
nameText.text = name;
}
public void SetTimer(string timer)
{
timerText.text = timer;
}
public void SetHead(string url)
{
Utils.DisplayImage(head, url);
}
public void SetCountry(Texture texture)
{
country.texture = texture;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8032c539f5d80584da36ae53a0f52e1a
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,115 @@
using UnityEngine;
using UnityEngine.EventSystems;
using DG.Tweening;
using UnityEngine.UI;
namespace Assets.Scripts.Scenes.VideoRide
{
public class RankingScript: MonoBehaviour
{
GameObject Hide { get; set; }
GameObject Show { get; set; }
GameObject Month { get; set; }
GameObject Week { get; set; }
GameObject Day { get; set; }
VideoGameManager manager { get; set; }
Transform Container { get; set; }
Text MonthTxt { get; set; }
Text WeekTxt { get; set; }
Text DayTxt { get; set; }
private bool isAnimating = false;
private void Start()
{
Hide = transform.Find("Head/Hide").gameObject;
Show = transform.Find("Head/Show").gameObject;
Month = transform.Find("Head/Month").gameObject;
Week = transform.Find("Head/Week").gameObject;
Day = transform.Find("Head/Day").gameObject;
MonthTxt = transform.Find("Head/Month/Text").GetComponent<Text>();
MonthTxt.color = Color.red;
WeekTxt = transform.Find("Head/Week/Text").GetComponent<Text>();
DayTxt = transform.Find("Head/Day/Text").GetComponent<Text>();
manager = FindObjectOfType<VideoGameManager>();
Container = transform.Find("List/Viewport/Content");
Month.GetComponent<Text>();
UIManager.AddEvent(Hide, UnityEngine.EventSystems.EventTriggerType.PointerClick, Hidehandler);
UIManager.AddEvent(Show, UnityEngine.EventSystems.EventTriggerType.PointerClick, Showhandler);
UIManager.AddEvent(Month, UnityEngine.EventSystems.EventTriggerType.PointerClick, MonthClick);
UIManager.AddEvent(Week, UnityEngine.EventSystems.EventTriggerType.PointerClick, WeekClick);
UIManager.AddEvent(Day, UnityEngine.EventSystems.EventTriggerType.PointerClick, DayClick);
#if UNITY_EDITOR
UIManager.InitNow();//重置当前时间
#endif
Refresh();
}
//TODO: 重构
private void Refresh(string type = "month")
{
return;
var list = manager.GetRankingList(type);
if (list != null)
{
var prefab = Resources.Load<GameObject>("UI/Prefab/AR/RankingItem");
Container.DestroyChildren();
foreach (var item in list.list)
{
GameObject newObj = (GameObject)Instantiate(prefab, Container);
var itemScript = newObj.GetComponent<RankingItemScript>();
itemScript.SetName(item.NickName);
var texture = manager.GetCountryImageByCode(item.CountryCode);
itemScript.SetCountry(texture);
itemScript.SetTimer(item.TotalTime);
}
}
}
public void Hidehandler(BaseEventData data)
{
if (isAnimating)
return;
isAnimating = true;
transform.DOLocalMoveX(-913, 1f).onComplete+=()=> {
Show.SetActive(true);
Hide.SetActive(false);
isAnimating = false;
};
}
public void Showhandler(BaseEventData data)
{
if (isAnimating)
return;
isAnimating = true;
Show.SetActive(false);
Hide.SetActive(true);
transform.DOLocalMoveX(-667, 1f).onComplete += () => {
isAnimating = false;
};
}
public void MonthClick(BaseEventData data)
{
MonthTxt.color = Color.red;
WeekTxt.color = Color.white;
DayTxt.color = Color.white;
Refresh("month");
}
public void WeekClick(BaseEventData data)
{
MonthTxt.color = Color.white;
WeekTxt.color = Color.red;
DayTxt.color = Color.white;
Refresh("week");
}
public void DayClick(BaseEventData data)
{
MonthTxt.color = Color.white;
WeekTxt.color = Color.white;
DayTxt.color = Color.red;
Refresh("day");
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c5125c2c61c26934d858b75fa9dfd187
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,25 @@
using UnityEngine.UI;
namespace Assets.Scripts.Scenes.VideoRide
{
public class RideSettingController : PFUIPanel
{
public Slider PowerSlider;
public Text PowerText;
private VideoGameManager manager;
void Start()
{
manager = FindObjectOfType<VideoGameManager>();
//设置模拟功率
PowerSlider.onValueChanged.AddListener(e =>
{
PowerText.text = e.ToString("f0") + "W";
if (manager.CurrentPlayer != null)
{
manager.CurrentPlayer.mockpower = e;
}
});
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8c630a81d1477c842ad1599135a73d2d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,37 @@
using PolyAndCode.UI;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.Scripts.Scenes.VideoRide
{
public class StickyListItem : MonoBehaviour, ICell
{
//UI
public Text nameLabel;
public Text distanceLabel;
public GameObject master;
//Model
private ContactInfo _contactInfo;
private int _cellIndex;
public string Id;
public string Rank;
public string Name;
private VideoPlayer videoPlayer { get; set; }
private float timer = 1f;
private void Update()
{
timer -= Time.deltaTime;
while (timer < 0)
{
videoPlayer = FindObjectOfType<VideoPlayer>();
if (videoPlayer != null)
{
nameLabel.text = videoPlayer.UserName;
distanceLabel.text = "0M";///videoPlayer.totalDistance.ToString("f1");
Id = videoPlayer.UserId.ToString();
}
timer += 1f;
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: c5b781a8c7954144ea7de573333f09ed
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
+466
View File
@@ -0,0 +1,466 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
using UnityEngine.SceneManagement;
using UnityEngine.EventSystems;
using Assets.Scenes.Ride.Scripts;
using Assets.Scripts.Apis.Models;
using System.Linq;
using Assets.Scenes.Ride.Scripts.Model;
using Assets.AR;
using System.Threading.Tasks;
using System.Threading;
namespace Assets.Scripts.Scenes.VideoRide
{
public class VideoLoading : MonoBehaviour, IProgress<float>
{
VideoGameManager manager { get; set; }
private Text mapName;
private RawImage mapRouteImage;
private CanvasGroup canvasGroup;
private Slider slider;
private Text processText;
private Text rideNowText;
private Button rideNow;
private Button cancel;
private Text mapDescText;
private Text distance;
private Text elevaction;
private Text slope;
private GameObject panel;
private GameObject download;
private GameObject watch;
protected GameObject loadingPanel { get; set; }
private Text level;
private Text rideNum;
private Text uploadByUserName;
private RawImage head;
private RawImage country;
private RawImage mapCountry;
private RawImage altitudeGraph { get; set; }
private Transform mapRanking;
private Text mapId;
private Text downloadText { get; set; }
private Transform ui;
private MapRoute route;
protected float process = 0;//0-100 %
private bool startBtnLock = false;
private void Awake()
{
if(App.gameRoomDetail != null)
ShowGameRoomLoading();
}
private void Start()
{
manager = FindObjectOfType<VideoGameManager>();
ui = manager.GetCanvasTransform();
route = manager.GetMapRoute();
}
public void Init()
{
InitGameObject();
InitGameObjectData();
}
private void ShowGameRoomLoading()
{
UIManager.SetModalPanel(transform.Find("ModalPanel").GetComponent<PFUIPanel>());
UIManager.ShowGameRoomLoadingPanel();
}
private void InitGameObject()
{
panel = transform.Find("Panel").gameObject;
mapName = panel.transform.Find("MapName").GetComponent<Text>();
distance = panel.transform.Find("Distance").GetComponent<Text>();
elevaction = panel.transform.Find("Elevaction").GetComponent<Text>();
slope = panel.transform.Find("Slope").GetComponent<Text>();
mapRouteImage = panel.transform.Find("MapRouteImage").GetComponent<RawImage>();
slider = panel.transform.Find("Process").GetComponent<Slider>();
slider.gameObject.SetActive(true);
processText = panel.transform.Find("ProcessText").GetComponent<Text>();
processText.gameObject.SetActive(false);
mapDescText = panel.transform.Find("MapDesc").GetComponent<Text>();
rideNow = panel.transform.Find("RideNow").GetComponent<Button>();
rideNowText = rideNow.transform.Find("Text").GetComponent<Text>();
cancel = panel.transform.Find("Cancel").GetComponent<Button>();
UIManager.AddEvent(rideNow.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, StartRide);
UIManager.AddEvent(cancel.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, Cancel);
slider.onValueChanged.AddListener((f) =>
{
processText.text = $"{(f).ToString("#0")}%";
});
download = transform.Find("Panel/Download").gameObject;
watch = transform.Find("Panel/Watch").gameObject;
UIManager.AddEvent(watch, UnityEngine.EventSystems.EventTriggerType.PointerClick, WatchHandler);
canvasGroup = transform.GetComponent<CanvasGroup>();
var fileName = route.FileName;// "12067924_720p.mp4";
var url = route.Url; //@"http://192.168.0.97:6031/12067924_720p.mp4";
var path = PFConstants.VideoFolder;
var filepath = path + "/" + fileName;
if (File.Exists(filepath))
{
watch.SetActive(true);
slider.value = 100;
download.gameObject.SetActive(false);
manager.SetMedia(filepath);
}
else
{
watch.SetActive(false);
//检查本地文件是否存在 如果存在直接设置mediaPlayer 否则显示下载按钮
UIManager.AddEvent(download.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, DownloadAsync);
}
#region
level = panel.transform.Find("level/Text").GetComponent<Text>();
rideNum = panel.transform.Find("RideNum").GetComponent<Text>();
uploadByUserName = panel.transform.Find("UploadByUserName").GetComponent<Text>();
country = panel.transform.Find("UploadByCountry").GetComponent<RawImage>();
mapCountry = panel.transform.Find("Country").GetComponent<RawImage>();
head = panel.transform.Find("UploadByHead").GetComponent<RawImage>();
altitudeGraph = panel.transform.Find("AltitudeGraph").GetComponent<RawImage>();
mapRanking = panel.transform.Find("MapRanking");
mapId = panel.transform.Find("MapId").GetComponent<Text>();
UIManager.RemoveEvent(distance.gameObject);
UIManager.RemoveEvent(slope.gameObject);
UIManager.RemoveEvent(elevaction.gameObject);
UIManager.RemoveEvent(rideNum.gameObject);
UIManager.AddEvent(distance.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerEnter, b =>
{
panel.transform.Find("DistanceTip").GetComponent<CanvasGroup>().DOFade(1, 0.5f);
});
UIManager.AddEvent(distance.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerExit, b =>
{
panel.transform.Find("DistanceTip").GetComponent<CanvasGroup>().DOFade(0, 0.5f);
});
UIManager.AddEvent(slope.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerEnter, b =>
{
panel.transform.Find("SlopeTip").GetComponent<CanvasGroup>().DOFade(1, 0.5f);
});
UIManager.AddEvent(slope.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerExit, b =>
{
panel.transform.Find("SlopeTip").GetComponent<CanvasGroup>().DOFade(0, 0.5f);
});
UIManager.AddEvent(elevaction.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerEnter, b =>
{
panel.transform.Find("ElevactionTip").GetComponent<CanvasGroup>().DOFade(1, 0.5f);
});
UIManager.AddEvent(elevaction.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerExit, b =>
{
panel.transform.Find("ElevactionTip").GetComponent<CanvasGroup>().DOFade(0, 0.5f);
});
UIManager.AddEvent(rideNum.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerEnter, b =>
{
panel.transform.Find("RideTip").GetComponent<CanvasGroup>().DOFade(1, 0.5f);
});
UIManager.AddEvent(rideNum.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerExit, b =>
{
panel.transform.Find("RideTip").GetComponent<CanvasGroup>().DOFade(0, 0.5f);
});
#endregion
downloadText = rideNow.GetComponentInChildren<Text>();//视频下载进度text
}
protected void InitGameObjectData()
{
var route = manager.mapRoute;
#region 绑定路书基本信息
mapName.text = route.Name.ToEllipsisString(40);
level.text = route.Hard;
elevaction.text = Math.Round(route.TotalClimb.GetValueOrDefault(0), 2) + "M";
slope.text = Math.Round(route.AverageGrade, 2) + "%";
rideNum.text = route.TheHeat.ToString();
distance.text = route.Distance.ToString("f1") + "KM";
mapDescText.text = route.Dec.ToEllipsisString(255);
mapId.text = $"#{route.Id.ToString()}";
var userList = ConfigHelper.mapApi.GetOnlineUserInfo(new int[] { route.UserId }).data;
if (userList.Count > 0)
{
uploadByUserName.text = userList[0].Name;
var countryUrl = App.Host + $"User/GetCountryImg?userid={userList[0].Id}";
Utils.DisplayImage(head, userList[0].HeadImage);//头像
country.texture = manager.GetCountryImageByName(userList[0].Country);//上传者国家
mapCountry.texture = manager.GetCountryImageByCode(route.CountryCode);//路书国家
}
#endregion
Utils.DisplayImage(altitudeGraph, route.AltitudeGraph,true,null,1f);//渲染海拔图
//显示线路背景图
DrawMapRouteAsync(route.Id);
//查询排行榜 TODO优化
var list = ConfigHelper.mapApi.GetRouteRanking(route.Id, "1", 0, 10000, "");
if (list.result)
{
CreateRankingList(list.data.list);
}
}
private void StartRide(BaseEventData baseEvent)
{
if (startBtnLock) return;
startBtnLock = true;
InitClientState(false);
InitAR();
canvasGroup.DOFade(0, 1).onComplete += () => {
gameObject.SetActive(false);
manager.StartGame();
manager.SetCyclingModel(Assets.Scenes.Ride.Scripts.Model.CyclingModel.Single);
manager.SetCurrentMode(VideoGameManager.ARMode.RIDE);
};
}
private async void InitAR()
{
route = manager.mapRoute;
var arDataPath = $"{PFConstants.ARFolder}/{route.Id}/{route.Id}.json";
var videoRoute = $"{PFConstants.ARFolder}/{route.Id}/route-{route.Id}.json";
ARData aRData = null;
RouteDetailData routeDetailData = null;
await Task.Run<ARData>((Func<ARData>)(() => aRData = ARData.LoadFromFile(arDataPath)));
await Task.Run<RouteDetailData>((Func<RouteDetailData>)(() => routeDetailData = RouteDetailData.LoadFromFile(videoRoute)));
var arController = FindObjectOfType<ARTrainingController>();
arController.Initialize(aRData, routeDetailData);
}
public void StartRide(int seconds)
{
InitClientState(false);
var ui = manager.GetCanvasTransform();
canvasGroup.DOFade(0, 0).onComplete += () => {
InitAR();
gameObject.SetActive(false);
manager.SetCyclingModel(CyclingModel.GameRoom);
manager.SetCurrentMode(VideoGameManager.ARMode.RIDE);
ui.Find("Panel").gameObject.SetActive(true);
};
UIManager.ShowGameRoomCountDownPanel(seconds,()=> {
manager.StartGame();
},false,true);
}
private bool downloading = false;
private CancellationTokenSource cancelToken;
private async void DownloadAsync(BaseEventData baseEvent)
{
if (downloading)
return;
beforeDownload();
await startDownloading();
}
private void beforeDownload()
{
downloading = true;
download.SetActive(false);
rideNow.enabled = false;
rideNow.interactable = false;
downloadText.text = "0%";
}
private async Task startDownloading()
{
var route = manager.mapRoute;
var path = PFConstants.VideoFolder;
var localPath = PFConstants.ARFolder;
var arDataPath = route.ARConfig;
var videoRoute = route.VideoRoute;
var dataPath = $"{localPath}/{route.Id}";
Helper.CreateDirectoryIfNotExsit(dataPath);
Helper.CreateDirectoryIfNotExsit(dataPath);
cancelToken = new CancellationTokenSource();
await Loom.DownloadToFileAsync(arDataPath, $"{dataPath}/{route.Id}.json");
await Loom.DownloadToFileAsync(videoRoute, $"{dataPath}/route-{route.Id}.json");
var res = await Loom.DownloadToFileAsync(route.Url, $"{path}/{route.FileName}",this,cancelToken);
if (res.isDone)
{
var filepath = $"{PFConstants.VideoFolder}/{route.FileName}";
manager.SetMedia(filepath);
rideNow.enabled = true;
rideNow.interactable = true;
downloadText.text = App.GetLocalString("Ride Now");
downloading = false;
}
}
public void Report(float value)
{
if (cancelToken.IsCancellationRequested)
return;
slider.value = value < 1 ? (float)Math.Round(value * 100, 0) : 100;
downloadText.text = slider.value.ToString(CultureInfo.InvariantCulture) + "%";
}
//进入观察模式
private void WatchHandler(BaseEventData data)
{
InitAR();
InitClientState(true);
var canvas = transform.GetComponent<CanvasGroup>();
var canvasTransform = manager.GetCanvasTransform();
canvas.DOFade(0, 1).onComplete += () => {
gameObject.SetActive(false);
canvasTransform.gameObject.SetActive(true);
manager.SetCurrentMode(VideoGameManager.ARMode.INSPECT);
manager.StartGame();
};
}
/// <summary>
/// 告诉服务器是观察模式还是骑行模式
/// </summary>
/// <param name="isWatch"></param>
private static void InitClientState(bool isWatch)
{
MapUDPService.IsWatch = isWatch;
MapUDPService.SendGizpModel();
}
private void Cancel(BaseEventData baseEvent)
{
if (cancelToken == null)
{
SceneManager.LoadSceneAsync("MainScene");
return;
}
UIManager.SetModalPanel(transform.Find("ModalPanel").GetComponent<PFUIPanel>());
UIManager.ShowConfirm("Tips", "CancelDownloadConfirm",
() =>
{
cancelToken?.Cancel();
SceneManager.LoadSceneAsync("MainScene");
UIManager.CloseConfirm();
},
2,
() =>
{
UIManager.CloseConfirm();
});
}
private async void DrawMapRouteAsync(int routeId, int type = 0)
{
var result = await ConfigHelper.mapApi.GetMapLoadingCoverageUrl(routeId, type);
if (!result.result)
return;
var url = result.data;
if (App.TextureCache.ContainsKey(url))
{
mapRouteImage.texture = App.TextureCache[url];
var canvasGroup = mapRouteImage.GetComponent<CanvasGroup>();
canvasGroup.DOFade(1, 1);
}
else
{
Utils.DisplayImageAysnc(StartCoroutine, mapRouteImage, url, DowloadCallBack);
}
}
private void DowloadCallBack(string url, RawImage rawImage)
{
if (!App.TextureCache.ContainsKey(url))
{
App.TextureCache.Add(url, rawImage?.texture);
}
else
{
App.TextureCache[url] = rawImage?.texture;
}
var canvasGroup = rawImage.GetComponent<CanvasGroup>();
canvasGroup?.DOFade(1, 1);
}
private int RankingPageSize = 10;
//创建排行榜
public void CreateRankingList(List<MapRouteRanking> list)
{
var prefab = Resources.Load<GameObject>("UI/Prefab/Ride/RankingItem");
var myprefab = Resources.Load<GameObject>("UI/Prefab/Ride/MySelfRankingItem");
var viewAllbtn = Resources.Load<GameObject>("UI/Prefab/Ride/ViewAll");
var parent = panel.transform.Find("MapRanking");
var title = panel.transform.Find("RankingTitle").gameObject;
title.SetActive(list.Count != 0);
int index = 0;
foreach (var item in list)
{
index++;
if (index > RankingPageSize)
break;
GameObject newObj = (GameObject)Instantiate(prefab, parent);
var selectPlayerItemScript = newObj.GetComponent<Assets.Scenes.Ride.Scripts.RankingItemScript>();
selectPlayerItemScript.SetRanking(item.RowNumber.ToString());
selectPlayerItemScript.SetName(item.NickName);
selectPlayerItemScript.SetTimer(item.IsDNF ? "DNF" : item.TotalTime);
selectPlayerItemScript.SetHead(item.WxHeadImg);
var texture = manager.GetCountryImageByCode(item.CountryCode);
selectPlayerItemScript.SetCountry(texture);
}
//如果有自己的记录显示自己的排名
var myself = list.Where(c => c.MySelf).FirstOrDefault();
GameObject myselfObj = (GameObject)Instantiate(myprefab, parent);
var myselfItemScript = myselfObj.GetComponent<Assets.Scenes.Ride.Scripts.RankingItemScript>();
if (myself == null)
{
myselfItemScript.SetRanking("--");
myselfItemScript.SetName(App.CurrentUser.Nickname);
myselfItemScript.SetTimer("--:--:--");
myselfItemScript.SetHead(App.CurrentUser.WxHeadImg);
var texture = manager.GetCountryImageByName(App.CurrentUser.Country);
myselfItemScript.SetCountry(texture);
}
else
{
myselfItemScript.SetRanking(myself.RowNumber.ToString());
myselfItemScript.SetName(myself.NickName);
myselfItemScript.SetTimer(myself.IsDNF ? "DNF" : myself.TotalTime);
myselfItemScript.SetHead(myself.WxHeadImg);
var texture = manager.GetCountryImageByCode(myself.CountryCode);
myselfItemScript.SetCountry(texture);
}
//显示查询全部按钮
if (list.Count > 0)
{
GameObject ViewAll = (GameObject)Instantiate(viewAllbtn, parent);
UIManager.AddEvent(ViewAll, UnityEngine.EventSystems.EventTriggerType.PointerClick, b =>
{
Application.OpenURL($"{App.CurrentUser.WebHost}Routes/{manager.mapRoute.Id}?Token={App.CurrentUser.cookie}");
});
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 1f3705d27cb576f498459e5540d88906
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,178 @@
using System;
using System.Linq;
using Assets.Scenes.Ride.Scripts.Model;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
using Facebook.Unity;
using Assets.Scenes.Ride.Scripts;
namespace Assets.Scripts.Scenes.VideoRide
{
public class VideoResultScript : MonoBehaviour
{
#region 路书信息
Text date;
Text time;
Text level;
Text mapName;
Text distance;
RawImage country;
RawImage altudeGraph;
#endregion
#region 骑行结果
Text rideTime;
Text rideDistance;
Text totalClimbed;
Text wkgText;
Text avCadence;
Text avHeatrate;
Text maxPower;
Text avPower;
Text maxSpeed;
Text avSpeed;
#endregion
#region 功能按钮
GameObject goResultBtn;
GameObject cancelBtn;
GameObject shareWxBtn;
GameObject shareWxGpButton;
Transform toolbar;
Image DNF;
Image newRecord;
#endregion
VideoGameManager cyclingController;
private void Awake()
{
#region 路书信息
date = transform.Find("MapPanel/Date").GetComponent<Text>();
time = transform.Find("MapPanel/Timer").GetComponent<Text>();
level = transform.Find("MapPanel/Level/Text").GetComponent<Text>();
mapName = transform.Find("MapPanel/MapName").GetComponent<Text>();
distance = transform.Find("MapPanel/Distance").GetComponent<Text>();
country = transform.Find("MapPanel/Country").GetComponent<RawImage>();
altudeGraph = transform.Find("MapPanel/AltudeGraph").GetComponent<RawImage>();
#endregion
#region 骑行记录
rideTime = transform.Find("TimePanel/Timer").GetComponent<Text>();
rideDistance = transform.Find("DistancePanel/Distance").GetComponent<Text>();
totalClimbed = transform.Find("FitPanel/TotalClimbedView/Value").GetComponent<Text>();
wkgText = transform.Find("FitPanel/FTPView/Value").GetComponent<Text>();
avCadence = transform.Find("FitPanel/CadenceView/Value").GetComponent<Text>();
avHeatrate = transform.Find("FitPanel/HeartView/Value").GetComponent<Text>();
maxPower = transform.Find("FitPanel/MaxPowerView/Value").GetComponent<Text>();
avPower = transform.Find("FitPanel/AveragePowerView/Value").GetComponent<Text>();
maxSpeed = transform.Find("FitPanel/MaxSpeedView/Value").GetComponent<Text>();
avSpeed = transform.Find("FitPanel/AverageSpeed/Value").GetComponent<Text>();
#endregion
goResultBtn = transform.Find("ConFirmButton").gameObject;
cancelBtn = transform.Find("CloseButton").gameObject;
toolbar = transform.Find("ToolBarPanel");
#if UNITY_ANDROID || UNITY_IOS
shareWxBtn = transform.Find("ToolBarPanel/WeChatButton").gameObject;
shareWxGpButton = transform.Find("ToolBarPanel/GoogleButton").gameObject;
#endif
DNF = transform.Find("DNF").GetComponent<Image>();
newRecord = transform.Find("TimePanel/NewRecord").GetComponent<Image>();
}
public void InjectController(VideoGameManager controller)
{
cyclingController = controller;
controller.AddEvent(goResultBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, GoResult);
controller.AddEvent(cancelBtn, UnityEngine.EventSystems.EventTriggerType.PointerClick, Cancel);
#if UNITY_ANDROID || UNITY_IOS
cyclingController.AddEvent(shareWxBtn, EventTriggerType.PointerClick, shareToWx);
cyclingController.AddEvent(shareWxGpButton, EventTriggerType.PointerClick, shareToWxGp);
var fbButton = transform.Find("ToolBarPanel/FaceBookButton").gameObject;
cyclingController.AddEvent(fbButton, EventTriggerType.PointerClick, shareToFb);
#endif
}
private void shareToFb(BaseEventData arg0)
{
FB.ShareLink(contentURL: new Uri($"{App.CurrentUser.WebHost}RoutesRecords/{cyclingController.RankingId}?Token={App.CurrentUser.cookie}"),
contentTitle: cyclingController.mapRoute.Name,
contentDescription: "By " + App.CurrentUser.Nickname,
photoURL: new Uri(cyclingController.mapRoute.CoverImage));
}
private void shareToWx(BaseEventData b)
{
if (App.weChatController.IsWeChatAppInstalled())
{
App.weChatController.ShareWebpageToWX(0, $"{App.CurrentUser.WebHost}RoutesRecords/{cyclingController.RankingId}?Token={App.CurrentUser.cookie}", cyclingController.mapRoute.Name, "By " + App.CurrentUser.Nickname, null);
}
else
{
Utils.showToast(null, "未安装微信");
}
}
private void shareToWxGp(BaseEventData b)
{
if (App.weChatController.IsWeChatAppInstalled())
{
App.weChatController.ShareWebpageToWX(1, $"{App.CurrentUser.WebHost}RoutesRecords/{cyclingController.RankingId}?Token={App.CurrentUser.cookie}", cyclingController.mapRoute.Name, "By " + App.CurrentUser.Nickname, null);
}
else
{
Utils.showToast(null, "未安装微信");
}
}
private void GoResult(BaseEventData baseEventData)
{
if (App.MainSceneParam.ContainsKey("Name"))
{
App.MainSceneParam["Name"] = "UserInfoPanel";
}
else
{
App.MainSceneParam.Add("Name", "UserInfoPanel");
}
Application.OpenURL($"{App.CurrentUser.WebHost}Mine/Detail/{cyclingController.RankingId}?Token={App.CurrentUser.cookie}");
SceneManager.LoadScene("MainScene");
}
private void Cancel(BaseEventData baseEventData)
{
SceneManager.LoadScene("MainScene");
}
public void SetDataSource(RecorderDataModel record)
{
var route = record.CurrentRoute.RouteInstance;
var dataformt = App.GetLocalLanguage().Equals("zh") ? "yyyy-MM-dd" : "dd-MM-yyyy";
date.text = record.StartTime.ToString(dataformt);
time.text = record.StartTime.ToShortTimeString();
level.text = route.Hard;
mapName.text = route.Name;
distance.text = route.Distance.ToString("f1") + "KM";
country.texture = cyclingController.GetCountryImageByCode(route.CountryCode);
Utils.DisplayImage(altudeGraph, route.AltitudeGraph);
//绑定骑行记录结果
rideTime.text = Helper.FormatTicks(record.RiderDatas.Count);
rideDistance.text = record.RiderDatas.Last()._Distance.ToString("f1") + "KM";
totalClimbed.text = record.RiderDatas.Last()._TotalClimb.ToString("f1");
var power = Math.Round(record.RiderDatas.Average(c => c._Power), 0);
avPower.text = power.ToString();
maxPower.text = record.RiderDatas.Max(c => c._Power).ToString("f0");
avHeatrate.text = record.RiderDatas.Average(c => c._HeartRate.GetValueOrDefault(0)).ToString("f0");
avSpeed.text = record.RiderDatas.Average(c => c._Speed).ToString("f1");
maxSpeed.text = record.RiderDatas.Max(c => c._Speed).ToString("f1");
wkgText.text = Math.Round(power / record.CurrentUser.Weight, 2).ToString();
avCadence.text = record.RiderDatas.Average(c => c._Cadence).GetValueOrDefault(0).ToString("f0");
DNF.gameObject.SetActive(!record.IsCompleted);
var recordImagePath = App.GetLocalLanguage().Equals("zh") ? "Images/Ride/img_newrecord_cn" : "img_newrecord";
newRecord.sprite = Resources.Load<Sprite>(recordImagePath);
newRecord.gameObject.SetActive(record.IsCompleted);
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: cf670cbf2ee31f54e948d1ae90112d81
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,340 @@
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();
});
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: deea375efff5f3d46a95e5b7b7165151
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,24 @@
using UnityEngine;
using UnityEngine.UI;
namespace Assets.Scripts.Scenes.VideoRide
{
public class WatchPanelScript:MonoBehaviour
{
private VideoGameManager manager { get; set; }
private Text userName { get; set; }
private void Start()
{
manager = FindObjectOfType<VideoGameManager>();
userName = transform.Find("name").GetComponent<Text>();
}
private void Update()
{
if (manager != null)
{
userName.text = manager.CurrentPlayer?.UserName;
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ee330a42f7b6a6f4391c18a98ef5f3c7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: