AR继续骑和断线重连继续骑

This commit is contained in:
lishuo 2022-12-08 19:17:34 +08:00
parent ae58f4d461
commit 9e2e778e12
34 changed files with 3828 additions and 497977 deletions

View File

@ -7,7 +7,9 @@ namespace Assets.AR
{
public Vector3 Lean { get; set; }//偏移量
public int StartPosition;
public int StartPosition { get; set; }
public int StartRouteDistance { get; set; }
public bool IsAtFinish { get; set; }//是否到达终点
@ -23,6 +25,8 @@ namespace Assets.AR
public float Speed { get; set; }//速度
public float PreSpeed { get; set; }//速度
public float Curvature { get; set; }//转向
public float LaneChangingDirection { get; set; }//方向
@ -33,8 +37,7 @@ namespace Assets.AR
public float FrameIndexDistanceCorrection { get; set; }//位置纠正
public double TestPower = 500;
public int TestPower { get; set; }
//重置碰撞检测参数
public void ResetCollisionDetectionParameters()

View File

@ -62,7 +62,7 @@ namespace Assets.AR
}
public float DeltaDistance { get; set; }
public float PreDistance { get; set; }
public float NextDistance { get; set; }
public float Distance
{

View File

@ -6,6 +6,10 @@ using UnityEngine.UI;
using RenderHeads.Media.AVProVideo;
using Assets.Scripts.Scenes.VideoRide;
using Assets.Core;
using Assets.Scenes.Ride.Scripts.Model;
using Assets.Scenes.Ride.Scripts.Model.RiderModels;
using DG.Tweening;
using System.Collections;
namespace Assets.AR
{
@ -15,20 +19,34 @@ namespace Assets.AR
private ARData aRData;
private RouteDetailData detail;
private VideoPointsSync videoPointsSync;
private int index = 1;
private readonly List<ARLaneObject> collisionList = new List<ARLaneObject>();
VideoPlayerControl VideoPlayerControl;
ARLaneObject[] rides;
public ARLaneObject mainObject { get; set; }
ARLaneObject[] rides { get; set; }
public ARLaneObject mainRiderObject { get; set; }
private Light arLight;
private Light arBackLight;
public RiderCameraDistance RiderCameraDistance { get; set; }
public VideoControlMode VideoControlMode { get; private set; }
private float autoCameraSwitchTimeCounter = 80f;
float timers = 1f;
double weight = 70;
double bikeWeight = 20;
float timers = 0f;
private VideoGameManager manager;
public int VisibleModels { get; private set; }
private int visibleModelsLimit = 20;
public int VisibleModelsLimit
{
get => this.visibleModelsLimit;
set => this.visibleModelsLimit = Mathf.Clamp(value, 20, 100);
}
private Dictionary<int, VisibleRiderItem> visibleRiders = new Dictionary<int, VisibleRiderItem>();
private Dictionary<int, OnlineRiderModel> riders = new Dictionary<int, OnlineRiderModel>();
//private Dictionary<int, UIRect> riderNameViews { get; set; } //= new Dictionary<int, UIRect>();
//private Dictionary<int, RiderValueView> riderValueViews = new Dictionary<int, RiderValueView>();
public GameObject BikerFemalePrefab => Resources.Load<GameObject>("UI/Prefab/AR/VidePlayer");
public GameObject BikerMalePrefab => Resources.Load<GameObject>("UI/Prefab/AR/VidePlayer_NV");
private bool paused { get; set; }
protected override void Start()
{
@ -40,22 +58,17 @@ namespace Assets.AR
public void Initialize(ARData arData, RouteDetailData routeDetailData)
{
//ar数据加载本地本地没有就下载
//var txt = Resources.Load<TextAsset>("UI/93824").text;
//var route = Resources.Load<TextAsset>("UI/route-93824").text;
this.aRData = arData; //Newtonsoft.Json.JsonConvert.DeserializeObject<ARData>(txt);
this.detail = routeDetailData;//Newtonsoft.Json.JsonConvert.DeserializeObject<RouteDetailData>(route);
this.aRData = arData;
this.detail = routeDetailData;
videoPointsSync = new VideoPointsSync(detail.VideoPoints.Select(c => new VideoPoint()
{
Distance = (float)c.Distance,
Time = (float)c.VideoTime
}));
videoSync = videoPointsSync;
this.VideoPlayerControl = new VideoPlayerControl();
this.VideoPlayerControl.VideoSyncSource = videoSync;
this.videoPlayer = new AVProVideoPlayer();
this.videoPlayer.videoPlayer = mediaPlayer;
SetArRoute(new ARRoute(aRData.Route), videoSync, videoPlayer);
@ -72,13 +85,20 @@ namespace Assets.AR
return;
timers -= Time.deltaTime;
while (timers < 0)
while (timers <= 0)
{
//this.riderObjects.Clear();
foreach (var dic in manager.rideObjs)
{
var item = dic.Value;
item.Speed = (float)(dic.Key.Speed/3.6d);
item.DeltaDistance = item.Speed;
if (dic.Key.UserId == App.CurrentUser.Id)
{
mainRiderObject = item;
}
item.PreSpeed = item.Speed;
item.Speed = (float)dic.Key.OnlineSpeed;
item.DeltaDistance = (float)(dic.Key.EndDistance - dic.Key.PreDistance);
item.Route = Route;
item.VideoSync = videoPointsSync;
if(!this.arObjects.Contains(item))
@ -86,47 +106,27 @@ namespace Assets.AR
if (!this.riderObjects.ContainsKey(item.GetInstanceID()))
this.riderObjects.Add(item.GetInstanceID(), item);
}
if (mainObject != null)
{
mainObject.Speed = (float)(manager.CurrentPlayer.Speed / 3.6d);
mainObject.DeltaDistance = mainObject.Speed;
if (!this.riderObjects.ContainsKey(mainObject.GetInstanceID()))
this.riderObjects.Add(mainObject.GetInstanceID(), mainObject);
}
timers += 1f;
}
if (mainObject == null)
if (mainRiderObject == null)
return;
var delta = Time.deltaTime;
foreach (var obj in this.riderObjects.Values)
{
mainObject = manager.CurrentPlayer.gameObject.GetComponent<RiderRenderer>();
this.arObjects.Add(mainObject);
mainObject.Speed = (float)(manager.CurrentPlayer.Speed / 3.6d);
mainObject.DeltaDistance = mainObject.Speed;
mainObject.Route = Route;
mainObject.VideoSync = videoPointsSync;
if (!this.riderObjects.ContainsKey(mainObject.GetInstanceID()))
this.riderObjects.Add(mainObject.GetInstanceID(), mainObject);
}
foreach (var item in this.riderObjects.Values)
{
item.Distance += item.DeltaDistance * Time.deltaTime;
item.RouteDistance += item.DeltaDistance * Time.deltaTime;
if (item.Distance >= Route.GetTotalDistance())
var offset = obj.DeltaDistance * delta;
obj.Distance += offset;
obj.RouteDistance += offset;
if (obj.Distance >= Route.GetTotalDistance())
{
item.IsAtFinish = true;
obj.IsAtFinish = true;
}
}
this.FrameIndexDistanceCorrection = this.VideoPlayerControl.FrameIndexDistanceCorrection;
//mainObject = manager.CurrentPlayer;
//this.FollowedRiderId = mainObject.Id;
this.UpdateCameraFollowDistance();
VideoPlayerControl.UpdateVideoPlaybackSpeed(mainObject.Speed, mainObject.distance);
VideoPlayerControl.UpdateVideoPlaybackSpeed(mainRiderObject.PreSpeed, mainRiderObject.Distance);
base.Update();
this.UpdateRidersVisibility();
this.UpdateRidersLean();
@ -194,7 +194,7 @@ namespace Assets.AR
protected override bool IsArObjectActive(ARObject arObject)
{
bool flag = base.IsArObjectActive(arObject);
if ((UnityEngine.Object)arObject != (UnityEngine.Object)this.mainObject)
if ((UnityEngine.Object)arObject != (UnityEngine.Object)this.mainRiderObject)
return flag;
if ((double)this.VideoPlayerControl.CameraFollowDistance > 0.0 || this.AR360Version)
return flag;
@ -208,7 +208,7 @@ namespace Assets.AR
case RiderCameraDistance.FirstPerson:
return 0.0f;
case RiderCameraDistance.Near:
return 3f;
return 1.5f;
case RiderCameraDistance.Middle:
return 5f;
case RiderCameraDistance.Far:
@ -217,59 +217,430 @@ namespace Assets.AR
throw new ArgumentException("Unknown rider's camera distance.");
}
}
//添加骑手
public void AddRider(OnlineRiderModel rider)
{
if (this.riders.ContainsKey(rider.UserId))
return;
this.riders.Add(rider.UserId, rider);
}
//移除骑手
public void RemoveRider(int riderId)
{
if (!this.riders.ContainsKey(riderId))
return;
this.riders.Remove(riderId);
this.DestroyRider(riderId);
this.DestroyRiderTitle(riderId);
}
//创建人物
private BaseRenderer CreateRiderModel(OnlineRiderModel rider, float lane)
{
GameObject gameObject;
RiderRenderer riderModel;
if (rider.Sex == 1)
{
gameObject = UnityEngine.Object.Instantiate<GameObject>(this.BikerMalePrefab);
gameObject.name = "RiderMale " + rider.UserId.ToString();
riderModel = gameObject.AddComponent<RiderRenderer>();
riderModel.Initialize(true, false);
}
else
{
gameObject = UnityEngine.Object.Instantiate<GameObject>(this.BikerFemalePrefab);
gameObject.name = "RiderFemale " + rider.UserId.ToString();
riderModel = gameObject.AddComponent<RiderRenderer>();
riderModel.Initialize(false, false);
}
gameObject.transform.parent = this.transform;
gameObject.transform.position = ARObjectsController.DefaultObjectPosition;
gameObject.layer = 9;
riderModel.Route = this.Route;
riderModel.VideoSync = this.videoSync;
//riderModel.VideoPlayer = this.videoPlayer;
//riderModel.ColorUser = rider.UserColor;
//riderModel.ColorSkin = rider.SkinColor;
// ModelTexturesList modelTextures = this.GetModelTextures(rider.JerseyId);
//riderModel.JerseyTexture = modelTextures.JerseyTexture;
//riderModel.HelmTexture = modelTextures.HelmTexture;
//riderModel.BikeTexture = modelTextures.BikeTexture;
if ((double)lane != -1.0)
riderModel.Lane = lane;
this.riderObjects.Add(rider.UserId, (ARLaneObject)riderModel);
this.arObjects.Add((ARObject)riderModel);
//是否
if (this.IsMainRider(rider))
this.mainRiderObject = (ARLaneObject)riderModel;
return (BaseRenderer)riderModel;
}
private ARLaneObject CreateRiderObject(OnlineRiderModel rider, float lane)
{
ARLaneObject riderObject = new GameObject("RiderObject " + rider.UserId.ToString())
{
transform = {
parent = this.transform
},
layer = 9
}.AddComponent<ARLaneObject>();
riderObject.Route = this.Route;
riderObject.VideoSync = this.videoSync;
//riderObject.VideoPlayer = this.videoPlayer;
if ((double)lane != -1.0)
riderObject.Lane = lane;
this.riderObjects.Add(rider.UserId, riderObject);
this.arObjects.Add((ARObject)riderObject);
if (this.IsMainRider(rider))
this.mainRiderObject = riderObject;
return riderObject;
}
//销毁骑手
private void DestroyRider(int riderId)
{
ARLaneObject arLaneObject;
if (!this.riderObjects.TryGetValue(riderId, out arLaneObject))
return;
this.arObjects.Remove((ARObject)arLaneObject);
this.riderObjects.Remove(riderId);
if ((UnityEngine.Object)arLaneObject == (UnityEngine.Object)this.mainRiderObject)
this.mainRiderObject = (ARLaneObject)null;
UnityEngine.Object.Destroy((UnityEngine.Object)arLaneObject.gameObject);
}
//创建骑行人员头顶的名字
private void CreateRiderTitle(OnlineRiderModel rider)
{
//RiderNameView riderNameView = UIRect.Create<RiderNameView>(this.transform, "Name " + rider.Id.ToString());
//riderNameView.RectTransform.pivot = new Vector2(0.5f, 0.5f);
//riderNameView.gameObject.layer = 9;
//riderNameView.NameLabel.Font = Fonts.WorkSansBlack;
//riderNameView.SetName(rider.NameShort);
//switch (rider)
//{
// case GhostRider _:
// riderNameView.SetAvatarResourceIcon(AvatarView.IconType.Ghost);
// riderNameView.SetAvatarBorderColor(rider.UserColor);
// riderNameView.SetAvatarBorderWidth(2f);
// break;
// case StravaRider stravaRider:
// switch (stravaRider.EffortType)
// {
// case EffortType.Kom:
// riderNameView.SetAvatarResourceIcon(AvatarView.IconType.StravaKom);
// break;
// case EffortType.Qom:
// riderNameView.SetAvatarResourceIcon(AvatarView.IconType.StravaQom);
// break;
// case EffortType.Pr:
// riderNameView.SetAvatarResourceIcon(AvatarView.IconType.StravaPr);
// break;
// }
// riderNameView.SetAvatarBorderColor(Color.clear);
// riderNameView.SetAvatarBorderWidth(0.0f);
// break;
// default:
// riderNameView.SetAvatarUrl(rider.AvatarUrl);
// riderNameView.SetAvatarBorderColor(rider.UserColor);
// riderNameView.SetAvatarBorderWidth(2f);
// break;
//}
//riderNameView.BackgroundColor = this.GetRiderTitleBackgroundColor(rider);
//riderNameView.SetCornerRadius(float.MaxValue);
//riderNameView.TrimSize();
//this.riderNameViews.Add(rider.Id, (UIRect)riderNameView);
//if (rider is StravaRider)
// return;
//RiderValueView riderValueView = UIRect.Create<RiderValueView>(this.transform, "Value " + rider.Id.ToString());
//riderValueView.RectTransform.pivot = new Vector2(0.5f, 0.5f);
//riderValueView.gameObject.layer = 9;
//this.riderValueViews.Add(rider.Id, riderValueView);
}
private void CreateRiderTitleObject(OnlineRiderModel rider)
{
//UIRect uiRect = UIRect.Create<UIRect>(this.transform, "TitleObject " + rider.Id.ToString());
//uiRect.Size = new Vector2(150f, 26f);
//uiRect.RectTransform.pivot = new Vector2(0.5f, 0.5f);
//uiRect.gameObject.layer = 9;
//uiRect.AddComponent<Canvas>().renderMode = RenderMode.WorldSpace;
//uiRect.AddComponent<BoxCollider>().size = (Vector3)uiRect.Size;
//this.riderNameViews.Add(rider.Id, uiRect);
}
private void DestroyRiderTitle(int riderId)
{
//UIRect uiRect;
//if (this.riderNameViews.TryGetValue(riderId, out uiRect))
//{
// this.riderNameViews.Remove(riderId);
// UnityEngine.Object.Destroy((UnityEngine.Object)uiRect.gameObject);
//}
//RiderValueView riderValueView;
//if (!this.riderValueViews.TryGetValue(riderId, out riderValueView))
// return;
//this.riderValueViews.Remove(riderId);
//UnityEngine.Object.Destroy((UnityEngine.Object)riderValueView.gameObject);
}
private void UpdateRidersVisibility()
{
//if (!this.videoPlayer.Initialized)
// return;
//this.UpdateVisibleRiders();
////删除当前道路上应该消失的骑手
//foreach (int num in this.riderObjects.Keys.ToArray<int>())
//{
// if (!this.visibleRiders.ContainsKey(num))
// {
// ARLaneObject riderObject = this.riderObjects[num];
// if (!riderObject.IsAtFinish || (double)riderObject.VisibilityLevel <= 0.0)
// {
// this.DestroyRider(num);
// this.DestroyRiderTitle(num);
// }
// }
//}
////新增应该显示的骑手
//foreach (TrainingARController.VisibleRiderItem visibleRiderItem in this.visibleRiders.Values)
//{
// IRouteRider rider = visibleRiderItem.Rider;
// bool showModel = visibleRiderItem.ShowModel;
// ARLaneObject arLaneObject;
// //二次检查
// if (this.riderObjects.TryGetValue(rider.Id, out arLaneObject))
// {
// if (arLaneObject is BaseRenderer)
// {
// if (!showModel)
// {
// float lane = arLaneObject.Lane;
// this.DestroyRider(rider.Id);
// this.CreateRiderObject(rider, lane);
// }
// }
// else if (showModel)
// {
// float lane = arLaneObject.Lane;
// this.DestroyRider(rider.Id);
// this.CreateRiderModel(rider, lane);
// }
// }
// else
// {
// if (showModel)
// this.CreateRiderModel(rider, visibleRiderItem.Lane);
// else
// this.CreateRiderObject(rider, visibleRiderItem.Lane);
// this.CreateRiderTitleObject(rider);
// }
//}
if (!this.videoPlayer.Initialized)
return;
this.UpdateVisibleRiders();
return;
//删除当前道路上应该消失的骑手
foreach (int num in this.riderObjects.Keys.ToArray<int>())
{
if (!this.visibleRiders.ContainsKey(num))
{
ARLaneObject riderObject = this.riderObjects[num];
if (!riderObject.IsAtFinish || (double)riderObject.VisibilityLevel <= 0.0)
{
this.DestroyRider(num);
this.DestroyRiderTitle(num);
}
}
}
//新增应该显示的骑手
foreach (VisibleRiderItem visibleRiderItem in this.visibleRiders.Values)
{
var rider = visibleRiderItem.Rider;
bool showModel = visibleRiderItem.ShowModel;
ARLaneObject arLaneObject;
//二次检查
if (this.riderObjects.TryGetValue(rider.UserId, out arLaneObject))
{
if (arLaneObject is BaseRenderer)
{
if (!showModel)
{
float lane = arLaneObject.Lane;
this.DestroyRider(rider.UserId);
this.CreateRiderObject(rider, lane);
}
}
else if (showModel)
{
float lane = arLaneObject.Lane;
this.DestroyRider(rider.UserId);
this.CreateRiderModel(rider, lane);
}
}
else
{
if (showModel)
this.CreateRiderModel(rider, visibleRiderItem.Lane);
else
this.CreateRiderObject(rider, visibleRiderItem.Lane);
this.CreateRiderTitleObject(rider);
}
}
}
public int VisibleRiderTitlesLimit => this.VisibleModelsLimit + 10;
private void UpdateVisibleRiders()
{
float visibilityModels = ARObject.MaxDistanceVisibilityModels;
float visibilityDistance = this.MaximumVisibilityDistance;
float routeDistance = this.CameraDistance;
bool flag = this.AllowStartOrder && (double)routeDistance < 200.0;
float num1 = flag ? visibilityModels : visibilityDistance;
float a1 = this.videoPlayer.IsRear ? visibilityDistance : 1f;
int riderTitlesLimit = this.VisibleRiderTitlesLimit;
int a2 = 5;
//if (this.SelectedPanorama != null && this.RouteVideo.Rider != null)
//{
// routeDistance = this.GetModelRouteDistance(this.RouteVideo.Rider.Id, (float)this.RouteVideo.Rider.LapDistance);
// a1 = flag ? visibilityModels : visibilityDistance;
// a2 = riderTitlesLimit / 2;
//}
float num2 = Mathf.Max(a1, this.GetOvertakingThreshold(routeDistance) + 1f);
float distance1 = routeDistance - num2;
float distance2 = routeDistance + num1;
float num3;
if (flag)
{
num3 = this.StartRegionRouteWidth;
}
else
{
float videoFrameAtDistance1 = this.videoSync.GetVideoFrameAtDistance(distance1);
float videoFrameAtDistance2 = this.videoSync.GetVideoFrameAtDistance(distance2);
num3 = (float)(0.5 * ((double)(this.Route.GetLeftSideOffset(videoFrameAtDistance1) + this.Route.GetRightSideOffset(videoFrameAtDistance1)) + (double)(this.Route.GetLeftSideOffset(videoFrameAtDistance2) + this.Route.GetRightSideOffset(videoFrameAtDistance2))));
}
float num4 = num3 / 0.7f;
float num5 = this.paused ? 0.0f : 0.5f;
float maxLane = Math.Max(0.0f, num4 - num5);
List<VisibleRiderItem> visibleRiderItemList1 = new List<VisibleRiderItem>();
List<VisibleRiderItem> visibleRiderItemList2 = new List<VisibleRiderItem>();
//if (this.SelectedPanorama == null || this.RouteVideo.Rider == null || this.RouteVideo.Rider.Id != this.panoramaRidersPivotId)
//{
// this.panoramaRiders = (List<IRouteRider>)null;
// this.panoramaRidersPivotId = -1;
//}
//if (this.panoramaRidersPivotId != -1 && this.riderObjects.ContainsKey(this.panoramaRidersPivotId) && ((!(this.riderObjects[this.panoramaRidersPivotId] is BaseRenderer riderObject) ? 0 : (riderObject.Paused ? 1 : 0)) != 0 || this.riders[this.panoramaRidersPivotId].Speed == 0.0))
//{
// this.panoramaRiders = (List<IRouteRider>)null;
// this.panoramaRidersPivotId = -1;
//}
var routeRiders = this.riders.Values;
//if (this.SelectedPanorama != null && this.panoramaRiders != null)
// routeRiders = (IEnumerable<IRouteRider>)this.panoramaRiders;
foreach (var rider in routeRiders)
{
if (!rider.IsFinished)
{
float modelRouteDistance = this.GetModelRouteDistance(0, (float)rider.RouteDistance);
float num6 = modelRouteDistance - routeDistance;
if (this.IsMultilap)
{
if ((double)modelRouteDistance + this.lapLength >= (double)distance1 && (double)modelRouteDistance + this.lapLength <= (double)distance2)
num6 = modelRouteDistance + (float)this.lapLength - routeDistance;
else if ((double)modelRouteDistance - this.lapLength >= (double)distance1 && (double)modelRouteDistance - this.lapLength <= (double)distance2)
num6 = modelRouteDistance - (float)this.lapLength - routeDistance;
}
if ((double)num6 > -(double)num2 && (double)num6 < (double)num1)
{
float num7 = -1f;
ARLaneObject laneObject;
if (this.riderObjects.TryGetValue(rider.UserId, out laneObject))
{
if ((double)laneObject.Lane > (double)num4)
{
if (this.IsMainRider(rider))
{
laneObject.Lane = num4;
laneObject.DeltaLane = 0.0f;
this.UpdateRiderCurvature(laneObject, 0.0f, Time.deltaTime);
this.UpdateLaneChangingDirection(laneObject, 0.0f, Time.deltaTime);
}
else
continue;
}
}
else
{
num7 = this.GetLane((float)rider.RouteDistance, modelRouteDistance);
if ((double)num7 > (double)maxLane)
{
if (this.IsMainRider(rider))
num7 = num4;
else
continue;
}
}
VisibleRiderItem visibleRiderItem = new VisibleRiderItem()
{
Rider = rider,
DeltaDistance = num6,
ModelDistance = modelRouteDistance,
Lane = num7
};
if ((double)num6 < 0.0)
visibleRiderItemList1.Add(visibleRiderItem);
else
visibleRiderItemList2.Add(visibleRiderItem);
}
}
}
visibleRiderItemList1.Sort((Comparison<VisibleRiderItem>)((p1, p2) => p2.DeltaDistance.CompareTo(p1.DeltaDistance)));
visibleRiderItemList2.Sort((Comparison<VisibleRiderItem>)((p1, p2) => p1.DeltaDistance.CompareTo(p2.DeltaDistance)));
this.RemoveRidersOutside(visibleRiderItemList1, maxLane);
this.RemoveRidersOutside(visibleRiderItemList2, maxLane);
//if (this.GroupLeaderUserId > 0)
//{
// this.PrioritizeRider(visibleRiderItemList1, (Predicate<VisibleRiderItem>)(i => this.IsGroupLeader(i.Rider)));
// this.PrioritizeRider(visibleRiderItemList2, (Predicate<VisibleRiderItem>)(i => this.IsGroupLeader(i.Rider)));
//}
this.PrioritizeRider(visibleRiderItemList1, (Predicate<VisibleRiderItem>)(i => this.IsMainRider(i.Rider)));
this.PrioritizeRider(visibleRiderItemList2, (Predicate<VisibleRiderItem>)(i => this.IsMainRider(i.Rider)));
List<VisibleRiderItem> visibleRiderItemList3 = new List<VisibleRiderItem>();
if (!this.videoPlayer.IsRear)
{
int num8 = Mathf.Min(a2, visibleRiderItemList1.Count);
for (int index = 0; index < num8; ++index)
visibleRiderItemList3.Add(visibleRiderItemList1[index]);
int num9 = Mathf.Min(riderTitlesLimit - num8, visibleRiderItemList2.Count);
for (int index = 0; index < num9; ++index)
visibleRiderItemList3.Add(visibleRiderItemList2[index]);
}
else
{
int num10 = Mathf.Min(a2, visibleRiderItemList2.Count);
for (int index = 0; index < num10; ++index)
visibleRiderItemList3.Add(visibleRiderItemList2[index]);
int num11 = Mathf.Min(riderTitlesLimit - num10, visibleRiderItemList1.Count);
for (int index = 0; index < num11; ++index)
visibleRiderItemList3.Add(visibleRiderItemList1[index]);
}
int num12 = 0;
this.visibleRiders.Clear();
foreach (VisibleRiderItem visibleRiderItem in visibleRiderItemList3)
{
var rider = visibleRiderItem.Rider;
float num13 = Mathf.Abs(visibleRiderItem.DeltaDistance);
if ((double)num13 < (double)visibilityModels - 5.0)
{
if (num12 < this.VisibleModelsLimit)
{
visibleRiderItem.ShowModel = true;
this.visibleRiders.Add(rider.UserId, visibleRiderItem);
++num12;
}
}
else if ((double)num13 < (double)visibilityDistance - 5.0 && this.visibleRiders.Count < this.VisibleRiderTitlesLimit)
{
visibleRiderItem.ShowModel = false;
this.visibleRiders.Add(rider.UserId, visibleRiderItem);
}
}
this.VisibleModels = num12;
//if (this.SelectedPanorama == null || this.RouteVideo.Rider == null || this.panoramaRiders != null)
// return;
//this.panoramaRiders = new List<IRouteRider>();
//foreach (VisibleRiderItem visibleRiderItem in this.visibleRiders.Values)
// this.panoramaRiders.Add(visibleRiderItem.Rider);
//this.panoramaRidersPivotId = this.RouteVideo.Rider.Id;
}
private void PrioritizeRider(
List<VisibleRiderItem> list,
Predicate<VisibleRiderItem> predicate)
{
int index = list.FindIndex(predicate);
if (index == -1)
return;
VisibleRiderItem visibleRiderItem = list[index];
list.RemoveAt(index);
list.Insert(0, visibleRiderItem);
}
private void RemoveRidersOutside(
List<VisibleRiderItem> sortedList,
float maxLane)
{
VisibleRiderItem visibleRiderItem = (VisibleRiderItem)null;
foreach (VisibleRiderItem sorted in sortedList)
{
//排除当前骑行的主人公和分区组长
if ((double)sorted.Lane != -1.0 && !this.IsMainRider(sorted.Rider))
{
if (visibleRiderItem == null)
{
visibleRiderItem = sorted;
}
else
{
float routeDistance1 = (float)visibleRiderItem.Rider.RouteDistance;
float routeDistance2 = (float)sorted.Rider.RouteDistance;
float collisionParameter = ARLaneObjectsController.GetCollisionParameter(routeDistance1, routeDistance2, this.GetOvertakingThreshold(routeDistance1));
sorted.Lane += collisionParameter;
if ((double)sorted.Lane > (double)maxLane)
sorted.Lane = float.MaxValue;
else
visibleRiderItem = sorted;
}
}
}
sortedList.RemoveAll((Predicate<VisibleRiderItem>)(i => (double)i.Lane == 3.4028234663852886E+38));
}
private bool IsMainRider(OnlineRiderModel rider) => rider.IsSelf;
//更新骑手的偏移角度
private void UpdateRidersLean()
{
@ -341,19 +712,19 @@ namespace Assets.AR
// float t = this.GetValueViewAlpha(num1);
// if ((double)t < 1.0 && (UnityEngine.Object)riderValueView != (UnityEngine.Object)null)
// riderValueView.Alpha = t;
// if (this.sportProfile == SportProfile.Running)
// {
// if ((UnityEngine.Object)riderValueView != (UnityEngine.Object)null)
// riderValueView.Active = false;
// t = 0.0f;
// }
// //if (this.sportProfile == SportProfile.Running)
// //{
// // if ((UnityEngine.Object)riderValueView != (UnityEngine.Object)null)
// // riderValueView.Active = false;
// // t = 0.0f;
// //}
// Vector3 vector3 = 5f * this.uiScale * Mathf.Max(0.1f, this.SelectedPanorama != null ? 1f : this.GetDistanceScale(num1));
// Quaternion rotation = this.UnityCamera.transform.rotation;
// if (this.SelectedPanorama != null)
// {
// rotation = this.PanoramaCamera.transform.rotation;
// }
// else
// //if (this.SelectedPanorama != null)
// //{
// // rotation = this.PanoramaCamera.transform.rotation;
// //}
// //else
// {
// if ((double)riderObject.Distance < (double)this.CameraDistance)
// rotation *= Quaternion.Euler(0.0f, 180f, 0.0f);
@ -377,5 +748,15 @@ namespace Assets.AR
// }
//}
}
private class VisibleRiderItem
{
public OnlineRiderModel Rider;
public float ModelDistance;
public float DeltaDistance;
public bool ShowModel;
public float Lane;
}
}
}

View File

@ -44,8 +44,6 @@ namespace Assets.AR
protected virtual void Start()
{
this.SetupModels();
this.SetLayerRecursively(this.gameObject, 9);
this.animator.avatar = (Avatar)null;
}
@ -54,9 +52,6 @@ namespace Assets.AR
base.Update();
}
protected abstract void SetupModels();
protected virtual void OnPause(bool paused)
{
}

