144 lines
4.9 KiB
C#
144 lines
4.9 KiB
C#
using ChartAndGraph;
|
||
using System;
|
||
using System.Linq;
|
||
using UnityEngine;
|
||
|
||
namespace Assets.Scripts.Scenes.VideoRide
|
||
{
|
||
public class ElevationBarDataFeed : MonoBehaviour
|
||
{
|
||
GameObject head { get; set; }
|
||
VideoGameManager manager { get; set; }
|
||
[SerializeField]
|
||
Material _lightColor;
|
||
[SerializeField]
|
||
Material _mediumColor;
|
||
[SerializeField]
|
||
Material _hardColor;
|
||
[SerializeField]
|
||
Material _heavyColor;
|
||
|
||
GameObject headPanel { get; set; }
|
||
|
||
void Start()
|
||
{
|
||
head = transform.Find("HeadPanel").gameObject;
|
||
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].Grade);
|
||
}
|
||
}
|
||
|
||
headPanel = Resources.Load<GameObject>("UI/Prefab/AR/HeadPanel");
|
||
}
|
||
|
||
float timer = 1f;
|
||
private void Update()
|
||
{
|
||
timer -= Time.deltaTime;
|
||
while (timer < 0)
|
||
{
|
||
MoveCurrentPlayerHead();
|
||
MoveOnlinePlayerHead();
|
||
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()
|
||
{
|
||
if (manager.cyclingController == null)
|
||
return;
|
||
var players = manager.cyclingController.riders;
|
||
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 = Math.Round(distance / manager.mapRoute.Distance * manager.GetMapData().List.Count);
|
||
barChart.GetBarTrackPosition($"Player {currentIndex}", "Group 1", out vector3);
|
||
|
||
var currentHead = headList.Where(c => c.UserId == item.UserId).FirstOrDefault();
|
||
|
||
if (videoPlayer != null)
|
||
{
|
||
var diff = distance - videoPlayer.totalDistance % manager.mapRoute.Distance;
|
||
if (diff < 0)
|
||
{
|
||
vector3.y = -800f;
|
||
}
|
||
}
|
||
if (currentHead == null)
|
||
{
|
||
var onlineHead = Instantiate(headPanel, transform);
|
||
onlineHead.GetComponent<HeadScript>().UserId = item.UserId;
|
||
onlineHead.transform.position = vector3;
|
||
}
|
||
else
|
||
{
|
||
currentHead.transform.position = vector3;
|
||
}
|
||
}
|
||
//删除离线的人
|
||
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;
|
||
}
|
||
}
|
||
}
|