236 lines
9.4 KiB
C#
Raw Normal View History

2022-03-10 18:32:53 +08:00
using System;
2022-10-08 13:26:38 +08:00
using System.Collections;
2022-08-17 18:28:28 +08:00
using System.Collections.Generic;
2022-03-10 18:32:53 +08:00
using System.Linq;
2022-08-17 18:28:28 +08:00
using Assets.Scenes.Ride.Scripts;
2022-03-10 18:32:53 +08:00
using DG.Tweening;
2022-10-08 13:26:38 +08:00
using FluffyUnderware.Curvy.Controllers;
2022-03-24 09:36:59 +08:00
using UnityEngine;
2022-03-10 18:32:53 +08:00
namespace Assets.Scripts.Scenes.VideoRide
{
public class OnlineVideoPlayer : AbstractVideoPlayer
{
public Transform target;
public double diff;
public int frames;
2022-10-08 13:26:38 +08:00
public float xOffset;
2022-08-17 18:28:28 +08:00
private void Start()
{
base.Start();
ydic.Add(0, -1);
ydic.Add(1555, 0);
}
2022-03-24 09:36:59 +08:00
protected override void Update()
{
base.Update();
2022-08-24 18:43:43 +08:00
////如果当前用户是被观察则控制视频播放
//if (manager.CurrentPlayer.UserId == UserId)
//{
// manager.Play(manager.CurrentPlayer.totalDistance);
//}
2022-03-24 09:36:59 +08:00
}
2022-03-10 18:32:53 +08:00
//计算
protected override void ComputePlayer()
{
var current = manager.CurrentPlayer;
2022-03-31 18:40:19 +08:00
if (current != null && current.UserId != UserId)
{
//var left = totalDistance % mapData.TotalDistance;
//var right = current.totalDistance % mapData.TotalDistance;
//diff = (left - right) * 1000;
2022-10-08 13:26:38 +08:00
//if (Math.Abs(diff*1000) > 150)
//{
// //销毁父容器
// transform.parent.Destroy();
// Destroy();
//}
}
2022-03-24 09:36:59 +08:00
}
2022-06-02 18:05:41 +08:00
2022-08-17 18:28:28 +08:00
private const int zrate = 20;// z轴与帧数的比例 1 20 与真实距离 1:2
private const int yrate = 3;// y轴与帧数的比例 1 3
private const int xrate = 20;// x轴与帧数的比例 1 20
private Dictionary<int, float> ydic = new Dictionary<int, float>();
2022-03-24 09:36:59 +08:00
//人物向前超车 右边超车
protected override void Turn()
2022-03-24 09:36:59 +08:00
{
base.Turn();
2022-10-08 13:26:38 +08:00
//if (splineController != null && manager != null && manager.splineController != null)
//{
// var ratio = this.diff / manager.GetMapData().TotalDistance;
// splineController.Position = (float)(ratio + manager.splineController.Position);
//}
//if (manager.CurrentPlayer.UserId == UserId)
// return;
////计算前后位移
//var current = manager.CurrentPlayer;
//var interval = this.currentFrame - manager.GetCurrentFrame();
//var z = current.transform.position.z + interval / zrate;//diff * 500;//
//transform.DOMoveZ((float)z,1f);
////计算上下位移
//var targetIndex = manager.CurrentPlayer.currentIndex;
//var pointList = mapData.List;
//var currentHeight = pointList[currentIndex].Elevation;//当前海拔,
//var targetHeight = pointList[targetIndex].Elevation;//目标海拔
//var heightOffset = (currentHeight - targetHeight);
//var maxEl = pointList.Max(c => c.Elevation);
//var minEl = pointList.Min(c => c.Elevation);
//var y = diff != 0 ? heightOffset / (diff * 1000) * z-1 : 0;
//var target = manager.CurrentPlayer.transform;
//if (diff > 0)
//{
// var h = heightOffset / (diff*1000);
// var height = h * (z - target.position.z) - 1;
// //if (heightOffset < 0)
// //{
// // heightOffset *= 2;
// //}
// //else
// //{
// // heightOffset /= 100;
// //}
// if (height != 0)
// {
// transform.DOMoveY((float)height, 1f);
// }
// else
// {
// transform.DOMoveY(-1, 1f);
// }
//}
2022-08-17 18:28:28 +08:00
////计算左右倾斜角度
2022-10-08 13:26:38 +08:00
//var targetLatlon = manager.CurrentPlayer.currentlatLon; //目标gps
//var bearing = TurfHelper.Bearing(targetLatlon.ToArray(), currentlatLon.ToArray());
2022-08-17 18:28:28 +08:00
//currentRotation.y += (float)bearing;
//transform.DORotate(currentRotation, 1, RotateMode.Fast);
//计算左右位移
//x =(z - z1)/tanp + x1;
2022-10-08 13:26:38 +08:00
//bearing = (next.RotationY + manager.CurrentPlayer.next.RotationY) * Math.PI / 180;//转化为弧度值
//var x =(z - target.position.z) * Math.Tan(bearing) + target.position.x;
//Debug.Log($"当前海拔差{heightOffset} 当前角度{bearing} 距离{(z - target.position.z)}*Tanbearing{Math.Tanh(bearing)}+目标x{target.position.x}=当前x{x}");
//transform.DOMoveX((float)x, 1f);
2022-08-17 18:28:28 +08:00
//x轴位移
//var x = bearing + current.bearing;
//transform.DOMove(new Vector3(x, transform.position.y, (float)z), 1); // ((float)z, 1f);
//人物转向
//transform.Rotate(new Vector3(0,1,0), bearing);
//z轴位移
//try
//{
// var offsetX = 1f;
// var current = manager.CurrentPlayer;
// var z = current.transform.position.z + diff * 0.5f;
// //前方有人
// if (isHit)
// {
// var onlinePlayer = hit.collider.transform.GetComponent<AbstractVideoPlayer>();
// if (distance - onlinePlayer.distance > 20)
// {
// var prePos = onlinePlayer.transform.position;
// var disx = prePos.x + offsetX;
// var disz = prePos.z + diff;
// var disy = prePos.y;
// var end = new Vector3(disx, (float)disz, disy);
// animator.Play("turnRight");
// transform.DOMove(end, 1f);
// }
// }
// else
// {
// transform.DOMoveZ((float)z, 1f);
// }
//}
//catch (Exception e) {
// print(e.Message);
//}
2022-03-24 09:36:59 +08:00
}
private int currentFrame { get; set; }
2022-03-24 09:36:59 +08:00
protected override void ComputeAnimator()
{
base.ComputeAnimator();
2022-03-31 18:40:19 +08:00
if (manager.CurrentPlayer == null || manager.CurrentPlayer.UserId != UserId)
{
var result = manager.mockDirection.Where(c => c.Start < currentFrame && c.End > currentFrame).FirstOrDefault();
2022-05-25 18:40:47 +08:00
bearing = result?.RotationY ?? 0;
2022-08-17 18:28:28 +08:00
//animator.SetFloat("bearing", bearing);
}
2022-03-24 09:36:59 +08:00
}
protected override int GetCurrentFrame()
{
return this.currentFrame;//(int)(diff * 10) + manager.GetCurrentFrame();
2022-03-10 18:32:53 +08:00
}
protected override void ComputeVideo()
{
2022-03-31 18:40:19 +08:00
base.ComputeVideo();
}
2022-07-06 17:48:55 +08:00
protected override void CreateHeadImage()
{
base.CreateHeadImage();
if (diff < 0)
((RectTransform)head.transform).anchoredPosition = new Vector2(((RectTransform)head.transform).anchoredPosition.x, -800f);
}
2022-10-08 13:26:38 +08:00
//人物碰撞
void OnCollisionEnter(Collision collision)
{
transform.DOMoveX(transform.position.x - 1,1);
}
2022-10-08 13:26:38 +08:00
private SplineController splineController;
private double preTime;
2022-03-10 18:32:53 +08:00
//设置当前玩家属性
public void SetPlayer(string name, double distance, double totalDistance, double cadance,double heartRate, double wkg, int userId,double power,double currentPlayerDistance,int frame)
2022-03-10 18:32:53 +08:00
{
2022-10-08 13:26:38 +08:00
if (manager == null)
{
manager = FindObjectOfType<VideoGameManager>();
}
var f = totalDistance;
StartCoroutine(DoAnimation(this.preTime, f - this.preTime));
preTime = f;
this.wkg = wkg;
2022-03-30 18:41:06 +08:00
this.UserName = name;
2022-03-24 09:36:59 +08:00
this.cadance = cadance;
this.totalDistance = totalDistance;
this.heartRate = (int?)heartRate;
this.UserId = userId;
this.power = power;
this.speed = distance * 3600;
this.diff = totalDistance - currentPlayerDistance;
this.currentFrame = frame;
2022-10-08 13:26:38 +08:00
splineController = transform.parent.GetComponent<SplineController>();
}
private IEnumerator DoAnimation(double preFrame,double offset)
{
float t = 0;
while (t < 1)
{
t += Time.deltaTime;
double result = preFrame + offset * t;
//var s1 = manager.frameList.OrderBy(c => c.Second).Where(c => c.Second > result).FirstOrDefault();
//var s2 = manager.frameList.OrderByDescending(c => c.Second).Where(c => c.Second < result).FirstOrDefault();
if (splineController != null)
{
splineController.Position = manager.startOffset + (float)(result * manager.ratio);//(float)(s2.Distance + (result - s2.Second) / (s1.Second - s2.Second) * (s1.Distance - s2.Distance)); //(float)(result / (double)s1.Key * s1.Value);
}
//if (splineController != null)
// splineController.Position = (float)(result / manager.GetMapData().TotalDistance * splineController.Length);
yield return null;
}
2022-03-10 18:32:53 +08:00
}
}
}