using Assets.Scenes.Ride.Scripts; using Assets.Scenes.Ride.Scripts.Model; using Assets.Scenes.Ride.Scripts.Model.CyclingModels; using DG.Tweening; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using UnityEngine; namespace Assets.Scripts.Scenes.VideoRide { public class VideoPlayer : AbstractVideoPlayer { public double EndDistance => totalDistance; protected Transform LightTrans { get; set; } private bool isSingle = true; protected override void Start() { base.Start(); animator.Play("idle"); UserId = App.CurrentUser.Id; UserName = App.CurrentUser.Nickname; var light = FindObjectOfType(); LightTrans = light.transform; #if UNITY_EDITOR InitConfig(); #endif } protected override bool GetStart() { return manager.IsStart(); } protected override void Update() { base.Update(); } public void SetPower(double power) { this.power = power; } public void SetEndDistance(double distance) { this.totalDistance = distance; } public void Complete() { start = false; var uimanager= FindObjectOfType(); if (uimanager!= null) { uimanager.SaveAndShowResult(); } } protected override void ComputeAnimator() { base.ComputeAnimator(); } protected override void Turn() { base.Turn(); ////控制人物的前后左右 //if (manager._viewMode != VideoGameManager.ViewMode.FIRST) //{ // var l = new Vector3(pre.PositionX, pre.PositionY, pre.PositionZ); // var s = new Vector3(next.PositionX, next.PositionY, next.PositionZ); // var pos = Vector3.Lerp(l, s, t); // transform.DOMove(pos, 0); //} ////控制光线 //var z = new Vector3(50, pre.LightY, 0); //var c = new Vector3(50, next.LightY, 0); //var zc = Vector3.Lerp(z, c, t); //LightTrans.DORotate(zc, 0); } protected override void ComputePlayer() { heartRate = manager.UpDateHeart(); power = manager.UpdatePower(); cadance = manager.UpdateCadence(); //#if UNITY_EDITOR power = 220; cadance = 50; heartRate = 120; //#endif weight = App.CurrentUser.Weight; bicycleWeight = App.CurrentUser.BicycleWeight; wkg = Math.Round(power / weight, 2); var mainFrame = manager.GetCurrentFrame(); var result = manager.mockDirection.Where(c => c.Start < mainFrame && c.End > mainFrame).FirstOrDefault(); bearing = result?.RotationY ?? 0; //发送阻力 manager.TrackResistance(currentSlope * App.RideSetting.Sensitivity / 100); base.ComputePlayer(); //比人先完成触发关门时间 HandleForGameRoom(); } private bool gameRoomHandled { get; set; } //房间倒计时保存 private void HandleForGameRoom() { var model = manager.cyclingController as GameModel; if (model != null && model.FirstEndTime.HasValue && !gameRoomHandled && App.CurrentUser.Id != model.FirstUserId) { gameRoomHandled = true; var gap = model.FirstEndTime.Value - UIManager.Now.GetDateTime(); var seconds = Math.Floor(gap.TotalSeconds); UIManager.ShowGameRoomCountDownPanel((int)seconds, () => { Upload(); var uiManager = FindObjectOfType(); uiManager.ShowResultPanel(); },true); } } //控制视频播放速度 protected override void ComputeVideo() { base.ComputeVideo(); //单人骑行到终点自动暂停 } protected override void ComputeRecord() { var mapData = manager.GetMapData(); //Debug.Log($"ticks:{manager.GetCurrentFrame()}:{manager.GetMapData().List[currentIndex].Elevation}"); //Debug.Log($"ticks:{ticks}-{manager.GetCurrentFrame()}-endistance:{totalDistance}-totalDistance:{mapData.TotalDistance}-index:{currentIndex}-speed:{speed}-currentSlope:{currentSlope}-GetCurrentFrame:{manager.GetCurrentFrame()}-currentlatLon:{bearing}"); //记录骑行数据 var recorderData = manager.cyclingController.recorderData; var targetData = new TargetData { Ticks = ticks, _Power = power, _Speed = speed, _Distance = totalDistance > mapData.TotalDistance ? mapData.TotalDistance : totalDistance, _Cadence = cadance, _HeartRate = heartRate, _Lat = currentlatLon.x, _Lon = currentlatLon.y, _TotalClimb = totalClimb, _FrameRate = manager.GetCurrentFrame() }; var preDistance = totalDistance >= mapData.TotalDistance ? targetData._Distance : targetData._Distance - distance; if (!isSingle) { preDistance = targetData._Distance - distance; } recorderData.PreDistance = Math.Round(preDistance, 6, MidpointRounding.AwayFromZero); recorderData.EndDistance = Math.Round(targetData._Distance, 6, MidpointRounding.AwayFromZero); recorderData.RiderDatas.Add(targetData); //默认启用多圈 if (isSingle && totalDistance >= mapData.TotalDistance) { Complete(); } } protected override void Forward() { base.Forward(); distance = Math.Round(speed / 3600, 5, MidpointRounding.AwayFromZero); totalDistance += distance; } //保存骑行记录 public void Upload() { if (manager.cyclingController.recorderData != null && !manager.cyclingController.recorderData.Saved)//处理重复上传的问题 { manager.Save(totalDistance); } } #if UNITY_EDITOR //人物状态 public const int HERO_UP = 0; public const int HERO_RIGHT = 1; public const int HERO_DOWN = 2; public const int HERO_LEFT = 3; public const int UP = 4; public const int DOWN = 5; private Vector3 rotation = Vector3.zero; private void LateUpdate() { var zdelta = 0.1f; var delta = 0.2f; //控制人物方向 if (Input.GetKey(KeyCode.Q)) { rotation.y -= delta; transform.DORotate(rotation, 0); } if (Input.GetKey(KeyCode.E)) { rotation.y += delta; transform.DORotate(rotation, 0); } //控制人物左右倾斜 if (Input.GetKey(KeyCode.J)) { rotation.z += zdelta; transform.DORotate(rotation, 0); } if (Input.GetKey(KeyCode.K)) { rotation.z -= zdelta; transform.DORotate(rotation, 0); } if (Input.GetKey(KeyCode.Space)) Save(); } private string ConfigPath = Application.streamingAssetsPath + "/newdirection.txt"; //初始化配置 private void InitConfig() { var text = File.ReadAllText(ConfigPath); var arr = text.Replace("\r\n", " ").Split(' '); foreach (var item in arr) { if (!string.IsNullOrEmpty(item)) { int key = Convert.ToInt32(item.Split(':')[0]); list.Add(key, item); } } } private Dictionary list = new Dictionary(); private void Save() { var key = GetCurrentFrame(); //获取人物inpector面板的rotation值 Vector3 vect3 = Vector3.zero; Vector3 vect = Vector3.zero; MethodInfo mth = typeof(Transform).GetMethod("GetLocalEulerAngles", BindingFlags.Instance | BindingFlags.NonPublic); PropertyInfo pi = typeof(Transform).GetProperty("rotationOrder", BindingFlags.Instance | BindingFlags.NonPublic); object rotationOrder = null; if (pi != null) { rotationOrder = pi.GetValue(transform, null); } if (mth != null) { object retVector3 = mth.Invoke(transform, new object[] { rotationOrder }); vect3 = (Vector3)retVector3; } //保存记录 var s = $"{key}:{ Math.Round(vect3.y, 3)},{ Math.Round(vect3.z, 3)},{Math.Round(transform.position.x, 3)},{Math.Round(transform.position.y, 3)},{Math.Round(transform.position.z, 3)},{Math.Round(vect.y, 3)}"; Debug.Log(s); if (list.ContainsKey(key)) { list[key] = s; } else { list.Add(key, s); } var coll = list.OrderBy(c => c.Key); StringBuilder sb = new StringBuilder(); foreach (var item in coll) { sb.AppendLine(item.Value); } File.WriteAllText(ConfigPath, sb.ToString()); } #endif } }