155 lines
5.6 KiB
C#
155 lines
5.6 KiB
C#
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.Linq;
|
|
using UnityEngine;
|
|
|
|
namespace Assets.Scripts.Scenes.VideoRide
|
|
{
|
|
public class VideoPlayer : AbstractVideoPlayer
|
|
{
|
|
public double EndDistance => totalDistance;
|
|
protected Transform LightTrans { get; set; }
|
|
protected override void Start()
|
|
{
|
|
base.Start();
|
|
animator.Play("idle");
|
|
UserId = App.CurrentUser.Id;
|
|
UserName = App.CurrentUser.Nickname;
|
|
var light = FindObjectOfType<Light>();
|
|
LightTrans = light.transform;
|
|
}
|
|
|
|
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;
|
|
manager.Save(totalDistance);
|
|
}
|
|
protected override void ComputeAnimator()
|
|
{
|
|
base.ComputeAnimator();
|
|
}
|
|
protected override void Turn()
|
|
{
|
|
base.Turn();
|
|
//控制人物的前后左右
|
|
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 = 100;
|
|
cadance = 70;
|
|
heartRate = 160;
|
|
//#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);
|
|
base.ComputePlayer();
|
|
HandleForGameRoom();
|
|
}
|
|
private bool gameRoomHandled { get; set; }
|
|
private void HandleForGameRoom()
|
|
{
|
|
var model = manager.cyclingController as GameModel;
|
|
if (model != null && model.FirstEndTime.HasValue && !gameRoomHandled)
|
|
{
|
|
gameRoomHandled = true;
|
|
var gap = model.FirstEndTime.Value - UIManager.Now.GetDateTime();
|
|
var seconds = Math.Floor(gap.TotalSeconds);
|
|
UIManager.ShowGameRoomCountDownPanel((int)seconds, () => {
|
|
Upload();
|
|
var uiManager = FindObjectOfType<VideoUIManager>();
|
|
uiManager.ShowResultPanel();
|
|
});
|
|
}
|
|
}
|
|
//控制视频播放速度
|
|
protected override void ComputeVideo()
|
|
{
|
|
base.ComputeVideo();
|
|
}
|
|
|
|
protected override void ComputeRecord()
|
|
{
|
|
var mapData = manager.GetMapData();
|
|
//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,//totalDistance > mapData.TotalDistance ? mapData.TotalDistance : totalDistance,
|
|
_Cadence = cadance,
|
|
_HeartRate = heartRate,
|
|
_Lat = currentlatLon.x,
|
|
_Lon = currentlatLon.y,
|
|
_TotalClimb = totalClimb,
|
|
_FrameRate = manager.GetCurrentFrame()
|
|
};
|
|
var preDistance = targetData._Distance - distance;//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);
|
|
|
|
//if (totalDistance >= mapData.TotalDistance)
|
|
//{
|
|
// start = false;
|
|
// manager.Save(totalDistance);
|
|
//}
|
|
}
|
|
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
}
|