271 lines
9.7 KiB
C#
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
|
|
}
|
|
}
|