205 lines
6.2 KiB
C#

using UnityEngine;
using System;
using DG.Tweening;
using System.Collections;
using Assets.Scenes.Ride.Scripts.Model;
using Assets.Scenes.Ride.Scripts.Model.CyclingModels;
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<TrailRenderer>();
trail.startWidth = 0.5f;
trail.endWidth = 0.5f;
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<Material>("UI/Material/color7");
//var Graph2 = Resources.Load<Material>("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;
/// <summary>
/// 计算数据,父类会在此方法后处理动画
/// </summary>
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 = 300;
#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);
//实时保存骑行记录
if (ticks % 60 == 0)
{
mainController.SaveRealTime();
}
}
HandleForGameRoom();
}
private bool gameRoomHandled { get; set; }
private void HandleForGameRoom()
{
var model = mainController.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();
});
}
}
protected override void BeforeRun()
{
//if (mainController != null)
//{
// mainController.TcpHandler();
//}
}
//上传数据
public override void Upload()
{
if (mainController.cyclingController.recorderData != null&&!mainController.cyclingController.recorderData.Saved)//处理重复上传的问题
{
mainController.Save(TotalDistance);
}
}
#endregion
//移动海拔图头像
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(CurrentIndex) && !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();
}
}
}
}