AR继续骑和断线重连继续骑
This commit is contained in:
1 parent
ae58f4d461
commit
9e2e778e12
34 files changed
+3828
-497977
No files matched your search
@@ -0,0 +1,108 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Assets.Scenes.Ride.Scripts.Model.RiderModels;
|
||||
using Assets.Scripts.Apis.Models;
|
||||
|
||||
namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
|
||||
{
|
||||
public class ARSingleModel : BaseCycling
|
||||
{
|
||||
|
||||
public ARSingleModel(Route route,RouteResultParam param)
|
||||
: base(route, CyclingModel.Single)
|
||||
{
|
||||
this.IsRecord = true;
|
||||
recorderData = new RecorderDataModel()
|
||||
{
|
||||
CurrentUser = App.CurrentUser,
|
||||
Competitionid = 0,
|
||||
ContinueIndex = 0,
|
||||
ContinueMark = Guid.NewGuid().ToString(),
|
||||
EndDistance = 0,
|
||||
IsCompleted = false,
|
||||
IsNeedRanking = true,
|
||||
CyclingState = CyclingStateEnum.Prepare,
|
||||
CurrentRoute = route,
|
||||
CurrentRouteStartDistance = 0,
|
||||
StartTime = DateTime.Now,//UIManager.Now.GetDateTime(),//DateTime.Now
|
||||
selectParam = param
|
||||
};
|
||||
if (param != null)
|
||||
{
|
||||
recorderData.EndDistance = param.EndDistance;
|
||||
recorderData.CurrentRouteStartDistance = param.EndDistance;
|
||||
if (!string.IsNullOrWhiteSpace(param.ContinueMark))
|
||||
{
|
||||
recorderData.ContinueMark = param.ContinueMark;
|
||||
}
|
||||
else
|
||||
{
|
||||
param.ContinueMark = recorderData.ContinueMark;
|
||||
}
|
||||
recorderData.ContinueIndex = param.ContinueIndex.GetValueOrDefault(0);
|
||||
}
|
||||
|
||||
recorderData.PreDistance = recorderData.EndDistance;
|
||||
|
||||
riders = new List<BaseRider>();
|
||||
|
||||
}
|
||||
|
||||
public override void Run(TargetData targetData)
|
||||
{
|
||||
#region 获取当前路线在线用户
|
||||
riders.Clear();
|
||||
var onlineUsers = MapUDPService.GetOnlineUsers(recorderData.CurrentRoute.RouteInstance.Id).ToList();
|
||||
foreach (var item in onlineUsers)
|
||||
{
|
||||
riders.Add(new OnlineRiderModel()
|
||||
{
|
||||
NickName = item.Name,
|
||||
UserId = item.Id,
|
||||
WxHeadImg = item.HeadImage,
|
||||
Point = new GeoJSON.Net.Geometry.GeographicPosition(item.Point[0], item.Point[1]),
|
||||
EndDistance = item.EndDistance,
|
||||
PreDistance = item.PreDistance,
|
||||
WeightKg = item.WeightKg,
|
||||
Sex = item.Sex,
|
||||
FrameRate = item.FrameRate,
|
||||
Speed = item.Speed,
|
||||
});
|
||||
}
|
||||
#endregion
|
||||
SendUserPositionToServer();
|
||||
}
|
||||
|
||||
protected override void SendUserPositionToServer()
|
||||
{
|
||||
try
|
||||
{
|
||||
if (recorderData.RiderDatas.Any())
|
||||
{
|
||||
var lastData = recorderData.RiderDatas.Last();
|
||||
var preDistance = recorderData.PreDistance;
|
||||
|
||||
var weightKg = Math.Round(lastData._Power / recorderData.CurrentUser.Weight, 2);
|
||||
MapUDPService.Send(route.RouteInstance.Id, recorderData.BelongUserId,
|
||||
new double[] { lastData._Lat, lastData._Lon },
|
||||
recorderData.IsCompleted, false, recorderData.EndDistance,
|
||||
true, 1, lastData._Speed, false, preDistance, weightKg, competitionId: recorderData.Competitionid, recorderData.Saved, 0, lastData._Power, lastData._Cadence, lastData.Ticks, (lastData._FrameRate ?? 0), roomId: recorderData.RoomId);
|
||||
}
|
||||
else if (recorderData.EndDistance > 0)//没有骑,但是有初始位置的情况
|
||||
{
|
||||
var point = _turfHelper.Along(recorderData.EndDistance);
|
||||
MapUDPService.Send(route.RouteInstance.Id, recorderData.BelongUserId, new double[] { point.Latitude, point.Longitude }, endDistance: recorderData.EndDistance, preDistance: recorderData.EndDistance, competitionId: recorderData.Competitionid);
|
||||
}
|
||||
else
|
||||
{
|
||||
MapUDPService.Send(route.RouteInstance.Id, recorderData.BelongUserId, route.Point.First().Reverse().ToArray(), competitionId: recorderData.Competitionid, roomId: recorderData.RoomId);
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 13f9e4cb9b08f5f4facbb08cd5eb9d65
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -81,16 +81,14 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
|
||||
/// <param name="data"></param>
|
||||
public virtual void Run(TargetData targetData)
|
||||
{
|
||||
//将当前用户的位置发送到udf服务
|
||||
SendUserPositionToServer();
|
||||
//OutModel outData = GetSelfTargetData(targetData);
|
||||
BeforeRunAfterPakcData();//执行前的函数
|
||||
SendUserPositionToServer();//将当前用户的位置发送到udf服务
|
||||
BeforeRunAfterPakcData();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// =>发送用户的位置信息到服务端
|
||||
/// </summary>
|
||||
private void SendUserPositionToServer()
|
||||
protected virtual void SendUserPositionToServer()
|
||||
{
|
||||
try
|
||||
{
|
||||
@@ -131,7 +129,6 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
|
||||
protected double SpeedToDistance(double speed)
|
||||
{
|
||||
return Math.Round(speed / 3600, 5, MidpointRounding.AwayFromZero);
|
||||
//return 0.08;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -62,9 +62,8 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
|
||||
public override void Run(TargetData targetData)
|
||||
{
|
||||
#region 获取当前路线在线用户
|
||||
riders.RemoveAll(r => r.IsSelf == false);
|
||||
var onlineUsers = MapUDPService.GetOnlineUsers(recorderData.CurrentRoute.RouteInstance.Id, recorderData.RoomId).Where(d => d.IsSelf == false)
|
||||
.ToList();
|
||||
riders.Clear();
|
||||
var onlineUsers = MapUDPService.GetOnlineUsers(recorderData.CurrentRoute.RouteInstance.Id, recorderData.RoomId).ToList();
|
||||
foreach (var item in onlineUsers)
|
||||
{
|
||||
riders.Add(new OnlineRiderModel()
|
||||
|
||||
@@ -47,6 +47,14 @@ namespace Assets.Scenes.Ride.Scripts.Model
|
||||
/// 最后骑行的距离
|
||||
/// </summary>
|
||||
public double EndDistance { get; set; }
|
||||
|
||||
public double RouteDistance
|
||||
{
|
||||
get
|
||||
{
|
||||
return this.EndDistance * 1000;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// 是否是当前登陆人
|
||||
/// </summary>
|
||||
@@ -68,5 +76,7 @@ namespace Assets.Scenes.Ride.Scripts.Model
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public bool IsFinished { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -12,6 +12,10 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
public abstract class AbstractVideoPlayer : MonoBehaviour, IRider
|
||||
{
|
||||
public double Diff { get;set; }
|
||||
protected int frames;
|
||||
protected int currentFrame { get; set; }
|
||||
protected double preTime;
|
||||
protected Animator animator;
|
||||
public GameObject head { get; set; }
|
||||
protected Image ftpImage { get; set; }
|
||||
@@ -41,35 +45,23 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
public int currentIndex;
|
||||
public float bearing = 0f;
|
||||
protected MapDataModel mapData;
|
||||
private float timer = 1f;
|
||||
private float timer = 0f;
|
||||
protected bool start = true;
|
||||
protected Sequence sequence;
|
||||
protected VideoGameManager manager { get; set; }
|
||||
private Camera camera { get; set; }
|
||||
float currenPlayerHeight;
|
||||
Transform bone_bottle_2 { get; set; }
|
||||
Vector3 current { get; set; }
|
||||
Vector3 forward { get; set; }
|
||||
public double Weight { get => this.weight; }
|
||||
public double BicycleWeight { get => this.bicycleWeight; }
|
||||
public double Speed { get => this.speed; }
|
||||
public double Power { get => this.power; }
|
||||
public double Elevation { get => this.elevation; }
|
||||
public double Cadance { get => this.cadance; }
|
||||
public double Wkg { get => this.wkg; }
|
||||
public int? HeartRate { get => this.heartRate; }
|
||||
public double TotalDistance { get => this.totalDistance; }
|
||||
public double CurrentSlope { get => this.currentSlope; }
|
||||
public double CurrentSlopeDistance { get => this.currentSlopeDistance; }
|
||||
public double NextSlope { get => this.nextSlope; }
|
||||
public double NextSlopeDistance { get => this.nextSlopeDistance; }
|
||||
public double Distance { get => this.distance; }
|
||||
public double TotalClimb => this.totalClimb;
|
||||
|
||||
public double Speed { get; set; }
|
||||
public double StartDistance { get; set; }
|
||||
public double PreDistance { get; set; }
|
||||
public double EndDistance { get; set; }
|
||||
public double OnlineSpeed { get; set; }
|
||||
public int UserId => this.userId;
|
||||
|
||||
public string UserName => this.userName;
|
||||
|
||||
public bool IsStart = false;
|
||||
|
||||
protected virtual void Start()
|
||||
{
|
||||
animator = GetComponent<Animator>();
|
||||
@@ -84,36 +76,33 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
animator.Play("idle");
|
||||
}
|
||||
camera = Camera.main;
|
||||
//bone_bottle_2
|
||||
bone_bottle_2 = transform.Find("bone_cable_20");
|
||||
//var config = manager.mockDirection;
|
||||
//pre = config[0];
|
||||
//next = config[0];
|
||||
|
||||
}
|
||||
protected virtual void Update()
|
||||
{
|
||||
|
||||
timer -= Time.deltaTime;
|
||||
CreateHeadImage();
|
||||
//Turn();
|
||||
|
||||
|
||||
while (timer <= 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
ComputeNextSlope();//计算下一个坡度
|
||||
|
||||
if (GetStart())
|
||||
if (manager.IsStart())
|
||||
{
|
||||
ticks++;
|
||||
ComputePlayer();//计算人物属性
|
||||
Forward();
|
||||
ComputeRecord();
|
||||
ComputeVideo();
|
||||
ComputeAnimator();//控制动画
|
||||
}
|
||||
ComputeAnimator();//控制动画
|
||||
else
|
||||
{
|
||||
animator.Play("idle");
|
||||
}
|
||||
|
||||
timer += 1f;
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -124,10 +113,6 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
}
|
||||
}
|
||||
}
|
||||
protected virtual bool GetStart()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
//动画状态机
|
||||
protected virtual void ComputeAnimator()
|
||||
{
|
||||
@@ -158,7 +143,6 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
return manager.GetCurrentFrame();
|
||||
}
|
||||
protected float t { get; set; }
|
||||
protected Vector3 currentRotation;
|
||||
//计算人物当前属性
|
||||
protected virtual void ComputePlayer()
|
||||
@@ -281,6 +265,10 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
}
|
||||
}
|
||||
}
|
||||
private void OnDisable()
|
||||
{
|
||||
head?.SetActive(false);
|
||||
}
|
||||
//显示人物海拔图的头像
|
||||
protected virtual void CreateHeadImage()
|
||||
{
|
||||
@@ -314,5 +302,12 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
head?.Destroy();
|
||||
gameObject.Destroy();
|
||||
}
|
||||
//设置当前玩家属性
|
||||
public abstract void SetPlayer(string name, double speed, double preDistance, double endDistance, double cadance, double heartRate, double wkg, int userId, double power, double currentPlayerDistance, int frame);
|
||||
|
||||
public void SetStartDistance(double distance)
|
||||
{
|
||||
this.StartDistance = distance *1000;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5,8 +5,6 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
public class OnlineVideoPlayer : AbstractVideoPlayer
|
||||
{
|
||||
public double diff;
|
||||
public int frames;
|
||||
|
||||
protected override void Start()
|
||||
{
|
||||
@@ -23,8 +21,6 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
|
||||
}
|
||||
|
||||
private Dictionary<int, float> ydic = new Dictionary<int, float>();
|
||||
private int currentFrame { get; set; }
|
||||
protected override void ComputeAnimator()
|
||||
{
|
||||
base.ComputeAnimator();
|
||||
@@ -40,13 +36,11 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
protected override void CreateHeadImage()
|
||||
{
|
||||
base.CreateHeadImage();
|
||||
if (diff < 0)
|
||||
if (Diff < 0)
|
||||
((RectTransform)head.transform).anchoredPosition = new Vector2(((RectTransform)head.transform).anchoredPosition.x, -800f);
|
||||
}
|
||||
|
||||
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)
|
||||
public override void SetPlayer(string name, double speed, double preDistance, double endDistance, double cadance, double heartRate, double wkg, int userId, double power, double currentPlayerDistance, int frame)
|
||||
{
|
||||
if (manager == null)
|
||||
{
|
||||
@@ -57,13 +51,17 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
this.wkg = wkg;
|
||||
this.userName = name;
|
||||
this.cadance = cadance;
|
||||
this.totalDistance = totalDistance;
|
||||
this.totalDistance = endDistance;
|
||||
this.heartRate = (int?)heartRate;
|
||||
this.userId = userId;
|
||||
this.power = power;
|
||||
this.speed = distance * 3600;
|
||||
this.diff = totalDistance - currentPlayerDistance;
|
||||
this.speed = speed;
|
||||
this.Speed = speed/3.6;
|
||||
this.Diff = endDistance - currentPlayerDistance;
|
||||
this.currentFrame = frame;
|
||||
this.PreDistance = preDistance * 1000;
|
||||
this.EndDistance = endDistance * 1000;
|
||||
this.OnlineSpeed = speed / 3.6;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -37,7 +37,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
private bool isStart { get; set; }
|
||||
private Route route { get; set; }
|
||||
public MapRoute mapRoute { get; set; }
|
||||
public RouteResultParam selectParamModel;
|
||||
public RouteResultParam selectParamModel { get; set; }
|
||||
public RouteResult routeResult;
|
||||
public string recordId { get; set; }
|
||||
public DateTime startTime { get; set; }
|
||||
@@ -115,6 +115,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
RouteId = routeId
|
||||
};
|
||||
}
|
||||
Debug.Log("start");
|
||||
endDistance = 0;
|
||||
videoLoading = FindObjectOfType<VideoLoading>();
|
||||
}
|
||||
@@ -158,7 +159,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
return rankingList;
|
||||
}
|
||||
|
||||
List<AbstractVideoPlayer> visibleRiders = new List<AbstractVideoPlayer>();//当前线路上的人
|
||||
public List<AbstractVideoPlayer> visibleRiders = new List<AbstractVideoPlayer>();//当前线路上的人
|
||||
private const int limits = 5;//在线的其他人数
|
||||
private double MaxVisibleDistance = 200d;//最大显示距离
|
||||
//创建当前线路其他选手
|
||||
@@ -166,11 +167,15 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
if (list == null || list.Count == 0)
|
||||
{
|
||||
var currentList = FindObjectsOfType<RiderRenderer>();
|
||||
foreach (var item in currentList)
|
||||
{
|
||||
item.Speed = 0;
|
||||
item.Paused = true;
|
||||
}
|
||||
return;
|
||||
}
|
||||
CreateCurrentPlayer(list);//如果是观察者模式创建观察主人工
|
||||
var onlinelist = MapUDPService.GetOnlineUsers(App.RouteIdParam);//最新列表
|
||||
var currentPlayerInfo = onlinelist.Where(c => c.Id == CurrentPlayer.UserId).FirstOrDefault();
|
||||
var trainController = GetComponent<ARTrainingController>();
|
||||
//移除退出的选手
|
||||
var players = FindObjectsOfType<OnlineVideoPlayer>();
|
||||
foreach (var item in players)
|
||||
@@ -180,11 +185,11 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
rideObjs.Remove(item);
|
||||
visibleRiders.Remove(item);
|
||||
//item.Destroy();//TODO:
|
||||
//trainController.RemoveRider(item.UserId);
|
||||
}
|
||||
}
|
||||
|
||||
var needUpdateList = list.Where(c=>Math.Abs(c.EndDistance-CurrentPlayer.totalDistance)*1000 <= MaxVisibleDistance).Take(limits).ToList();
|
||||
var currentPlayerInfo = list.Where(c => c.IsSelf).FirstOrDefault();
|
||||
var needUpdateList = list.OrderByDescending(c=>c.IsSelf).ToList();
|
||||
foreach (var item in needUpdateList)
|
||||
{
|
||||
var onlineRider = item as OnlineRiderModel;
|
||||
@@ -192,17 +197,18 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
//更新
|
||||
if (visibleItem != null)
|
||||
{
|
||||
var online = visibleItem as OnlineVideoPlayer;
|
||||
online.SetPlayer(onlineRider.NickName, onlineRider.EndDistance - onlineRider.PreDistance, onlineRider.EndDistance, item.Cadence, item.HeartRate, onlineRider.WeightKg, item.UserId, onlineRider.Power, currentPlayerInfo.EndDistance, onlineRider.FrameRate.Value);
|
||||
visibleItem.SetPlayer(onlineRider.NickName, onlineRider.Speed, onlineRider.PreDistance, onlineRider.EndDistance, item.Cadence, item.HeartRate, onlineRider.WeightKg, item.UserId, onlineRider.Power, currentPlayerInfo.EndDistance, onlineRider.FrameRate.Value);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (currentPlayerInfo != null)
|
||||
if (currentPlayerInfo == null)
|
||||
return;
|
||||
var diff = item.EndDistance % mapData.TotalDistance - currentPlayerInfo.EndDistance % mapData.TotalDistance;
|
||||
if (Math.Abs(diff * 1000) <= MaxVisibleDistance)
|
||||
{
|
||||
var diff = item.EndDistance % mapData.TotalDistance - currentPlayerInfo.EndDistance % mapData.TotalDistance;
|
||||
if (Math.Abs(diff * 1000) <= MaxVisibleDistance)
|
||||
GameObject obj = null;
|
||||
if (!item.IsSelf)
|
||||
{
|
||||
GameObject obj;
|
||||
if (onlineRider.Sex == 1)
|
||||
{
|
||||
obj = Instantiate(OnlinePlayer, transform);
|
||||
@@ -211,43 +217,44 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
obj = Instantiate(OnlinePlayer_NV, transform);
|
||||
}
|
||||
|
||||
var online = obj.GetComponentInChildren<OnlineVideoPlayer>();
|
||||
var rideObj = obj.GetComponentInChildren<RiderRenderer>();
|
||||
rideObjs.Add(online,rideObj);
|
||||
online.SetStartDistance(item.EndDistance);
|
||||
rideObj.Distance = (float)online.StartDistance;
|
||||
rideObj.RouteDistance = rideObj.Distance;
|
||||
rideObjs.Add(online, rideObj);
|
||||
visibleRiders.Add(online);
|
||||
online.SetPlayer(onlineRider.NickName, onlineRider.EndDistance - onlineRider.PreDistance, onlineRider.EndDistance, item.Cadence, item.HeartRate, onlineRider.WeightKg, item.UserId, onlineRider.Power, currentPlayerInfo.EndDistance, onlineRider.FrameRate.Value);
|
||||
trainController.AddRider(onlineRider);
|
||||
online.SetPlayer(onlineRider.NickName, onlineRider.Speed, onlineRider.PreDistance, onlineRider.EndDistance, item.Cadence, item.HeartRate, onlineRider.WeightKg, item.UserId, onlineRider.Power, currentPlayerInfo.EndDistance, onlineRider.FrameRate.Value);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (App.CurrentUser.Sex == 1)
|
||||
{
|
||||
var playerprefab = Resources.Load<GameObject>("UI/Prefab/AR/VidePlayer");
|
||||
videoPlayer = Instantiate(playerprefab, transform);
|
||||
}
|
||||
else
|
||||
{
|
||||
var playerprefabNV = Resources.Load<GameObject>("UI/Prefab/AR/VidePlayer_NV");
|
||||
videoPlayer = Instantiate(playerprefabNV, transform);
|
||||
}
|
||||
CurrentPlayer = videoPlayer.GetComponent<AbstractVideoPlayer>();
|
||||
var vv = videoPlayer.GetComponent<VideoPlayer>();
|
||||
vv.SetEndDistance(item.EndDistance);
|
||||
CurrentPlayer.SetStartDistance(item.EndDistance);
|
||||
var rideObj = videoPlayer.GetComponent<RiderRenderer>();
|
||||
rideObj.Distance = (float)CurrentPlayer.StartDistance;
|
||||
rideObj.RouteDistance = rideObj.Distance;
|
||||
rideObjs.Add(CurrentPlayer, rideObj);
|
||||
visibleRiders.Add(CurrentPlayer);
|
||||
CurrentPlayer.SetPlayer(onlineRider.NickName, onlineRider.Speed, onlineRider.PreDistance, onlineRider.EndDistance, item.Cadence, item.HeartRate, onlineRider.WeightKg, item.UserId, onlineRider.Power, currentPlayerInfo.EndDistance, onlineRider.FrameRate.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
//观察者模式随机选择当前骑行的人作为观察对象
|
||||
private void CreateCurrentPlayer(List<BaseRider> list)
|
||||
{
|
||||
if (_aRMode == ARMode.INSPECT && CurrentPlayer == null)
|
||||
{
|
||||
var currentPlayer = list.FirstOrDefault();
|
||||
if (currentPlayer != null)
|
||||
{
|
||||
var onlineRider = currentPlayer as OnlineRiderModel;
|
||||
GameObject obj;
|
||||
if (onlineRider.Sex == 1)
|
||||
{
|
||||
obj = Instantiate(OnlinePlayer, transform);
|
||||
}
|
||||
else
|
||||
{
|
||||
obj = Instantiate(OnlinePlayer_NV, transform);
|
||||
}
|
||||
var online = obj.GetComponent<OnlineVideoPlayer>();
|
||||
online.SetPlayer(onlineRider.NickName, onlineRider.EndDistance - onlineRider.PreDistance, onlineRider.EndDistance, onlineRider.Cadence, onlineRider.HeartRate, onlineRider.TotalTicks, onlineRider.UserId, onlineRider.Power, onlineRider.EndDistance, onlineRider.FrameRate.Value);
|
||||
obj.transform.DOMoveX(0, 1);
|
||||
ChangePlayer(currentPlayer.UserId);
|
||||
CurrentPlayer = online;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//设置当前是骑行模式还是观察模式
|
||||
public void SetCurrentMode(ARMode aRMode)
|
||||
{
|
||||
@@ -256,7 +263,8 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
uimanager.SetCurrentMode(aRMode);
|
||||
if (_aRMode != ARMode.INSPECT)
|
||||
{
|
||||
InitCurrentPlayer();
|
||||
//InitCurrentPlayer();
|
||||
Debug.Log("ContinueAsync");
|
||||
ContinueAsync();
|
||||
}
|
||||
else
|
||||
@@ -267,21 +275,6 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
public GameObject videoPlayer;
|
||||
public GameObject target;
|
||||
|
||||
//初始化人物模型
|
||||
public void InitCurrentPlayer()
|
||||
{
|
||||
if (App.CurrentUser.Sex == 1)
|
||||
{
|
||||
var playerprefab = Resources.Load<GameObject>("UI/Prefab/AR/VidePlayer");
|
||||
videoPlayer = Instantiate(playerprefab, transform);
|
||||
}
|
||||
else
|
||||
{
|
||||
var playerprefabNV = Resources.Load<GameObject>("UI/Prefab/AR/VidePlayer_NV");
|
||||
videoPlayer = Instantiate(playerprefabNV, transform);
|
||||
}
|
||||
CurrentPlayer = videoPlayer.GetComponent<AbstractVideoPlayer>();
|
||||
}
|
||||
//切换人物 TODO:替换写法
|
||||
public void ChangePlayer(int userId)
|
||||
{
|
||||
@@ -298,7 +291,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
var onlineRider = currentPlayer as OnlineRiderModel;
|
||||
var obj = Instantiate(OnlinePlayer, transform);
|
||||
var online = obj.GetComponent<OnlineVideoPlayer>();
|
||||
online.SetPlayer(onlineRider.NickName, onlineRider.EndDistance-onlineRider.PreDistance, onlineRider.EndDistance, onlineRider.Cadence, onlineRider.HeartRate, 0, onlineRider.UserId, onlineRider.Power, onlineRider.EndDistance, onlineRider.FrameRate.Value);
|
||||
online.SetPlayer(onlineRider.NickName, onlineRider.Speed,onlineRider.PreDistance, onlineRider.EndDistance, onlineRider.Cadence, onlineRider.HeartRate, 0, onlineRider.UserId, onlineRider.Power, onlineRider.EndDistance, onlineRider.FrameRate.Value);
|
||||
CurrentPlayer = online;
|
||||
}
|
||||
var clearList = players.Where(c => c.UserId != userId);
|
||||
@@ -314,7 +307,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
return infoPanel;
|
||||
}
|
||||
//骑行记录
|
||||
//继续骑行
|
||||
public void ContinueAsync()
|
||||
{
|
||||
//骑行结果
|
||||
@@ -322,23 +315,22 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
routeResult = App.routeResult;
|
||||
selectParamModel = App.routeResult.ContinueCyclingParam;
|
||||
Debug.Log("selectParamModel"+ selectParamModel.ContinueMark);
|
||||
SetCyclingModel(CyclingModel.Single);
|
||||
endDistance = routeResult.EndDistance;
|
||||
//TODO:继续骑行
|
||||
mediaPlayer.Control.SeekToFrame(routeResult.LastFrame ?? 0);
|
||||
var v = FindObjectOfType<VideoPlayer>();
|
||||
v.SetEndDistance(endDistance);
|
||||
//mediaPlayer.Control.SeekToFrame(routeResult.LastFrame ?? 0);
|
||||
}
|
||||
}
|
||||
//设置骑行模式
|
||||
public void SetCyclingModel(CyclingModel mode)
|
||||
{
|
||||
startTime = UIManager.Now.GetDateTime();
|
||||
Debug.Log("SetCyclingModel" + selectParamModel.ContinueMark);
|
||||
this.cyclingModel = mode;
|
||||
switch (cyclingModel)
|
||||
{
|
||||
case CyclingModel.Single:
|
||||
cyclingController = new SingleModel(route, selectParamModel);
|
||||
cyclingController = new ARSingleModel(route, selectParamModel);
|
||||
break;
|
||||
case CyclingModel.GameRoom:
|
||||
cyclingController = new GameModel(route, selectParamModel);
|
||||
@@ -367,7 +359,6 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
//设置视频源文件
|
||||
public void SetMedia(string path)
|
||||
{
|
||||
return;
|
||||
if (mediaPlayer != null)
|
||||
{
|
||||
mediaPlayer.OpenMedia(new MediaPath(path,MediaPathType.AbsolutePathOrURL),false);
|
||||
@@ -378,8 +369,6 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
return isStop;
|
||||
}
|
||||
double preframe = 0;
|
||||
double preDistance = 0;
|
||||
|
||||
//暂停
|
||||
public void Pause()
|
||||
@@ -400,11 +389,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
return mediaPlayer.Control.GetCurrentTimeFrames();
|
||||
}
|
||||
|
||||
|
||||
Vector3 currentCameraRotation = Vector3.zero;
|
||||
Vector3 mVelocity;
|
||||
float prePos = 0f;
|
||||
|
||||
public float ratio = 111.676f;
|
||||
public float startOffset = 0f;
|
||||
//获取AR骑行配置信息
|
||||
@@ -498,7 +483,6 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
return new Vector2d(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
App.gameRoomDetail = null;
|
||||
|
||||
@@ -225,7 +225,17 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
return;
|
||||
startBtnLock = true;
|
||||
var ui = manager.GetCanvasTransform();
|
||||
InitAR();
|
||||
canvasGroup.DOFade(0, 1).onComplete += () => {
|
||||
gameObject.SetActive(false);
|
||||
manager.StartGame();
|
||||
manager.SetCyclingModel(Assets.Scenes.Ride.Scripts.Model.CyclingModel.Single);
|
||||
manager.SetCurrentMode(VideoGameManager.ARMode.RIDE);
|
||||
};
|
||||
}
|
||||
|
||||
public async void InitAR()
|
||||
{
|
||||
//加载本地文件
|
||||
var route = manager.mapRoute;
|
||||
var arDataPath = $"{PFConstants.ARFolder}/{route.Id}/{route.Id}.json";
|
||||
@@ -237,20 +247,14 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
await Task.Run<ARData>((Func<ARData>)(() => aRData = ARData.LoadFromFile(arDataPath)));
|
||||
await Task.Run<RouteDetailData>((Func<RouteDetailData>)(() => routeDetailData = RouteDetailData.LoadFromFile(videoRoute)));
|
||||
var arController = FindObjectOfType<ARTrainingController>();
|
||||
arController.Initialize(aRData, routeDetailData);
|
||||
|
||||
canvasGroup.DOFade(0, 1).onComplete += () => {
|
||||
gameObject.SetActive(false);
|
||||
manager.StartGame();
|
||||
manager.SetCyclingModel(Assets.Scenes.Ride.Scripts.Model.CyclingModel.Single);
|
||||
manager.SetCurrentMode(VideoGameManager.ARMode.RIDE);
|
||||
};
|
||||
arController.Initialize(aRData, routeDetailData);
|
||||
}
|
||||
|
||||
|
||||
public void StartRide(int seconds)
|
||||
{
|
||||
var ui = manager.GetCanvasTransform();
|
||||
InitAR();
|
||||
canvasGroup.DOFade(0, 0).onComplete += () => {
|
||||
gameObject.SetActive(false);
|
||||
manager.SetCyclingModel(CyclingModel.GameRoom);
|
||||
@@ -259,6 +263,8 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
};
|
||||
UIManager.ShowGameRoomCountDownPanel(seconds,()=> {
|
||||
manager.StartGame();
|
||||
manager.SetCyclingModel(Assets.Scenes.Ride.Scripts.Model.CyclingModel.Single);
|
||||
manager.SetCurrentMode(VideoGameManager.ARMode.RIDE);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -1,21 +1,12 @@
|
||||
using Assets.AR;
|
||||
using Assets.Scenes.Ride.Scripts;
|
||||
using Assets.Scenes.Ride.Scripts.Model;
|
||||
using Assets.Scenes.Ride.Scripts.Model;
|
||||
using Assets.Scenes.Ride.Scripts.Model.CyclingModels;
|
||||
using DG.Tweening;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
public class VideoPlayer : AbstractVideoPlayer
|
||||
{
|
||||
public double EndDistance => totalDistance;
|
||||
private bool isSingle = true;
|
||||
protected override void Start()
|
||||
{
|
||||
@@ -25,7 +16,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
userName = App.CurrentUser.Nickname;
|
||||
}
|
||||
|
||||
protected override bool GetStart()
|
||||
protected bool GetStart()
|
||||
{
|
||||
return manager.IsStart();
|
||||
}
|
||||
@@ -43,6 +34,8 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
public void SetEndDistance(double distance)
|
||||
{
|
||||
this.totalDistance = distance;
|
||||
this.PreDistance = distance * 1000;
|
||||
this.EndDistance = PreDistance;
|
||||
}
|
||||
|
||||
public void Complete()
|
||||
@@ -153,5 +146,16 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
manager.Save(totalDistance);
|
||||
}
|
||||
}
|
||||
|
||||
public override void SetPlayer(string name, double speed, double preDistance, double endDistance, double cadance, double heartRate, double wkg, int userId, double power, double currentPlayerDistance, int frame)
|
||||
{
|
||||
if (manager == null)
|
||||
{
|
||||
manager = FindObjectOfType<VideoGameManager>();
|
||||
}
|
||||
this.PreDistance = preDistance * 1000;
|
||||
this.EndDistance = endDistance * 1000;
|
||||
this.OnlineSpeed = speed / 3.6;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -50,7 +50,7 @@ class GameRoomDownloadTask : MonoBehaviour
|
||||
public void UpdateProcess(float process)
|
||||
{
|
||||
slider.value = process;
|
||||
if (process >= 100)
|
||||
if (process >= 1)
|
||||
{
|
||||
done.SetActive(true);
|
||||
doneTxt.SetActive(true);
|
||||
|
||||
@@ -1,18 +1,24 @@
|
||||
using Assets.Scripts;
|
||||
using Assets.AR;
|
||||
using Assets.Scenes.Ride.Scripts;
|
||||
using Assets.Scripts;
|
||||
using Assets.Scripts.Apis;
|
||||
using Assets.Scripts.Apis.Models;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using DG.Tweening;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using UnityEngine;
|
||||
using UnityEngine.EventSystems;
|
||||
using UnityEngine.Networking;
|
||||
using UnityEngine.SceneManagement;
|
||||
using UnityEngine.UI;
|
||||
|
||||
|
||||
public class GameRoomMapItem : MonoBehaviour, IPointerExitHandler, IPointerEnterHandler, IPointerUpHandler
|
||||
public class GameRoomMapItem : MonoBehaviour, IPointerExitHandler, IPointerEnterHandler, IPointerUpHandler,IProgress<float>
|
||||
{
|
||||
public class PropNames
|
||||
{
|
||||
@@ -39,15 +45,11 @@ public class GameRoomMapItem : MonoBehaviour, IPointerExitHandler, IPointerEnter
|
||||
listController = FindObjectOfType<GameRoomListController>();
|
||||
}
|
||||
|
||||
// Update is called once per frame
|
||||
void Update()
|
||||
{
|
||||
|
||||
}
|
||||
float? localY = null;
|
||||
MapRoute map;
|
||||
Dictionary<string, Texture> caches;
|
||||
private MapRouteAreaItem area = null;
|
||||
Slider slider;
|
||||
public void Initial(MapRoute myMap, Dictionary<string, Texture> caches, MapRouteAreaItem area = null)
|
||||
{
|
||||
if (caches != null)
|
||||
@@ -64,7 +66,7 @@ public class GameRoomMapItem : MonoBehaviour, IPointerExitHandler, IPointerEnter
|
||||
var downloadBtn = transform.Find("DownLoadModal/DownLoad").gameObject;
|
||||
var downloading = transform.Find("DownLoadModal/Downloading").gameObject;
|
||||
var downloadTxt = transform.Find("DownLoadModal/Text").gameObject;
|
||||
var slider = transform.Find("DownLoadModal/Slider").GetComponent<Slider>();
|
||||
slider = transform.Find("DownLoadModal/Slider").GetComponent<Slider>();
|
||||
|
||||
var fileName = map.FileName;
|
||||
var path = PFConstants.VideoFolder;
|
||||
@@ -76,49 +78,10 @@ public class GameRoomMapItem : MonoBehaviour, IPointerExitHandler, IPointerEnter
|
||||
downloading.SetActive(true);
|
||||
downloadTxt.SetActive(false);
|
||||
slider.gameObject.SetActive(true);
|
||||
Loom.Current.StartCoroutine(Utils.DownloadFileWithProcess(map.FileName, map.Url, path,(p, req) =>
|
||||
{
|
||||
if (gameObject != null)
|
||||
slider.value = p;
|
||||
if (Loom.DownLoadTaskList.ContainsKey(map.FileName))
|
||||
{
|
||||
Loom.DownLoadTaskList[map.FileName] = p;
|
||||
}
|
||||
else
|
||||
{
|
||||
Loom.DownLoadTaskList.Add(map.FileName, p);
|
||||
}
|
||||
}
|
||||
, (p) =>
|
||||
{
|
||||
if (string.IsNullOrEmpty(p))
|
||||
{
|
||||
var process = 100f;
|
||||
if (Loom.DownLoadTaskList.ContainsKey(map.FileName))
|
||||
{
|
||||
Loom.DownLoadTaskList[map.FileName] = process;
|
||||
}
|
||||
else
|
||||
{
|
||||
Loom.DownLoadTaskList.Add(map.FileName, process);
|
||||
}
|
||||
if (gameObject != null)
|
||||
{
|
||||
slider.value = process;
|
||||
Ride();
|
||||
transform.Find("DownLoadModal").gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (gameObject != null)
|
||||
Utils.showToast(gameObject, p);
|
||||
}
|
||||
}));
|
||||
Loom.Download(map);
|
||||
});
|
||||
|
||||
transform.Find("Name").GetComponent<Text>().text = myMap.Name;
|
||||
|
||||
transform.Find("IdContainer/Text").GetComponent<Text>().text = $"#{myMap.Id}";
|
||||
transform.Find("TimesContainer").gameObject.SetActive(myMap.MineCount > 0);
|
||||
transform.Find("TimesContainer/Text").GetComponent<Text>().text = myMap.MineCountString;
|
||||
@@ -340,4 +303,24 @@ public class GameRoomMapItem : MonoBehaviour, IPointerExitHandler, IPointerEnter
|
||||
{
|
||||
Cursor.SetCursor(null, Vector2.zero, CursorMode.Auto);
|
||||
}
|
||||
|
||||
public void Report(float value)
|
||||
{
|
||||
if (gameObject != null)
|
||||
slider.value = value;
|
||||
if (Loom.DownLoadTaskList.ContainsKey(map.FileName))
|
||||
{
|
||||
Loom.DownLoadTaskList[map.FileName] = value;
|
||||
}
|
||||
else
|
||||
{
|
||||
Loom.DownLoadTaskList.Add(map.FileName, value);
|
||||
}
|
||||
|
||||
if (value == 100)
|
||||
{
|
||||
Ride();
|
||||
transform.Find("DownLoadModal").gameObject.SetActive(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -908,7 +908,7 @@ public class GameRoomListController : PFUIPanel
|
||||
private async void GetList()
|
||||
{
|
||||
if (isEnd) return;
|
||||
var res = await ConfigHelper.mapApi.GetList(pageIndex, pageSize, ftname, distance, string.Join(",", hands), is3d, sort, sortDire, isEnableAR:false, isEnableBattle: true);
|
||||
var res = await ConfigHelper.mapApi.GetList(pageIndex, pageSize, ftname, distance, string.Join(",", hands), is3d, sort, sortDire, isEnableAR: isEnableAR, isEnableBattle: true);
|
||||
if (res.result)
|
||||
{
|
||||
if (res.data.Count == 0)
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
using Assets.Scenes.Ride.Scripts;
|
||||
using Assets.Scripts.Apis.Models;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
|
||||
/// <summary>
|
||||
/// 异步线程更新ui工具类
|
||||
@@ -174,4 +178,27 @@ public class Loom : MonoBehaviour
|
||||
_current = null;
|
||||
}
|
||||
}
|
||||
|
||||
public static async void Download(MapRoute route)
|
||||
{
|
||||
var progress = Progress.Create<float>(x =>
|
||||
DownLoadTaskList[route.FileName] = x
|
||||
);
|
||||
DownLoadTaskList.Add(route.FileName, 0);
|
||||
var path = PFConstants.VideoFolder;
|
||||
var localPath = PFConstants.ARFolder;
|
||||
var arDataPath = route.ARConfig;
|
||||
var videoRoute = route.VideoRoute;
|
||||
var cancelToken = new CancellationTokenSource();
|
||||
var res1 = await UnityWebRequest.Get(arDataPath).SendWebRequest().WithCancellation(cancelToken.Token);//下载AR数据
|
||||
var res2 = await UnityWebRequest.Get(videoRoute).SendWebRequest().WithCancellation(cancelToken.Token);//下载video视频数据
|
||||
var res3 = await UnityWebRequest.Get(route.Url).SendWebRequest().ToUniTask(progress);//下载视频
|
||||
|
||||
var dataPath = $"{localPath}/{route.Id}";
|
||||
Helper.CreateDirectoryIfNotExsit(dataPath);
|
||||
Helper.CreateDirectoryIfNotExsit(dataPath);
|
||||
File.WriteAllBytes($"{dataPath}/{route.Id}.json", res1.downloadHandler.data);
|
||||
File.WriteAllBytes($"{dataPath}/route-{route.Id}.json", res2.downloadHandler.data);
|
||||
File.WriteAllBytes($"{path}/{route.FileName}", res3.downloadHandler.data);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user