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(); BarChart barChart = GetComponent(); 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("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(); 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(); var videoPlayer = manager.CurrentPlayer; foreach (var item in players) { BarChart barChart = GetComponent(); 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().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; } } }