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); } 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);//下一个坐标 var diff = Math.Round(totalDistance - _playerController.TotalDistance, 3) * 1000; _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 infoPos = playerScreenPos + new Vector3(100f, 60f, 0f); ((RectTransform)infoPanel.transform).position = infoPos; CreateInfoLine(playerScreenPos, infoPos); 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 = ((totalDistance - _playerController.TotalDistance) * 1000).ToString("f0") + "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 -= 80f; 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.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; infoPanel.transform.GetComponent().DOFade(0, 1).onComplete += () => { IsShowInfo = false; infoPanel?.Destroy(); _directionsGO?.Destroy(); }; } } } }