2022-10-08 13:26:38 +08:00

271 lines
9.7 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.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<Light>();
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<VideoUIManager>();
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<VideoUIManager>();
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<int, string> list = new Dictionary<int, string>();
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
}
}