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; using Mapbox.Utils; 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 var uipanel = mainController.GetUIPanel(); uiObject = uipanel.transform.Find("ArrowList"); // if (mainController.cyclingController.Mode == CyclingModel.Competition) // { //#if UNITY_IOS || UNITY_ANDROID // var CompetitionArrow = mainController.GetCompetitionMobileArrow(); // arrowImage = Instantiate(CompetitionArrow, uiObject); //#else // var CompetitionArrow = mainController.GetCompetitionArrow(); // arrowImage = Instantiate(CompetitionArrow, uiObject); //#endif // //比赛模式 // if (!string.IsNullOrEmpty(headUrl)) // { // var rawImge = arrowImage.transform.Find("Head").GetComponent(); // Utils.DisplayImage(rawImge, headUrl, true); // rawImge.gameObject.SetActive(true); // } // } // else { arrowImage = Instantiate(Resources.Load("UI/Prefab/Ride/ReviewArrow"), uiObject); arrowImage.color = new Color(0.1529412f, 0.8745098f, 0.8901961f); #if UNITY_IOS || UNITY_ANDROID arrowImage.transform.DOScale(new Vector3(1f,1f,1f),0); #else arrowImage.transform.DOScale(new Vector3(2f,2f,2f),0); #endif } } public override bool GetStart() { return true; } protected override void Compute() { if (mainController.currentPlayer != null) { diff = Math.Round((totalDistance - mainController.currentPlayer.TotalDistance) * 1000, 0); } else { diff = 0; } } double diff = 0; public void SetDataSource(double _totalDistance, double _distance, double _power, double _heartRate, double _cadence,int _totalTicks, string Name,double weightKg,Vector2d point,int index=0) { totalDistance = _totalDistance; distance = _distance; speed = distance*3600; nickName = Name; weightKgStr = weightKg.ToString("f2") + "W/KG"; CurrentIndex = index; //Point = point; currentlatlong = point; heartRate = Convert.ToInt32( _heartRate); power = Convert.ToInt32(_power); cadance = _cadence; ticks = _totalTicks; } public Vector2d Point { get; set; } private string headUrl; public void SetHead(string url ) { headUrl = url; } public void ShowInfoPanel(Vector3 playerScreenPos) { if (infoPanel == null) { #if UNITY_IOS || UNITY_ANDROID if (mainController.cyclingModel == CyclingModel.Competition) { infoPanel = Instantiate(Resources.Load("UI/Prefab/Ride/Mobile/OnlineRaceInfoPanel"), uiObject); } else { infoPanel = Instantiate(Resources.Load("UI/Prefab/Ride/Mobile/OnlineInfoPanel"), uiObject); } #else if (mainController.cyclingModel == CyclingModel.Competition) { infoPanel = Instantiate(Resources.Load("UI/Prefab/Ride/OnlineRaceInfoPanel"), uiObject); } else { infoPanel = Instantiate(Resources.Load("UI/Prefab/Ride/OnlineInfoPanel"), uiObject); } #endif } 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 (mainController.currentPlayer != 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(); } TrailRenderer trailRenderer { get; set; } protected override void AfterExcute() { var playerScreenPos = Camera.main.WorldToScreenPoint(transform.position); ////如果是比赛模式头像 //if (mainController.cyclingModel == CyclingModel.Competition) //{ // playerScreenPos.y += 10f; //} //如果观察的是当前用户 隐藏UI 添加trailrender var iscurrentUser = mainController.currentPlayer.UserId == UserId; var s = mainController.currentPlayer.Currentlatlong; var e = currentlatlong; var distancesss = mainController.Distance(s, e); arrowImage.gameObject.SetActive(!iscurrentUser && distancesss <= 2); if (iscurrentUser && trailRenderer == null) { trailRenderer = gameObject.AddComponent(); trailRenderer = FindObjectOfType(); //var color7 = Resources.Load("UI/Material/color7"); var Graph2 = mainController.Get3dGraph2(); //Resources.Load("UI/Material/3dGraph2"); trailRenderer.material = Graph2;//new Material[] { Graph2 }; trailRenderer.time = 30; trailRenderer.startWidth = 0.5f; trailRenderer.endWidth = 0.5f; trailRenderer.startColor = new Color(0.9764706f, 0.1882353f, 0.5254902f, 1f); trailRenderer.endColor = new Color(0.9764706f, 0.1882353f, 0.5254902f, 1f); trailRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; trailRenderer.allowOcclusionWhenDynamic = false; trailRenderer.textureMode = LineTextureMode.Tile; trailRenderer.motionVectorGenerationMode = MotionVectorGenerationMode.ForceNoMotion; trailRenderer.receiveShadows = false; trailRenderer.rayTracingMode = UnityEngine.Experimental.Rendering.RayTracingMode.Off; } //如果不是当前用户则销毁轨迹效果 if (!iscurrentUser) { trailRenderer?.Destroy(); } var rect = ((RectTransform)arrowImage.transform); rect.position = new Vector3(playerScreenPos.x, playerScreenPos.y, 0); 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 = mainController.GetMaterial4(); //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(bool init=false) { if (mainController.cyclingModel == CyclingModel.Competition) { MoveGraghHead4Race(); } else { MoveHead(); } } private double horizontalScrolling { get; set; } private void MoveHead() { if (headPanel == null) { var onlineHeadPanel = mainController.GetOnlineheadPanel(); headPanel = Instantiate(onlineHeadPanel); headPanel.transform.SetParent(graph.transform); headPanel.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f); } int nextIndex = CurrentIndex; var viewIndex = chartDataSourceScript.GetViewIndex(nextIndex); //人物移动 停止条件 到中间且线未加载完 if (GetStart() && chartDataSourceScript.ReachMid(viewIndex) && !chartDataSourceScript.ReachEnd()) { var currentDistance = CurrentDistance; var distance = Distance; var offset = currentDistance > 0 ? distance * 1000 / currentDistance : 1; //horizontalScrolling += offset; if (UserId == mainController.currentPlayer.UserId) { graph.HorizontalScrolling += offset; } } //设定当前头像位置 var m = graph.DataSource.GetPoint("Player 2", viewIndex); graph.PointToWorldSpace(out Vector3 itemPosition, m.x, m.y, "Player 2"); itemPosition.x -= 12f; itemPosition.y += 5f; headPanel.transform.position = new Vector3(itemPosition.x, itemPosition.y, 0); //超出边界隐藏 var start = graph.HorizontalScrolling; var end = graph.HorizontalScrolling + graph.DataSource.HorizontalViewSize; headPanel.SetActive(nextIndex >= start && nextIndex <= end); //显示头像 if (head == null) { head = headPanel.transform.Find("Head").GetComponent(); if (!string.IsNullOrEmpty(headUrl)) { Utils.DisplayImage(head, headUrl, true); } else { headPanel.transform.Find("DefaultHead").gameObject.SetActive(true); } } } Color transparent = new Color(0.1529412f, 0.8745098f, 0.8901961f, 0); Color blue = new Color(0.1529412f, 0.8745098f, 0.8901961f, 1); private void MoveGraghHead4Race() { MoveHead(); var rect = ((RectTransform)(headPanel.transform)); //如果切换到当前用户,当前用户头像变大,并且只显示当前用户 if (mainController.currentPlayer.UserId == UserId) { headPanel.transform.SetAsLastSibling(); head.gameObject.SetActive(true); headPanel.GetComponent().color = blue; rect.DOScale(new Vector3(1.2f, 1.2f, 1.2f), 0.5f); } else { head.gameObject.SetActive(false); headPanel.GetComponent().color = transparent; rect.DOScale(new Vector3(1f, 1f, 1f), 0.5f); } } } }