View File

@ -92,16 +92,15 @@ namespace Assets.AR
protected override void Start()
{
base.Start();
this.PlanNextLook();
}
protected override void Update()
{
if (this.route == null)
return;
this.UpdateDiffciulityLevel();
base.Update();
float num = this.Speed;
this.Paused = this.Speed == 0;
bool flag = this.Paused;
if (this.IsAtFinish)
{
@ -175,42 +174,5 @@ namespace Assets.AR
//this.wheelFront.transform.Rotate(Vector3.right, angle);
//this.wheelRear.transform.Rotate(Vector3.right, angle);
}
//设置模型
protected override void SetupModels()
{
}
private void PlanNextLook()
{
}
//更新水平
private void UpdateDiffciulityLevel()
{
float num = this.PowerWinSum / 10f;
if ((double)Math.Abs(Time.time - this.lastPowerWinWrite) >= 1.0)
{
++this.lastPowerWinIndex;
this.lastPowerWinIndex %= 10;
this.PowerWinSum -= this.powerWindow[this.lastPowerWinIndex];
this.powerWindow[this.lastPowerWinIndex] = this.Power;
this.PowerWinSum += this.Power;
this.lastPowerWinWrite = Time.time;
num = this.PowerWinSum / 10f;
if ((double)this.Power > (double)num * 1.2000000476837158 && (double)this.Power / (double)this.Weight > 2.0)
++this.powerPeakSum;
else
this.powerPeakSum = 0;
}
if ((double)this.Power / (double)this.Weight > 8.0 || this.powerPeakSum > 2 || (double)this.Power > (double)num * 3.0 && (double)this.Power / (double)this.Weight > 2.0)
this.lastPowerPeak = Time.time;
if ((double)Math.Abs(Time.time - this.lastPowerPeak) < 2.0)
this.DifficultyLevel = 2;
else if ((double)this.Power / (double)this.Weight > 2.0)
this.DifficultyLevel = 1;
else
this.DifficultyLevel = 0;
}
}
}

