2022-03-30 18:41:06 +08:00

120 lines
4.0 KiB
C#

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 { get; set; }
protected override void Update()
{
base.Update();
}
//计算
protected override void ComputePlayer()
{
base.ComputePlayer();
var current = manager.CurrentPlayer;
if (current != null)
{
diff = totalDistance - current.totalDistance;
var z = current.transform.position.z + diff;
transform.DOMoveZ((float)z, 1f);
Push();
}
}
//人物向前超车 右边超车
private void Push()
{
try
{
var offsetX = 1f;
var currentPlayer = FindObjectOfType<VideoPlayer>();
//根据差距动态位移
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<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;
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();
var currentFrame = manager.GetFrameOffSet(diff);
var mainFrame = manager.GetCurrentFrame();
var min = Math.Min(currentFrame, mainFrame);
var max = Math.Max(currentFrame, mainFrame);
for (int i = min; i < max; i++)
{
if (manager.mockDirection.ContainsKey(currentFrame))
{
bearing = manager.mockDirection[currentFrame];
}
animator.SetFloat("bearing", bearing);
}
}
protected override int GetCurrentFrame()
{
return manager.DistanceToFrames(diff) + manager.GetCurrentFrame();
}
protected override void ComputeVideo()
{
if (manager.CurrentPlayer == null || manager.CurrentPlayer.UserId != UserId)
return;
mapData = manager.GetMapData();
float ratio = 1;
if (currentIndex + 1 < mapData.List.Count)
{
ratio = (float)(manager.CurrentPlayer.speed / mapData.List[currentIndex + 1].Speed);
}
else
{
ratio = (float)(manager.CurrentPlayer.speed / mapData.List[currentIndex].Speed);
}
manager.Play(ratio);
}
//设置当前玩家属性
public void SetPlayer(string name,double totalDistance, double cadance,double heartRate, double wkg, int userId)
{
this.wkg = wkg;
this.UserName = name;
this.speed = 10;
this.cadance = cadance;
this.totalDistance = totalDistance;
this.heartRate = (int?)heartRate;
this.UserId = userId;
this.power = 200;
}
}
}