using Assets.Scenes.Ride.Scripts.Model; using Assets.Scripts; using Assets.Scripts.Apis.Models; using ChartAndGraph; using DG.Tweening; using System; using UnityEngine; using UnityEngine.UI; using System.Linq; namespace Assets.Scenes.Ride.Scripts { public class OnlinePlayerController : AbstractPlayer { public PlayerController _playerController; RawImage head; Image arrowImage; GameObject infoPanel; Transform uiObject; string nickName; string weightKgStr; protected override void Init() { base.Init(); currentlatlong = mainController.GetCenterCoordinate(); _playerController = FindObjectOfType(); //创建UI uiObject = transform.parent.Find("SingleUI/Panel/ArrowList"); arrowImage = Instantiate(Resources.Load("UI/Prefab/Ride/ReviewArrow"), uiObject); arrowImage.color = new Color(0.1529412f, 0.8745098f, 0.8901961f); } public override bool GetStart() { return true; } protected override void Compute() { currentlatlong = mainController.Along(totalDistance);//下一个坐标 diff = Math.Round((totalDistance - _playerController.TotalDistance) * 1000, 0); } double diff = 0; public void SetDataSource(double _totalDistance, double _distance,string Name,double weightKg,int index=0) { totalDistance = _totalDistance; distance = _distance; speed = distance*3600; nickName = Name; weightKgStr = weightKg.ToString("f2") + "W/KG"; CurrentIndex = index; } private string headUrl; public void SetHead(string url ) { headUrl = url; } public void ShowInfoPanel(Vector3 playerScreenPos) { if (infoPanel == null) { infoPanel = Instantiate(Resources.Load("UI/Prefab/Ride/OnlineInfoPanel"), uiObject); } var headPos = infoPanel.transform.Find("Head").position; var infoPos = playerScreenPos + new Vector3(150f, 60f, 0f); ((RectTransform)infoPanel.transform).position = infoPos; CreateInfoLine(playerScreenPos, headPos); var infoHead = infoPanel.transform.Find("Head").GetComponent(); if (head != null) { infoHead.texture = head.texture; } var infoName = infoPanel.transform.Find("Name").GetComponent(); infoName.text = nickName; var infoDistance = infoPanel.transform.Find("Distance").GetComponent(); if (_playerController != null) { infoDistance.text = diff > 0? $"+{diff}M" : $"{diff}M"; } var infoWKG = infoPanel.transform.Find("WKG").GetComponent(); infoWKG.text = weightKgStr; var speedText = infoPanel.transform.Find("Speed").GetComponent(); speedText.text = speed.ToString("f1")+"KM/H"; } public void RemoveSelf() { arrowImage.gameObject?.Destroy(); headPanel?.Destroy(); infoPanel?.Destroy(); transform.gameObject.Destroy(); } protected override void AfterExcute() { var playerScreenPos = Camera.main.WorldToScreenPoint(transform.position); ((RectTransform)arrowImage.transform).position = playerScreenPos; if (IsShowInfo) { ShowInfoPanel(playerScreenPos); } else { if (infoPanel == null) return; _directionsGO?.Destroy(); infoPanel.transform.GetComponent().DOFade(0, 1).onComplete += () => { IsShowInfo = false; infoPanel?.Destroy(); }; } } GameObject _directionsGO; void CreateInfoLine(Vector3 startPos,Vector3 endPos) { if (_directionsGO != null) { _directionsGO.Destroy(); } startPos = Camera.main.ScreenToWorldPoint(startPos); //endPos.x -= 120f; endPos = Camera.main.ScreenToWorldPoint(endPos); _directionsGO = new GameObject("InfoLinerender"); _directionsGO.transform.SetParent(transform); var lineRender = _directionsGO.AddComponent(); //lineRender.material = new Material(Shader.Find("Sprites/Default")); lineRender.material = Resources.Load("UI/Material/4"); lineRender.endColor = new Color(0.1529412f, 0.8745098f, 0.8901961f, 1f); lineRender.startColor = new Color(0.1529412f, 0.8745098f, 0.8901961f, 1f); //设置宽度 lineRender.startWidth = 0.2f; lineRender.endWidth = 0.2f; lineRender.positionCount = 2; lineRender.SetPositions(new Vector3[] { startPos, endPos }); lineRender.loop = false; lineRender.numCapVertices = 10; lineRender.numCornerVertices = 10; } protected override void MoveGraphHead() { var itemIndex = chartDataSourceScript.GetViewIndex(CurrentIndex); var m = graph.DataSource.GetPoint("Player 2", itemIndex); graph.PointToWorldSpace(out Vector3 itemPosition, m.x, m.y, "Player 2"); itemPosition.x -= 12f; itemPosition.y += 5f; if (headPanel == null) { headPanel = Instantiate(Resources.Load("UI/Prefab/Ride/OnlineHeadPanel")); headPanel.transform.SetParent(graph.transform); headPanel.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f); headPanel.transform.position = itemPosition; } else { headPanel.transform.DOMove(new Vector3(itemPosition.x, itemPosition.y, 0), 1); } if (head == null) { head = headPanel.GetComponentInChildren(); if (!string.IsNullOrEmpty(headUrl)) { Utils.DisplayImage(head, headUrl, true); } else { headPanel.transform.Find("DefaultHead").gameObject.SetActive(true); } } } } }