using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using DG.Tweening; using UnityEngine; namespace Assets.Scripts.Scenes.VideoRide { public class OnlineVideoPlayer : AbstractVideoPlayer { public double diff; public int frames; protected override void Update() { base.Update(); } //计算 protected override void ComputePlayer() { base.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) > 200) { Destroy(); } var z = current.transform.position.z + diff * 0.1; transform.DOMoveZ((float)z, 1f); //Push(); } } //人物向前超车 右边超车 private void Push() { try { var offsetX = 1f; var currentPlayer = FindObjectOfType(); //根据差距动态位移 var current = currentPlayer.transform.position; var x = current.x + offsetX; var z = current.z + diff; var y = current.y; var end = new Vector3(x, y, (float)z); //前方有人 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; 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); } } protected override void ComputeAnimator() { base.ComputeAnimator(); if (manager.CurrentPlayer == null || manager.CurrentPlayer.UserId != UserId) { var currentFrame = manager.GetFrameOffSet(diff); var mainFrame = manager.GetCurrentFrame(); var min = Math.Min(currentFrame, mainFrame); var max = Math.Max(currentFrame, mainFrame); frames = currentFrame; var result = manager.mockDirection.Where(c => c.Start < min && c.End > max).FirstOrDefault(); bearing = result?.Value ?? 0; animator.SetFloat("bearing", bearing); } else { var mainFrame = manager.GetCurrentFrame(); var result = manager.mockDirection.Where(c => c.Start < mainFrame && c.End > mainFrame).FirstOrDefault(); bearing = result?.Value ?? 0; animator.SetFloat("bearing", bearing); } } protected override int GetCurrentFrame() { return manager.DistanceToFrames(diff) + manager.GetCurrentFrame(); } protected override void ComputeVideo() { base.ComputeVideo(); } //设置当前玩家属性 public void SetPlayer(string name,double totalDistance, double cadance,double heartRate, double wkg, int userId) { this.wkg = 2.3d; this.UserName = name; this.cadance = cadance; this.totalDistance = totalDistance; this.heartRate = (int?)heartRate; this.UserId = userId; this.power = 200; } } }