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 ydic = new Dictionary(); //人物向前超车 右边超车 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)}*Tan(bearing){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(); // 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(); } 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(); } 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; } } } }