using UnityEngine; using Assets.Scenes.Ride.Scripts.Model; using UnityEngine.SceneManagement; using System.Collections.Generic; using System.Linq; using Assets.Scenes.Ride.Scripts.Model.RiderModels; using System; using ChartAndGraph; using DG.Tweening; using System.Collections; namespace Assets.Scenes.Ride.Scripts { public class PlayerController : AbstractPlayer { #region 骑行逻辑 TrailRenderer trail; GameObject uipanel { get; set; } protected override void Init() { base.Init(); UserId = App.CurrentUser.Id; totalDistance = mainController.selectParamModel.EndDistance; StartIndex = mainController.GetCurrentIndex(totalDistance); currentlatlong = mainController.GetCenterCoordinate(); uipanel = mainController.GetUIPanel(); trail = FindObjectOfType(); trail.startWidth = 1f; trail.endWidth = 1f; trail.startColor = new Color(0.9764706f, 0.1882353f, 0.5254902f, 1f); trail.endColor = new Color(0.9764706f, 0.1882353f, 0.5254902f, 1f); //var color7 = Resources.Load("UI/Material/color7"); //var Graph2 = Resources.Load("UI/Material/3dGraph2"); //trail.materials = new Material[] { color7}; trail.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; trail.allowOcclusionWhenDynamic = false; trail.textureMode = LineTextureMode.Tile; trail.motionVectorGenerationMode = MotionVectorGenerationMode.ForceNoMotion; trail.receiveShadows = false; trail.rayTracingMode = UnityEngine.Experimental.Rendering.RayTracingMode.Off; trail.enabled = false; headPanel = uipanel.transform.Find("GraphChart/HeadPanel").gameObject; MoveGraphHead(true); } TargetData targetData; /// /// 计算数据,父类会在此方法后处理动画 /// protected override void Compute() { //计算数据 //speed = mainController.UpDateSpeed(); try { heartRate = mainController.UpDateHeart(); power = mainController.UpdatePower(); cadance = mainController.UpdateCadence(); weight = App.CurrentUser.Weight; bicycleWeight = App.CurrentUser.BicycleWeight; #if UNITY_EDITOR power = 1430; #endif mainController.TrackResistance(currentSlope * App.RideSetting.Sensitivity / 100); } catch (Exception ex) { Debug.Log(ex.Message); //heartRate = 0; power = 0; cadance = 0; } if (power > 0) { speed = Helper.CalculateSpeed(elevation, currentSlope, power, weight, bicycleWeight); distance = mainController.UpdateDistance(speed); //totalDistance += distance; } else { speed = 0; distance = 0; } } public void Init(int index, double distance, int tick) { CurrentIndex = index; totalDistance = distance; ticks = tick; } protected override void Record() { if (!stopRecord) { //记录骑行数据 currentlatlong = mainController.Along(totalDistance);//下一个坐标 var recorderData = mainController.cyclingController.recorderData; targetData = new TargetData { Ticks = ticks, _Power = power, _Speed = speed, _Distance = totalDistance > mapData.TotalDistance ? mapData.TotalDistance : totalDistance, _Cadence = cadance, _HeartRate = heartRate, _Lat = currentlatlong.x, _Lon = currentlatlong.y, _TotalClimb = totalClimb, }; var preDistance = totalDistance >= mapData.TotalDistance ? targetData._Distance : targetData._Distance - Distance; recorderData.PreDistance = Math.Round(preDistance, 6, MidpointRounding.AwayFromZero); recorderData.EndDistance = Math.Round(targetData._Distance, 6, MidpointRounding.AwayFromZero); recorderData.RiderDatas.Add(targetData); //实时计算MaxAp //mainController.ComputeMaxAP(Power, ticks); //实时保存骑行记录 mainController.SaveRealTime(); } } protected override void BeforeRun() { //if (mainController != null) //{ // mainController.TcpHandler(); //} } //上传数据 public override void Upload() { if (!mainController.cyclingController.recorderData.Saved)//处理重复上传的问题 { mainController.Save(TotalDistance); } } #endregion //public void InitGraph(int index) //{ // chartDataSourceScript.InitHorizontalScrolling(index); //} //移动海拔图头像 protected override void MoveGraphHead(bool init = false) { Vector3 oldPos = headPanel.transform.position; int nextIndex = CurrentIndex; var viewIndex = chartDataSourceScript.GetViewIndex(nextIndex); var n = graph.DataSource.GetPoint("Player 2", viewIndex); graph.PointToWorldSpace(out Vector3 nextPosition, n.x, n.y, "Player 2"); nextPosition.x -= 14f; nextPosition.y += 5f; //人物移动 停止条件 到中间且线未加载完 if ( GetStart() && chartDataSourceScript.ReachMid(viewIndex) && !chartDataSourceScript.ReachEnd()) { var currentDistance = CurrentDistance; var distance = Distance; var offset = currentDistance > 0 ? distance * 1000 / currentDistance : 1; if (UserId == mainController.currentPlayer.UserId) { graph.HorizontalScrolling += offset; } var duration = init ? 0 : 1; headPanel.transform.DOMove(new Vector3(oldPos.x, nextPosition.y, 0), duration); } else { headPanel.transform.position = new Vector3(nextPosition.x, nextPosition.y, 0); //headPanel.transform.DOMove(new Vector3(nextPosition.x, nextPosition.y, 0), 1); } headPanel.transform.SetAsLastSibling(); } protected override IEnumerator MoveTo() { //让人物移动分点增加动画的流畅度 float t = 0; while (t < 1) { t += Time.deltaTime; Vector3 v = Vector3.Lerp(prePos, nextPos, t); currentPos = v; transform.localPosition = v; yield return new WaitForEndOfFrame(); } } } }