using Assets.Scenes.Ride.Scripts.Model; using Assets.Scripts; using DG.Tweening; using System; using UnityEngine; using UnityEngine.UI; namespace Assets.Scenes.Ride.Scripts { public class OtherPlayerController : AbstractPlayer { public string[] record { set; get; } public ReviewItemScript _reviewItemScript; public PlayerController _playerController; RawImage head; GameObject headPanel; GameObject infoPanel; public int tickOffset = 0; Image arrowImage; GameObject reviewInfoPanel; Transform uiObject; string nickName; string weightKgStr; public double Weight { get; set; } public double BikeWeight { get; set; } protected override void Init() { base.Init(); _playerController = FindObjectOfType(); tickOffset = mainController.preticks; //创建UI uiObject = transform.parent.Find("SingleUI/Panel/ArrowList"); arrowImage = Instantiate(Resources.Load("UI/Prefab/Ride/ReviewArrow"), uiObject); } double diff = 0; protected override void Compute() { if (tickOffset + ticks < record.Length) { var data = TargetData.Read(record[tickOffset + ticks - 1]); power = data._Power; speed = data._Speed; distance = data._Speed/3600; totalDistance = data._Distance; } else { var data = TargetData.Read(record[record.Length - 1]); power = data._Power; speed = data._Speed; distance = data._Speed / 3600; totalDistance = data._Distance; } currentlatlong = mainController.Along(totalDistance);//下一个坐标 diff = Math.Round((totalDistance - _playerController.TotalDistance) *1000, 0); _reviewItemScript.SetDistance(diff); } public void SetController(ReviewItemScript reviewItemScript) { _reviewItemScript = reviewItemScript; nickName = _reviewItemScript.GetName(); } public void MoveHead(Transform parent,Vector3 nextPosition) { if (headPanel == null) { headPanel = Instantiate(Resources.Load("UI/Prefab/Ride/HeadPanel")); headPanel.transform.parent = parent; headPanel.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f); } if (head == null) { head = headPanel.GetComponentInChildren(); head.texture = _reviewItemScript.GetHead(); } headPanel.transform.DOMove(new Vector3(nextPosition.x, nextPosition.y, 0), 1); } 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(); if (Weight + BikeWeight != 0) { weightKgStr = (power / (Weight + BikeWeight)).ToString("f2")+"W/KG"; infoWKG.text = weightKgStr; } var speedText = infoPanel.transform.Find("Speed").GetComponent(); speedText.text = speed.ToString("f1") + "KM/H"; } 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/color8"); lineRender.material = Resources.Load("UI/Material/1"); lineRender.endColor = new Color(1, 1f, 1f, 0.65f); lineRender.startColor = new Color(1, 1f, 1f, 0.65f); //设置宽度 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 AfterExcute() { var playerScreenPos = Camera.main.WorldToScreenPoint(transform.position); ((RectTransform)arrowImage.transform).position = playerScreenPos;//Camera.main.WorldToScreenPoint(transform.position); if (IsShowInfo) { ShowInfoPanel(playerScreenPos); } else { if (infoPanel == null) return; _directionsGO?.Destroy(); infoPanel.transform.GetComponent().DOFade(0, 1).onComplete += () => { IsShowInfo = false; infoPanel?.Destroy(); }; } } } }