View File

@ -3,21 +3,9 @@
public interface IRider
{
int UserId { get;}
string UserName { get; }
double Weight { get;}
double BicycleWeight { get;}
double Speed { get;}
double Power { get; }
double Elevation { get; }
double Cadance { get; }
double Wkg { get; }
int? HeartRate { get; }
double TotalDistance { get; }
double CurrentSlope { get; }
double CurrentSlopeDistance { get; }
double NextSlope { get; }
double NextSlopeDistance { get; }
double Distance { get; }
double TotalClimb { get; }
double StartDistance { get; set; }
double OnlineSpeed { get; set; }
double PreDistance { get; set; }
double EndDistance { get; set; }
}
}

File diff suppressed because one or more lines are too long

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 341c9bc6edccecd498b3d3b74b08f3b9
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because one or more lines are too long

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: f2e696010ab476541b5d4458dbc3b21e
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because one or more lines are too long

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 329bdb26604fbd6499707e6457df4921
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 874a748024ffda74a841855f69348615
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because one or more lines are too long

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 5a1f568492ae0ed498af496a6a4fb796
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because one or more lines are too long

View File

@ -1,7 +0,0 @@
fileFormatVersion: 2
guid: 8553de40c8498114ebee6f2d9d3e8641
TextScriptImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -661,92 +661,6 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 313551262}
m_CullTransparentMesh: 0
--- !u!21 &413758122
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: RoundedCornersTextureMaterial(Clone)
m_Shader: {fileID: 4800000, guid: 0bd2ec5d73751e34a814274a454bec41, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _ColorMask: 15
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Height: 50
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _Radius: 15
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _UVSec: 0
- _UseUIAlphaClip: 0
- _Width: 50
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _WidthHeightRadius: {r: 446, g: 70, b: 70, a: 0}
--- !u!1 &684809389
GameObject:
m_ObjectHideFlags: 0
@ -992,7 +906,7 @@ Camera:
m_Depth: -1
m_CullingMask:
serializedVersion: 2
m_Bits: 4294967295
m_Bits: 1
m_RenderingPath: -1
m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0
@ -1537,92 +1451,6 @@ Transform:
m_Father: {fileID: 0}
m_RootOrder: 6
m_LocalEulerAnglesHint: {x: 0, y: -3.896, z: 0}
--- !u!21 &1038216837
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: RoundedCornersTextureMaterial(Clone)
m_Shader: {fileID: 4800000, guid: 0bd2ec5d73751e34a814274a454bec41, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _ColorMask: 15
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Height: 50
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _Radius: 15
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _UVSec: 0
- _UseUIAlphaClip: 0
- _Width: 50
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _WidthHeightRadius: {r: 50, g: 50, b: 50, a: 0}
--- !u!1 &1378474435
GameObject:
m_ObjectHideFlags: 0
@ -1925,6 +1753,92 @@ RectTransform:
type: 3}
m_PrefabInstance: {fileID: 1426339558}
m_PrefabAsset: {fileID: 0}
--- !u!21 &1443577897
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: RoundedCornersTextureMaterial(Clone)
m_Shader: {fileID: 4800000, guid: 0bd2ec5d73751e34a814274a454bec41, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _ColorMask: 15
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Height: 50
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _Radius: 15
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _UVSec: 0
- _UseUIAlphaClip: 0
- _Width: 50
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _WidthHeightRadius: {r: 446, g: 70, b: 70, a: 0}
--- !u!1 &1565405865 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 3342506722007875022, guid: 10e54cf0bec9cbc4b94d1d40e437f87c,
@ -2107,6 +2021,92 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1726804851}
m_CullTransparentMesh: 0
--- !u!21 &1888707701
Material:
serializedVersion: 6
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: RoundedCornersTextureMaterial(Clone)
m_Shader: {fileID: 4800000, guid: 0bd2ec5d73751e34a814274a454bec41, type: 3}
m_ShaderKeywords:
m_LightmapFlags: 4
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 0
m_CustomRenderQueue: -1
stringTagMap: {}
disabledShaderPasses: []
m_SavedProperties:
serializedVersion: 3
m_TexEnvs:
- _BumpMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailAlbedoMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailMask:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _DetailNormalMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _EmissionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MainTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _MetallicGlossMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _OcclusionMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _ParallaxMap:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
m_Floats:
- _BumpScale: 1
- _ColorMask: 15
- _Cutoff: 0.5
- _DetailNormalMapScale: 1
- _DstBlend: 0
- _GlossMapScale: 1
- _Glossiness: 0.5
- _GlossyReflections: 1
- _Height: 50
- _Metallic: 0
- _Mode: 0
- _OcclusionStrength: 1
- _Parallax: 0.02
- _Radius: 15
- _SmoothnessTextureChannel: 0
- _SpecularHighlights: 1
- _SrcBlend: 1
- _Stencil: 0
- _StencilComp: 8
- _StencilOp: 0
- _StencilReadMask: 255
- _StencilWriteMask: 255
- _UVSec: 0
- _UseUIAlphaClip: 0
- _Width: 50
- _ZWrite: 1
m_Colors:
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _WidthHeightRadius: {r: 50, g: 50, b: 50, a: 0}
--- !u!1 &1899149616
GameObject:
m_ObjectHideFlags: 0

File diff suppressed because it is too large Load Diff

View File

@ -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)
{
}
}
}
}

View File

@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 13f9e4cb9b08f5f4facbb08cd5eb9d65
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@ -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;
}
}
}

View File

@ -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()

View File

@ -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; }
}
}

View File

@ -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;
}
}
}

View File

@ -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;
}
}
}

View File

@ -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;

View File

@ -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);
});
}

View File

@ -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;
}
}
}

View File

@ -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);

View File

@ -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);
}
}
}

View File

@ -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)

View File

@ -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);
}
}