新版设计稿

This commit is contained in:
lishuo committed 2022-03-30 18:41:06 +08:00
1 parent 6ec4c0101b
commit 69d73c26cd
52 files changed
+8964 -5750

No files matched your search

+6
View File
@@ -81,4 +81,10 @@ public static class PFConstants
return Application.persistentDataPath + "/Logs/";
}
}
public static Color Green => new Color(0.1529412f, 0.8901961f, 0.3882353f, 0.6f);
public static Color Yellow => new Color(0.8901961f, 0.8313726f, 0.1529412f, 0.6f);
public static Color Orange => new Color(0.8901961f, 0.5686275f, 0.1529412f, 0.6f);
public static Color Red => new Color(0.8901961f, 0.2313726f, 0.1529412f, 0.6f);
}
@@ -5,6 +5,7 @@ using DG.Tweening;
using Mapbox.Utils;
using System;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.Scripts.Scenes.VideoRide
{
@@ -12,18 +13,23 @@ namespace Assets.Scripts.Scenes.VideoRide
{
protected Animator animator;
public GameObject head { get; set; }
protected Image ftpImage { get; set; }
protected Text headName { get; set; }
protected Text headWkg { get; set; }
public int UserId;
protected double weight;//体重
public string UserName;
public double weight;//体重
protected double bicycleWeight;//车重
protected double preSpeed;
public double speed;
public double power;
protected double elevation;
public double cadance;
public double wkg;
public int? heartRate { get; set; }
public int ticks;
public double totalDistance;
protected double currentSlope;
public double currentSlope;
protected double nextSlope;
protected double nextSlopeDistance;
public double distance;
@@ -42,10 +48,6 @@ namespace Assets.Scripts.Scenes.VideoRide
Camera camera;
float currenPlayerHeight;
//UI对象
protected GameObject headPanel;
protected GraphChartBase graph;
protected ChartDataSourceScript chartDataSourceScript;
protected virtual void Start()
{
animator = GetComponent<Animator>();
@@ -54,10 +56,6 @@ namespace Assets.Scripts.Scenes.VideoRide
ComputeNextSlope();//初始化坡度等
animator.Play("idle");
camera = Camera.main;
var GraphChart = manager.GetCanvasTransform().Find("GraphChart").gameObject;
chartDataSourceScript = GraphChart.GetComponent<ChartDataSourceScript>();
graph = GraphChart.GetComponent<GraphChartBase>();
}
protected virtual void Update()
@@ -189,6 +187,7 @@ namespace Assets.Scripts.Scenes.VideoRide
{
preSpeed = speed;
speed = Helper.CalculateSpeed(elevation, currentSlope, power, weight, bicycleWeight);
wkg = Math.Round(power / weight,2);
}
else
{
@@ -263,7 +262,12 @@ namespace Assets.Scripts.Scenes.VideoRide
if (head == null)
{
if (manager.GetHeadInfo() != null)
{
head = Instantiate(manager.GetHeadInfo(), manager.GetCanvasTransform());
ftpImage = head.transform.Find("ftp").GetComponent<Image>();
headName = head.transform.Find("name").GetComponent<Text>();
headWkg = head.transform.Find("wkg").GetComponent<Text>();
}
}
if (head != null)
{
@@ -271,12 +275,11 @@ namespace Assets.Scripts.Scenes.VideoRide
Vector3 worldPosition = new Vector3(transform.position.x, transform.position.y+2, transform.position.z);
var playerScreenPos = Camera.main.WorldToScreenPoint(worldPosition);
head.transform.position = playerScreenPos;
ftpImage.fillAmount = (float)(wkg / 6);
headName.text = UserName;
headWkg.text = $"{wkg}W/KG";
}
}
protected virtual void MoveGraphHead(bool init = false)
{
}
public void Destroy()
{
@@ -1,5 +1,4 @@
using ChartAndGraph;
using System;
using UnityEngine;
namespace Assets.Scripts.Scenes.VideoRide
@@ -14,37 +13,26 @@ namespace Assets.Scripts.Scenes.VideoRide
Material _mediumColor;
[SerializeField]
Material _hardColor;
[SerializeField]
Material _heavyColor;
void Start()
{
head = transform.Find("HeadPanel").gameObject;
manager= FindObjectOfType<VideoGameManager>();
BarChart barChart = GetComponent<BarChart>();
barChart.DataSource.ClearCategories();
barChart.DataSource.ClearValues();
if (barChart != null)
{
barChart.DataSource.SetValue("Player 1", "Value 1", UnityEngine.Random.value * 20);
barChart.DataSource.SlideValue("Player 2", "Value 1", UnityEngine.Random.value * 20, 40f);
}
var material = barChart.DataSource.GetMaterial("Player 1");
var material1 = barChart.DataSource.GetMaterial("Player 2");
var material2 = barChart.DataSource.GetMaterial("Player 3");
var list = manager.GetMapData().List;
for (int i = 5; i < list.Count; i++)
{
if (i % 2 == 0)
var list = manager.GetMapData().List;
for (int i = 0; i < list.Count; i++)
{
material = material1;
barChart.DataSource.AddCategory($"Player {i}", getChartMaterial(list[i].Grade));
barChart.DataSource.SetValue($"Player {i}", "Group 1", list[i].Grade);
}
else
{
material = material2;
}
barChart.DataSource.AddCategory($"Player {i}", material);
barChart.DataSource.SetValue($"Player {i}", "Group 1", list[i].Elevation);
}
}
float timer = 1f;
@@ -53,16 +41,58 @@ namespace Assets.Scripts.Scenes.VideoRide
timer -= Time.deltaTime;
while (timer < 0)
{
var videoPlayer = manager.CurrentPlayer;
if (videoPlayer != null)
{
BarChart barChart = GetComponent<BarChart>();
Vector3 vector3 = Vector3.back;
barChart.GetBarTrackPosition($"Player {videoPlayer.currentIndex}", "Group 1", out vector3);
head.transform.position = vector3;
}
MoveCurrentPlayerHead();
//MoveOnlinePlayerHead(); TODO
timer += 1f;
}
}
//移动当前骑行者头像
private void MoveCurrentPlayerHead()
{
var videoPlayer = manager.CurrentPlayer;
var index = videoPlayer != null ? videoPlayer.currentIndex : 0;
BarChart barChart = GetComponent<BarChart>();
Vector3 vector3 = Vector3.back;
barChart.GetBarTrackPosition($"Player {index}", "Group 1", out vector3);
head.transform.position = vector3;
}
//移动当前线上其他人头像
private void MoveOnlinePlayerHead()
{
var videoPlayer = manager.CurrentPlayer;
if (videoPlayer != null)
{
BarChart barChart = GetComponent<BarChart>();
Vector3 vector3 = Vector3.back;
barChart.GetBarTrackPosition($"Player {videoPlayer.currentIndex}", "Group 1", out vector3);
head.transform.position = vector3;
}
}
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;
}
}
}
@@ -12,6 +12,8 @@ namespace Assets.Scripts.Scenes.VideoRide
Text btnRideNum { get; set; }
GameObject Hide { get; set; }
GameObject Show { get; set; }
private bool isAnimating = false;
private void Start()
{
rideNum = transform.Find("Head/RideNum/Number").GetComponent<Text>();
@@ -21,19 +23,26 @@ namespace Assets.Scripts.Scenes.VideoRide
UIManager.AddEvent(Hide, UnityEngine.EventSystems.EventTriggerType.PointerClick, Hidehandler);
UIManager.AddEvent(Show, UnityEngine.EventSystems.EventTriggerType.PointerClick, Showhandler);
}
private void Hidehandler(BaseEventData data)
public void Hidehandler(BaseEventData data)
{
if (isAnimating)
return;
isAnimating = true;
transform.DOLocalMoveX(913, 1f).onComplete += () => {
Show.SetActive(true);
Hide.SetActive(false);
isAnimating = false;
};
}
private void Showhandler(BaseEventData data)
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;
@@ -70,11 +70,17 @@ namespace Assets.Scripts.Scenes.VideoRide
{
base.ComputeAnimator();
var currentFrame = manager.GetFrameOffSet(diff);
if (manager.mockDirection.ContainsKey(currentFrame))
var mainFrame = manager.GetCurrentFrame();
var min = Math.Min(currentFrame, mainFrame);
var max = Math.Max(currentFrame, mainFrame);
for (int i = min; i < max; i++)
{
bearing = manager.mockDirection[currentFrame];
if (manager.mockDirection.ContainsKey(currentFrame))
{
bearing = manager.mockDirection[currentFrame];
}
animator.SetFloat("bearing", bearing);
}
animator.SetFloat("bearing", bearing);
}
protected override int GetCurrentFrame()
{
@@ -98,8 +104,10 @@ namespace Assets.Scripts.Scenes.VideoRide
}
//设置当前玩家属性
public void SetPlayer(double totalDistance, double cadance,double heartRate,int userId)
public void SetPlayer(string name,double totalDistance, double cadance,double heartRate, double wkg, int userId)
{
this.wkg = wkg;
this.UserName = name;
this.speed = 10;
this.cadance = cadance;
this.totalDistance = totalDistance;
@@ -20,14 +20,14 @@ namespace Assets.Scripts.Scenes.VideoRide
UIManager.AddEvent(Hide, UnityEngine.EventSystems.EventTriggerType.PointerClick, Hidehandler);
UIManager.AddEvent(Show, UnityEngine.EventSystems.EventTriggerType.PointerClick, Showhandler);
}
private void Hidehandler(BaseEventData data)
public void Hidehandler(BaseEventData data)
{
transform.DOLocalMoveX(-913, 1f).onComplete+=()=> {
Show.SetActive(true);
Hide.SetActive(false);
};
}
private void Showhandler(BaseEventData data)
public void Showhandler(BaseEventData data)
{
Show.SetActive(false);
Hide.SetActive(true);
@@ -45,15 +45,9 @@ namespace Assets.Scripts.Scenes.VideoRide
RIDE,
INSPECT
}
public enum ViewMode
{
THIRD,
FIRST,
}
//当前是观察者视角还是骑行者视角
public ARMode _aRMode { get; set; }
//当前是第一人称还是第三人称
public ViewMode _viewMode { get; set; }
public int RankingId { get; set; }
private async void Awake()
@@ -72,7 +66,7 @@ namespace Assets.Scripts.Scenes.VideoRide
//var check = CheckAnt();//初始化蓝牙设备
recordId = Guid.NewGuid().ToString();
MockDirection();
infoPanel = Resources.Load<GameObject>("UI/Prefab/Ride/OnlineInfoPanel");
infoPanel = Resources.Load<GameObject>("UI/Prefab/AR/VideoPlayerHead");
OnlinePlayer = Resources.Load<GameObject>("UI/Prefab/OnlineVideoPlayer");
}
void Start()
@@ -152,7 +146,7 @@ namespace Assets.Scripts.Scenes.VideoRide
if (exsit != null)
{
var online = exsit.GetComponent<OnlineVideoPlayer>();
online.SetPlayer(onlineRider.EndDistance, item.Cadence, item.HeartRate, item.UserId);
online.SetPlayer(onlineRider.NickName,onlineRider.EndDistance, item.Cadence, item.HeartRate, onlineRider.WeightKg, item.UserId);
}
else
{
@@ -162,7 +156,8 @@ namespace Assets.Scripts.Scenes.VideoRide
{
var obj = Instantiate(OnlinePlayer, transform);
var online = obj.GetComponent<OnlineVideoPlayer>();
online.SetPlayer(onlineRider.EndDistance, item.Cadence, item.HeartRate, item.UserId);
online.SetPlayer(onlineRider.NickName, onlineRider.EndDistance, item.Cadence, item.HeartRate, onlineRider.WeightKg, item.UserId);
obj.transform.DOMoveX(slots[currentOnlineCount], 1);
currentOnlineCount++;
}
@@ -193,23 +188,7 @@ namespace Assets.Scripts.Scenes.VideoRide
CurrentPlayer = videoPlayer;
}
}
//切换当前人物视角
public void ChangeView()
{
var videoPlayer = FindObjectOfType<VideoPlayer>();
var currentPlayer = CurrentPlayer == null? videoPlayer.transform : CurrentPlayer.transform;
_viewMode = _viewMode == ViewMode.THIRD ? ViewMode.FIRST : ViewMode.THIRD;
if (_viewMode == ViewMode.FIRST)
{
currentPlayer.DOMoveZ(-0.1f, 0f);
currentPlayer.DOMoveY(-1.1f, 0f);
}
else
{
currentPlayer.DOMoveZ(4, 0f);
currentPlayer.DOMoveY(-1f, 0f);
}
}
Vector3 origin = new Vector3(0, -1, 4);
//切换人物
public void ChangePlayer(int userId)
@@ -234,7 +213,7 @@ namespace Assets.Scripts.Scenes.VideoRide
{
var obj = Instantiate(OnlinePlayer, transform);
var online = obj.GetComponent<OnlineVideoPlayer>();
online.SetPlayer(onlineRider.EndDistance, onlineRider.Cadence, onlineRider.HeartRate, onlineRider.UserId);
online.SetPlayer(onlineRider.NickName, onlineRider.EndDistance, onlineRider.Cadence, onlineRider.HeartRate, 0, onlineRider.UserId);
//obj.transform.DOMoveX(slots[currentOnlineCount], 1);
}
}
+1 -35
View File
@@ -13,12 +13,7 @@ namespace Assets.Scripts.Scenes.VideoRide
{
base.Start();
animator.Play("idle");
power = 200;
;
headPanel = manager.GetCanvasTransform().Find("GraphChart/HeadPanel").gameObject;
MoveGraphHead(true);
power = 200;;
}
protected override void Update()
@@ -127,35 +122,6 @@ namespace Assets.Scripts.Scenes.VideoRide
// manager.Save(totalDistance);
//}
}
protected override void MoveGraphHead(bool init = false)
{
Vector3 oldPos = headPanel.transform.position;
int nextIndex = currentIndex;
var viewIndex = chartDataSourceScript.GetViewIndex(nextIndex);
var n = graph.DataSource.GetPoint("Player 2", viewIndex);
graph.PointToWorldSpace(out Vector3 nextPosition, n.x, n.y, "Player 2");
//nextPosition.x -= 14f;
//nextPosition.y += 5f;
//人物移动 停止条件 到中间且线未加载完
if (manager.IsStart() && chartDataSourceScript.ReachMid(viewIndex) && !chartDataSourceScript.ReachEnd())
{
var currentDistance = totalDistance;
var offset = currentDistance > 0 ? distance * 1000 / currentDistance : 1;
if (UserId == manager.CurrentPlayer.UserId)
{
graph.HorizontalScrolling += offset;
}
var duration = init ? 0 : 1;
headPanel.transform.DOMove(new Vector3(oldPos.x, nextPosition.y, 0), duration);
}
else
{
headPanel.transform.position = new Vector3(nextPosition.x, nextPosition.y, 0);
//headPanel.transform.DOMove(new Vector3(nextPosition.x, nextPosition.y, 0), 1);
}
headPanel.transform.SetAsLastSibling();
}
//保存骑行记录
public void Upload()
{
@@ -10,6 +10,8 @@ using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
using DG.Tweening;
namespace Assets.Scripts.Scenes.VideoRide
{
public class VideoUIManager : MonoBehaviour
@@ -18,8 +20,9 @@ namespace Assets.Scripts.Scenes.VideoRide
VideoGameManager manager;
VideoPlayer videoPlayer;
const float MAXPOWER = 450f;
const float MAXPOWER_RATE = 6f;
const float MAXPOWER_RATE = 600f;
const float MAXHEARRATE = 200f;
const float MAXWKG = 6f;
private ChartDataSourceScript chartDataSourceScript;
Text infoText { get; set; }
//ComputerPanel
@@ -30,6 +33,7 @@ namespace Assets.Scripts.Scenes.VideoRide
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
@@ -40,10 +44,18 @@ namespace Assets.Scripts.Scenes.VideoRide
//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()
{
@@ -52,7 +64,6 @@ namespace Assets.Scripts.Scenes.VideoRide
videoPlayer = FindObjectOfType<VideoPlayer>();
button = transform.Find("Panel/Button").gameObject;
Init();
RenderChart();
}
private void Init()
@@ -69,8 +80,16 @@ namespace Assets.Scripts.Scenes.VideoRide
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>();
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;
@@ -92,12 +111,36 @@ namespace Assets.Scripts.Scenes.VideoRide
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);
}
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;
}
}
@@ -109,9 +152,36 @@ namespace Assets.Scripts.Scenes.VideoRide
{
UIManager.Show(UIManager.Instance.DevicePanel, null, true);
}
public enum ViewMode
{
THIRD,
FIRST,
}
//当前是第一人称还是第三人称
public ViewMode _viewMode { get; set; }
private void ChangeViewClick(BaseEventData e)
{
manager.ChangeView();
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)
{
@@ -133,29 +203,6 @@ namespace Assets.Scripts.Scenes.VideoRide
);
}
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()