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

236 lines
9.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Assets.Scenes.Ride.Scripts;
using DG.Tweening;
using FluffyUnderware.Curvy.Controllers;
using UnityEngine;
namespace Assets.Scripts.Scenes.VideoRide
{
public class OnlineVideoPlayer : AbstractVideoPlayer
{
public Transform target;
public double diff;
public int frames;
public float xOffset;
private void Start()
{
base.Start();
ydic.Add(0, -1);
ydic.Add(1555, 0);
}
protected override void Update()
{
base.Update();
////如果当前用户是被观察则控制视频播放
//if (manager.CurrentPlayer.UserId == UserId)
//{
// manager.Play(manager.CurrentPlayer.totalDistance);
//}
}
//计算
protected override void ComputePlayer()
{
var current = manager.CurrentPlayer;
if (current != null && current.UserId != UserId)
{
//var left = totalDistance % mapData.TotalDistance;
//var right = current.totalDistance % mapData.TotalDistance;
//diff = (left - right) * 1000;
//if (Math.Abs(diff*1000) > 150)
//{
// //销毁父容器
// transform.parent.Destroy();
// Destroy();
//}
}
}
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>();
//人物向前超车 右边超车
protected override void Turn()
{
base.Turn();
//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);
// }
//}
////计算左右倾斜角度
//var targetLatlon = manager.CurrentPlayer.currentlatLon; //目标gps
//var bearing = TurfHelper.Bearing(targetLatlon.ToArray(), currentlatLon.ToArray());
//currentRotation.y += (float)bearing;
//transform.DORotate(currentRotation, 1, RotateMode.Fast);
//计算左右位移
//x =(z - z1)/tanp + x1;
//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);
//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);
//}
}
private int currentFrame { get; set; }
protected override void ComputeAnimator()
{
base.ComputeAnimator();
if (manager.CurrentPlayer == null || manager.CurrentPlayer.UserId != UserId)
{
var result = manager.mockDirection.Where(c => c.Start < currentFrame && c.End > currentFrame).FirstOrDefault();
bearing = result?.RotationY ?? 0;
//animator.SetFloat("bearing", bearing);
}
}
protected override int GetCurrentFrame()
{
return this.currentFrame;//(int)(diff * 10) + manager.GetCurrentFrame();
}
protected override void ComputeVideo()
{
base.ComputeVideo();
}
protected override void CreateHeadImage()
{
base.CreateHeadImage();
if (diff < 0)
((RectTransform)head.transform).anchoredPosition = new Vector2(((RectTransform)head.transform).anchoredPosition.x, -800f);
}
//人物碰撞
void OnCollisionEnter(Collision collision)
{
transform.DOMoveX(transform.position.x - 1,1);
}
private SplineController splineController;
private double preTime;
//设置当前玩家属性
public void SetPlayer(string name, double distance, double totalDistance, double cadance,double heartRate, double wkg, int userId,double power,double currentPlayerDistance,int frame)
{
if (manager == null)
{
manager = FindObjectOfType<VideoGameManager>();
}
var f = totalDistance;
StartCoroutine(DoAnimation(this.preTime, f - this.preTime));
preTime = f;
this.wkg = wkg;
this.UserName = name;
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;
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;
}
}
}
}