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

View File

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

View File

@ -6,6 +6,10 @@ using UnityEngine.UI;
using RenderHeads.Media.AVProVideo; using RenderHeads.Media.AVProVideo;
using Assets.Scripts.Scenes.VideoRide; using Assets.Scripts.Scenes.VideoRide;
using Assets.Core; 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 namespace Assets.AR
{ {
@ -15,20 +19,34 @@ namespace Assets.AR
private ARData aRData; private ARData aRData;
private RouteDetailData detail; private RouteDetailData detail;
private VideoPointsSync videoPointsSync; private VideoPointsSync videoPointsSync;
private int index = 1;
private readonly List<ARLaneObject> collisionList = new List<ARLaneObject>(); private readonly List<ARLaneObject> collisionList = new List<ARLaneObject>();
VideoPlayerControl VideoPlayerControl; VideoPlayerControl VideoPlayerControl;
ARLaneObject[] rides; ARLaneObject[] rides { get; set; }
public ARLaneObject mainObject { get; set; } public ARLaneObject mainRiderObject { get; set; }
private Light arLight; private Light arLight;
private Light arBackLight; private Light arBackLight;
public RiderCameraDistance RiderCameraDistance { get; set; } public RiderCameraDistance RiderCameraDistance { get; set; }
public VideoControlMode VideoControlMode { get; private set; } public VideoControlMode VideoControlMode { get; private set; }
private float autoCameraSwitchTimeCounter = 80f; private float autoCameraSwitchTimeCounter = 80f;
float timers = 1f; float timers = 0f;
double weight = 70;
double bikeWeight = 20;
private VideoGameManager manager; 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() protected override void Start()
{ {
@ -40,22 +58,17 @@ namespace Assets.AR
public void Initialize(ARData arData, RouteDetailData routeDetailData) public void Initialize(ARData arData, RouteDetailData routeDetailData)
{ {
//ar数据加载本地本地没有就下载 //ar数据加载本地本地没有就下载
//var txt = Resources.Load<TextAsset>("UI/93824").text; this.aRData = arData;
//var route = Resources.Load<TextAsset>("UI/route-93824").text; this.detail = routeDetailData;
this.aRData = arData; //Newtonsoft.Json.JsonConvert.DeserializeObject<ARData>(txt);
this.detail = routeDetailData;//Newtonsoft.Json.JsonConvert.DeserializeObject<RouteDetailData>(route);
videoPointsSync = new VideoPointsSync(detail.VideoPoints.Select(c => new VideoPoint() videoPointsSync = new VideoPointsSync(detail.VideoPoints.Select(c => new VideoPoint()
{ {
Distance = (float)c.Distance, Distance = (float)c.Distance,
Time = (float)c.VideoTime Time = (float)c.VideoTime
})); }));
videoSync = videoPointsSync; videoSync = videoPointsSync;
this.VideoPlayerControl = new VideoPlayerControl(); this.VideoPlayerControl = new VideoPlayerControl();
this.VideoPlayerControl.VideoSyncSource = videoSync; this.VideoPlayerControl.VideoSyncSource = videoSync;
this.videoPlayer = new AVProVideoPlayer(); this.videoPlayer = new AVProVideoPlayer();
this.videoPlayer.videoPlayer = mediaPlayer; this.videoPlayer.videoPlayer = mediaPlayer;
SetArRoute(new ARRoute(aRData.Route), videoSync, videoPlayer); SetArRoute(new ARRoute(aRData.Route), videoSync, videoPlayer);
@ -72,13 +85,20 @@ namespace Assets.AR
return; return;
timers -= Time.deltaTime; timers -= Time.deltaTime;
while (timers < 0) while (timers <= 0)
{ {
//this.riderObjects.Clear();
foreach (var dic in manager.rideObjs) foreach (var dic in manager.rideObjs)
{ {
var item = dic.Value; var item = dic.Value;
item.Speed = (float)(dic.Key.Speed/3.6d); if (dic.Key.UserId == App.CurrentUser.Id)
item.DeltaDistance = item.Speed; {
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.Route = Route;
item.VideoSync = videoPointsSync; item.VideoSync = videoPointsSync;
if(!this.arObjects.Contains(item)) if(!this.arObjects.Contains(item))
@ -86,47 +106,27 @@ namespace Assets.AR
if (!this.riderObjects.ContainsKey(item.GetInstanceID())) if (!this.riderObjects.ContainsKey(item.GetInstanceID()))
this.riderObjects.Add(item.GetInstanceID(), item); 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; 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>(); var offset = obj.DeltaDistance * delta;
this.arObjects.Add(mainObject); obj.Distance += offset;
mainObject.Speed = (float)(manager.CurrentPlayer.Speed / 3.6d); obj.RouteDistance += offset;
mainObject.DeltaDistance = mainObject.Speed; if (obj.Distance >= Route.GetTotalDistance())
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())
{ {
item.IsAtFinish = true; obj.IsAtFinish = true;
} }
} }
this.FrameIndexDistanceCorrection = this.VideoPlayerControl.FrameIndexDistanceCorrection; this.FrameIndexDistanceCorrection = this.VideoPlayerControl.FrameIndexDistanceCorrection;
//mainObject = manager.CurrentPlayer;
//this.FollowedRiderId = mainObject.Id; //this.FollowedRiderId = mainObject.Id;
this.UpdateCameraFollowDistance(); this.UpdateCameraFollowDistance();
VideoPlayerControl.UpdateVideoPlaybackSpeed(mainObject.Speed, mainObject.distance); VideoPlayerControl.UpdateVideoPlaybackSpeed(mainRiderObject.PreSpeed, mainRiderObject.Distance);
base.Update(); base.Update();
this.UpdateRidersVisibility(); this.UpdateRidersVisibility();
this.UpdateRidersLean(); this.UpdateRidersLean();
@ -194,7 +194,7 @@ namespace Assets.AR
protected override bool IsArObjectActive(ARObject arObject) protected override bool IsArObjectActive(ARObject arObject)
{ {
bool flag = base.IsArObjectActive(arObject); bool flag = base.IsArObjectActive(arObject);
if ((UnityEngine.Object)arObject != (UnityEngine.Object)this.mainObject) if ((UnityEngine.Object)arObject != (UnityEngine.Object)this.mainRiderObject)
return flag; return flag;
if ((double)this.VideoPlayerControl.CameraFollowDistance > 0.0 || this.AR360Version) if ((double)this.VideoPlayerControl.CameraFollowDistance > 0.0 || this.AR360Version)
return flag; return flag;
@ -208,7 +208,7 @@ namespace Assets.AR
case RiderCameraDistance.FirstPerson: case RiderCameraDistance.FirstPerson:
return 0.0f; return 0.0f;
case RiderCameraDistance.Near: case RiderCameraDistance.Near:
return 3f; return 1.5f;
case RiderCameraDistance.Middle: case RiderCameraDistance.Middle:
return 5f; return 5f;
case RiderCameraDistance.Far: case RiderCameraDistance.Far:
@ -217,59 +217,430 @@ namespace Assets.AR
throw new ArgumentException("Unknown rider's camera distance."); 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() private void UpdateRidersVisibility()
{ {
//if (!this.videoPlayer.Initialized) if (!this.videoPlayer.Initialized)
// return; return;
//this.UpdateVisibleRiders(); this.UpdateVisibleRiders();
////删除当前道路上应该消失的骑手 return;
//foreach (int num in this.riderObjects.Keys.ToArray<int>()) //删除当前道路上应该消失的骑手
//{ foreach (int num in this.riderObjects.Keys.ToArray<int>())
// if (!this.visibleRiders.ContainsKey(num)) {
// { if (!this.visibleRiders.ContainsKey(num))
// ARLaneObject riderObject = this.riderObjects[num]; {
// if (!riderObject.IsAtFinish || (double)riderObject.VisibilityLevel <= 0.0) ARLaneObject riderObject = this.riderObjects[num];
// { if (!riderObject.IsAtFinish || (double)riderObject.VisibilityLevel <= 0.0)
// this.DestroyRider(num); {
// this.DestroyRiderTitle(num); this.DestroyRider(num);
// } this.DestroyRiderTitle(num);
// } }
//} }
////新增应该显示的骑手 }
//foreach (TrainingARController.VisibleRiderItem visibleRiderItem in this.visibleRiders.Values) //新增应该显示的骑手
//{ foreach (VisibleRiderItem visibleRiderItem in this.visibleRiders.Values)
// IRouteRider rider = visibleRiderItem.Rider; {
// bool showModel = visibleRiderItem.ShowModel; var rider = visibleRiderItem.Rider;
// ARLaneObject arLaneObject; bool showModel = visibleRiderItem.ShowModel;
// //二次检查 ARLaneObject arLaneObject;
// if (this.riderObjects.TryGetValue(rider.Id, out arLaneObject)) //二次检查
// { if (this.riderObjects.TryGetValue(rider.UserId, out arLaneObject))
// if (arLaneObject is BaseRenderer) {
// { if (arLaneObject is BaseRenderer)
// if (!showModel) {
// { if (!showModel)
// float lane = arLaneObject.Lane; {
// this.DestroyRider(rider.Id); float lane = arLaneObject.Lane;
// this.CreateRiderObject(rider, lane); this.DestroyRider(rider.UserId);
// } this.CreateRiderObject(rider, lane);
// } }
// else if (showModel) }
// { else if (showModel)
// float lane = arLaneObject.Lane; {
// this.DestroyRider(rider.Id); float lane = arLaneObject.Lane;
// this.CreateRiderModel(rider, lane); this.DestroyRider(rider.UserId);
// } this.CreateRiderModel(rider, lane);
// } }
// else }
// { else
// if (showModel) {
// this.CreateRiderModel(rider, visibleRiderItem.Lane); if (showModel)
// else this.CreateRiderModel(rider, visibleRiderItem.Lane);
// this.CreateRiderObject(rider, visibleRiderItem.Lane); else
// this.CreateRiderTitleObject(rider); 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() private void UpdateRidersLean()
{ {
@ -341,19 +712,19 @@ namespace Assets.AR
// float t = this.GetValueViewAlpha(num1); // float t = this.GetValueViewAlpha(num1);
// if ((double)t < 1.0 && (UnityEngine.Object)riderValueView != (UnityEngine.Object)null) // if ((double)t < 1.0 && (UnityEngine.Object)riderValueView != (UnityEngine.Object)null)
// riderValueView.Alpha = t; // riderValueView.Alpha = t;
// if (this.sportProfile == SportProfile.Running) // //if (this.sportProfile == SportProfile.Running)
// { // //{
// if ((UnityEngine.Object)riderValueView != (UnityEngine.Object)null) // // if ((UnityEngine.Object)riderValueView != (UnityEngine.Object)null)
// riderValueView.Active = false; // // riderValueView.Active = false;
// t = 0.0f; // // t = 0.0f;
// } // //}
// Vector3 vector3 = 5f * this.uiScale * Mathf.Max(0.1f, this.SelectedPanorama != null ? 1f : this.GetDistanceScale(num1)); // Vector3 vector3 = 5f * this.uiScale * Mathf.Max(0.1f, this.SelectedPanorama != null ? 1f : this.GetDistanceScale(num1));
// Quaternion rotation = this.UnityCamera.transform.rotation; // Quaternion rotation = this.UnityCamera.transform.rotation;
// if (this.SelectedPanorama != null) // //if (this.SelectedPanorama != null)
// { // //{
// rotation = this.PanoramaCamera.transform.rotation; // // rotation = this.PanoramaCamera.transform.rotation;
// } // //}
// else // //else
// { // {
// if ((double)riderObject.Distance < (double)this.CameraDistance) // if ((double)riderObject.Distance < (double)this.CameraDistance)
// rotation *= Quaternion.Euler(0.0f, 180f, 0.0f); // 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() protected virtual void Start()
{ {
this.SetupModels();
this.SetLayerRecursively(this.gameObject, 9);
this.animator.avatar = (Avatar)null; this.animator.avatar = (Avatar)null;
} }
@ -54,9 +52,6 @@ namespace Assets.AR
base.Update(); base.Update();
} }
protected abstract void SetupModels();
protected virtual void OnPause(bool paused) protected virtual void OnPause(bool paused)
{ {
} }

View File

@ -92,16 +92,15 @@ namespace Assets.AR
protected override void Start() protected override void Start()
{ {
base.Start(); base.Start();
this.PlanNextLook();
} }
protected override void Update() protected override void Update()
{ {
if (this.route == null) if (this.route == null)
return; return;
this.UpdateDiffciulityLevel();
base.Update(); base.Update();
float num = this.Speed; float num = this.Speed;
this.Paused = this.Speed == 0;
bool flag = this.Paused; bool flag = this.Paused;
if (this.IsAtFinish) if (this.IsAtFinish)
{ {
@ -175,42 +174,5 @@ namespace Assets.AR
//this.wheelFront.transform.Rotate(Vector3.right, angle); //this.wheelFront.transform.Rotate(Vector3.right, angle);
//this.wheelRear.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 public interface IRider
{ {
int UserId { get;} int UserId { get;}
string UserName { get; } double StartDistance { get; set; }
double Weight { get;} double OnlineSpeed { get; set; }
double BicycleWeight { get;} double PreDistance { get; set; }
double Speed { get;} double EndDistance { get; set; }
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; }
} }
} }

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_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 313551262} m_GameObject: {fileID: 313551262}
m_CullTransparentMesh: 0 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 --- !u!1 &684809389
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -992,7 +906,7 @@ Camera:
m_Depth: -1 m_Depth: -1
m_CullingMask: m_CullingMask:
serializedVersion: 2 serializedVersion: 2
m_Bits: 4294967295 m_Bits: 1
m_RenderingPath: -1 m_RenderingPath: -1
m_TargetTexture: {fileID: 0} m_TargetTexture: {fileID: 0}
m_TargetDisplay: 0 m_TargetDisplay: 0
@ -1537,92 +1451,6 @@ Transform:
m_Father: {fileID: 0} m_Father: {fileID: 0}
m_RootOrder: 6 m_RootOrder: 6
m_LocalEulerAnglesHint: {x: 0, y: -3.896, z: 0} 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 --- !u!1 &1378474435
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -1925,6 +1753,92 @@ RectTransform:
type: 3} type: 3}
m_PrefabInstance: {fileID: 1426339558} m_PrefabInstance: {fileID: 1426339558}
m_PrefabAsset: {fileID: 0} 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 --- !u!1 &1565405865 stripped
GameObject: GameObject:
m_CorrespondingSourceObject: {fileID: 3342506722007875022, guid: 10e54cf0bec9cbc4b94d1d40e437f87c, m_CorrespondingSourceObject: {fileID: 3342506722007875022, guid: 10e54cf0bec9cbc4b94d1d40e437f87c,
@ -2107,6 +2021,92 @@ CanvasRenderer:
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 1726804851} m_GameObject: {fileID: 1726804851}
m_CullTransparentMesh: 0 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 --- !u!1 &1899149616
GameObject: GameObject:
m_ObjectHideFlags: 0 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> /// <param name="data"></param>
public virtual void Run(TargetData targetData) public virtual void Run(TargetData targetData)
{ {
//将当前用户的位置发送到udf服务 SendUserPositionToServer();//将当前用户的位置发送到udf服务
SendUserPositionToServer(); BeforeRunAfterPakcData();
//OutModel outData = GetSelfTargetData(targetData);
BeforeRunAfterPakcData();//执行前的函数
} }
/// <summary> /// <summary>
/// =>发送用户的位置信息到服务端 /// =>发送用户的位置信息到服务端
/// </summary> /// </summary>
private void SendUserPositionToServer() protected virtual void SendUserPositionToServer()
{ {
try try
{ {
@ -131,7 +129,6 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
protected double SpeedToDistance(double speed) protected double SpeedToDistance(double speed)
{ {
return Math.Round(speed / 3600, 5, MidpointRounding.AwayFromZero); 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) public override void Run(TargetData targetData)
{ {
#region 线线 #region 线线
riders.RemoveAll(r => r.IsSelf == false); riders.Clear();
var onlineUsers = MapUDPService.GetOnlineUsers(recorderData.CurrentRoute.RouteInstance.Id, recorderData.RoomId).Where(d => d.IsSelf == false) var onlineUsers = MapUDPService.GetOnlineUsers(recorderData.CurrentRoute.RouteInstance.Id, recorderData.RoomId).ToList();
.ToList();
foreach (var item in onlineUsers) foreach (var item in onlineUsers)
{ {
riders.Add(new OnlineRiderModel() riders.Add(new OnlineRiderModel()

View File

@ -47,6 +47,14 @@ namespace Assets.Scenes.Ride.Scripts.Model
/// 最后骑行的距离 /// 最后骑行的距离
/// </summary> /// </summary>
public double EndDistance { get; set; } public double EndDistance { get; set; }
public double RouteDistance
{
get
{
return this.EndDistance * 1000;
}
}
/// <summary> /// <summary>
/// 是否是当前登陆人 /// 是否是当前登陆人
/// </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 abstract class AbstractVideoPlayer : MonoBehaviour, IRider
{ {
public double Diff { get;set; }
protected int frames;
protected int currentFrame { get; set; }
protected double preTime;
protected Animator animator; protected Animator animator;
public GameObject head { get; set; } public GameObject head { get; set; }
protected Image ftpImage { get; set; } protected Image ftpImage { get; set; }
@ -41,35 +45,23 @@ namespace Assets.Scripts.Scenes.VideoRide
public int currentIndex; public int currentIndex;
public float bearing = 0f; public float bearing = 0f;
protected MapDataModel mapData; protected MapDataModel mapData;
private float timer = 1f; private float timer = 0f;
protected bool start = true; protected bool start = true;
protected Sequence sequence; protected Sequence sequence;
protected VideoGameManager manager { get; set; } protected VideoGameManager manager { get; set; }
private Camera camera { get; set; }
float currenPlayerHeight; float currenPlayerHeight;
Transform bone_bottle_2 { get; set; } Transform bone_bottle_2 { get; set; }
Vector3 current { get; set; } public double Speed { get; set; }
Vector3 forward { get; set; } public double StartDistance { get; set; }
public double Weight { get => this.weight; } public double PreDistance { get; set; }
public double BicycleWeight { get => this.bicycleWeight; } public double EndDistance { get; set; }
public double Speed { get => this.speed; } public double OnlineSpeed { get; set; }
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 int UserId => this.userId; public int UserId => this.userId;
public string UserName => this.userName; public string UserName => this.userName;
public bool IsStart = false;
protected virtual void Start() protected virtual void Start()
{ {
animator = GetComponent<Animator>(); animator = GetComponent<Animator>();
@ -84,36 +76,33 @@ namespace Assets.Scripts.Scenes.VideoRide
{ {
animator.Play("idle"); animator.Play("idle");
} }
camera = Camera.main;
//bone_bottle_2
bone_bottle_2 = transform.Find("bone_cable_20"); bone_bottle_2 = transform.Find("bone_cable_20");
//var config = manager.mockDirection;
//pre = config[0];
//next = config[0];
} }
protected virtual void Update() protected virtual void Update()
{ {
timer -= Time.deltaTime; timer -= Time.deltaTime;
CreateHeadImage(); CreateHeadImage();
//Turn();
while (timer <= 0) while (timer <= 0)
{ {
try try
{ {
ComputeNextSlope();//计算下一个坡度 ComputeNextSlope();//计算下一个坡度
if (GetStart()) if (manager.IsStart())
{ {
ticks++; ticks++;
ComputePlayer();//计算人物属性 ComputePlayer();//计算人物属性
Forward(); Forward();
ComputeRecord(); ComputeRecord();
ComputeVideo(); ComputeVideo();
ComputeAnimator();//控制动画
} }
ComputeAnimator();//控制动画 else
{
animator.Play("idle");
}
timer += 1f; timer += 1f;
} }
catch (Exception e) catch (Exception e)
@ -124,10 +113,6 @@ namespace Assets.Scripts.Scenes.VideoRide
} }
} }
} }
protected virtual bool GetStart()
{
return true;
}
//动画状态机 //动画状态机
protected virtual void ComputeAnimator() protected virtual void ComputeAnimator()
{ {
@ -158,7 +143,6 @@ namespace Assets.Scripts.Scenes.VideoRide
{ {
return manager.GetCurrentFrame(); return manager.GetCurrentFrame();
} }
protected float t { get; set; }
protected Vector3 currentRotation; protected Vector3 currentRotation;
//计算人物当前属性 //计算人物当前属性
protected virtual void ComputePlayer() protected virtual void ComputePlayer()
@ -281,6 +265,10 @@ namespace Assets.Scripts.Scenes.VideoRide
} }
} }
} }
private void OnDisable()
{
head?.SetActive(false);
}
//显示人物海拔图的头像 //显示人物海拔图的头像
protected virtual void CreateHeadImage() protected virtual void CreateHeadImage()
{ {
@ -314,5 +302,12 @@ namespace Assets.Scripts.Scenes.VideoRide
head?.Destroy(); head?.Destroy();
gameObject.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 class OnlineVideoPlayer : AbstractVideoPlayer
{ {
public double diff;
public int frames;
protected override void Start() 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() protected override void ComputeAnimator()
{ {
base.ComputeAnimator(); base.ComputeAnimator();
@ -40,13 +36,11 @@ namespace Assets.Scripts.Scenes.VideoRide
protected override void CreateHeadImage() protected override void CreateHeadImage()
{ {
base.CreateHeadImage(); base.CreateHeadImage();
if (diff < 0) if (Diff < 0)
((RectTransform)head.transform).anchoredPosition = new Vector2(((RectTransform)head.transform).anchoredPosition.x, -800f); ((RectTransform)head.transform).anchoredPosition = new Vector2(((RectTransform)head.transform).anchoredPosition.x, -800f);
} }
private double preTime; 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)
//设置当前玩家属性
public void SetPlayer(string name, double distance, double totalDistance, double cadance,double heartRate, double wkg, int userId,double power,double currentPlayerDistance,int frame)
{ {
if (manager == null) if (manager == null)
{ {
@ -57,13 +51,17 @@ namespace Assets.Scripts.Scenes.VideoRide
this.wkg = wkg; this.wkg = wkg;
this.userName = name; this.userName = name;
this.cadance = cadance; this.cadance = cadance;
this.totalDistance = totalDistance; this.totalDistance = endDistance;
this.heartRate = (int?)heartRate; this.heartRate = (int?)heartRate;
this.userId = userId; this.userId = userId;
this.power = power; this.power = power;
this.speed = distance * 3600; this.speed = speed;
this.diff = totalDistance - currentPlayerDistance; this.Speed = speed/3.6;
this.Diff = endDistance - currentPlayerDistance;
this.currentFrame = frame; 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 bool isStart { get; set; }
private Route route { get; set; } private Route route { get; set; }
public MapRoute mapRoute { get; set; } public MapRoute mapRoute { get; set; }
public RouteResultParam selectParamModel; public RouteResultParam selectParamModel { get; set; }
public RouteResult routeResult; public RouteResult routeResult;
public string recordId { get; set; } public string recordId { get; set; }
public DateTime startTime { get; set; } public DateTime startTime { get; set; }
@ -115,6 +115,7 @@ namespace Assets.Scripts.Scenes.VideoRide
RouteId = routeId RouteId = routeId
}; };
} }
Debug.Log("start");
endDistance = 0; endDistance = 0;
videoLoading = FindObjectOfType<VideoLoading>(); videoLoading = FindObjectOfType<VideoLoading>();
} }
@ -158,7 +159,7 @@ namespace Assets.Scripts.Scenes.VideoRide
return rankingList; return rankingList;
} }
List<AbstractVideoPlayer> visibleRiders = new List<AbstractVideoPlayer>();//当前线路上的人 public List<AbstractVideoPlayer> visibleRiders = new List<AbstractVideoPlayer>();//当前线路上的人
private const int limits = 5;//在线的其他人数 private const int limits = 5;//在线的其他人数
private double MaxVisibleDistance = 200d;//最大显示距离 private double MaxVisibleDistance = 200d;//最大显示距离
//创建当前线路其他选手 //创建当前线路其他选手
@ -166,11 +167,15 @@ namespace Assets.Scripts.Scenes.VideoRide
{ {
if (list == null || list.Count == 0) if (list == null || list.Count == 0)
{ {
var currentList = FindObjectsOfType<RiderRenderer>();
foreach (var item in currentList)
{
item.Speed = 0;
item.Paused = true;
}
return; return;
} }
CreateCurrentPlayer(list);//如果是观察者模式创建观察主人工 var trainController = GetComponent<ARTrainingController>();
var onlinelist = MapUDPService.GetOnlineUsers(App.RouteIdParam);//最新列表
var currentPlayerInfo = onlinelist.Where(c => c.Id == CurrentPlayer.UserId).FirstOrDefault();
//移除退出的选手 //移除退出的选手
var players = FindObjectsOfType<OnlineVideoPlayer>(); var players = FindObjectsOfType<OnlineVideoPlayer>();
foreach (var item in players) foreach (var item in players)
@ -180,11 +185,11 @@ namespace Assets.Scripts.Scenes.VideoRide
{ {
rideObjs.Remove(item); rideObjs.Remove(item);
visibleRiders.Remove(item); visibleRiders.Remove(item);
//item.Destroy();//TODO: //trainController.RemoveRider(item.UserId);
} }
} }
var currentPlayerInfo = list.Where(c => c.IsSelf).FirstOrDefault();
var needUpdateList = list.Where(c=>Math.Abs(c.EndDistance-CurrentPlayer.totalDistance)*1000 <= MaxVisibleDistance).Take(limits).ToList(); var needUpdateList = list.OrderByDescending(c=>c.IsSelf).ToList();
foreach (var item in needUpdateList) foreach (var item in needUpdateList)
{ {
var onlineRider = item as OnlineRiderModel; var onlineRider = item as OnlineRiderModel;
@ -192,17 +197,18 @@ namespace Assets.Scripts.Scenes.VideoRide
//更新 //更新
if (visibleItem != null) if (visibleItem != null)
{ {
var online = visibleItem as OnlineVideoPlayer; 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);
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);
} }
else 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; GameObject obj = null;
if (Math.Abs(diff * 1000) <= MaxVisibleDistance) if (!item.IsSelf)
{ {
GameObject obj;
if (onlineRider.Sex == 1) if (onlineRider.Sex == 1)
{ {
obj = Instantiate(OnlinePlayer, transform); obj = Instantiate(OnlinePlayer, transform);
@ -211,43 +217,44 @@ namespace Assets.Scripts.Scenes.VideoRide
{ {
obj = Instantiate(OnlinePlayer_NV, transform); obj = Instantiate(OnlinePlayer_NV, transform);
} }
var online = obj.GetComponentInChildren<OnlineVideoPlayer>(); var online = obj.GetComponentInChildren<OnlineVideoPlayer>();
var rideObj = obj.GetComponentInChildren<RiderRenderer>(); 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); 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) public void SetCurrentMode(ARMode aRMode)
{ {
@ -256,7 +263,8 @@ namespace Assets.Scripts.Scenes.VideoRide
uimanager.SetCurrentMode(aRMode); uimanager.SetCurrentMode(aRMode);
if (_aRMode != ARMode.INSPECT) if (_aRMode != ARMode.INSPECT)
{ {
InitCurrentPlayer(); //InitCurrentPlayer();
Debug.Log("ContinueAsync");
ContinueAsync(); ContinueAsync();
} }
else else
@ -267,21 +275,6 @@ namespace Assets.Scripts.Scenes.VideoRide
public GameObject videoPlayer; public GameObject videoPlayer;
public GameObject target; 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:替换写法 //切换人物 TODO:替换写法
public void ChangePlayer(int userId) public void ChangePlayer(int userId)
{ {
@ -298,7 +291,7 @@ namespace Assets.Scripts.Scenes.VideoRide
var onlineRider = currentPlayer as OnlineRiderModel; var onlineRider = currentPlayer as OnlineRiderModel;
var obj = Instantiate(OnlinePlayer, transform); var obj = Instantiate(OnlinePlayer, transform);
var online = obj.GetComponent<OnlineVideoPlayer>(); 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; CurrentPlayer = online;
} }
var clearList = players.Where(c => c.UserId != userId); var clearList = players.Where(c => c.UserId != userId);
@ -314,7 +307,7 @@ namespace Assets.Scripts.Scenes.VideoRide
{ {
return infoPanel; return infoPanel;
} }
//骑行记录 //继续骑行
public void ContinueAsync() public void ContinueAsync()
{ {
//骑行结果 //骑行结果
@ -322,23 +315,22 @@ namespace Assets.Scripts.Scenes.VideoRide
{ {
routeResult = App.routeResult; routeResult = App.routeResult;
selectParamModel = App.routeResult.ContinueCyclingParam; selectParamModel = App.routeResult.ContinueCyclingParam;
Debug.Log("selectParamModel"+ selectParamModel.ContinueMark);
SetCyclingModel(CyclingModel.Single); SetCyclingModel(CyclingModel.Single);
endDistance = routeResult.EndDistance; endDistance = routeResult.EndDistance;
//TODO继续骑行 //mediaPlayer.Control.SeekToFrame(routeResult.LastFrame ?? 0);
mediaPlayer.Control.SeekToFrame(routeResult.LastFrame ?? 0);
var v = FindObjectOfType<VideoPlayer>();
v.SetEndDistance(endDistance);
} }
} }
//设置骑行模式 //设置骑行模式
public void SetCyclingModel(CyclingModel mode) public void SetCyclingModel(CyclingModel mode)
{ {
startTime = UIManager.Now.GetDateTime(); startTime = UIManager.Now.GetDateTime();
Debug.Log("SetCyclingModel" + selectParamModel.ContinueMark);
this.cyclingModel = mode; this.cyclingModel = mode;
switch (cyclingModel) switch (cyclingModel)
{ {
case CyclingModel.Single: case CyclingModel.Single:
cyclingController = new SingleModel(route, selectParamModel); cyclingController = new ARSingleModel(route, selectParamModel);
break; break;
case CyclingModel.GameRoom: case CyclingModel.GameRoom:
cyclingController = new GameModel(route, selectParamModel); cyclingController = new GameModel(route, selectParamModel);
@ -367,7 +359,6 @@ namespace Assets.Scripts.Scenes.VideoRide
//设置视频源文件 //设置视频源文件
public void SetMedia(string path) public void SetMedia(string path)
{ {
return;
if (mediaPlayer != null) if (mediaPlayer != null)
{ {
mediaPlayer.OpenMedia(new MediaPath(path,MediaPathType.AbsolutePathOrURL),false); mediaPlayer.OpenMedia(new MediaPath(path,MediaPathType.AbsolutePathOrURL),false);
@ -378,8 +369,6 @@ namespace Assets.Scripts.Scenes.VideoRide
{ {
return isStop; return isStop;
} }
double preframe = 0;
double preDistance = 0;
//暂停 //暂停
public void Pause() public void Pause()
@ -400,11 +389,7 @@ namespace Assets.Scripts.Scenes.VideoRide
{ {
return mediaPlayer.Control.GetCurrentTimeFrames(); return mediaPlayer.Control.GetCurrentTimeFrames();
} }
Vector3 currentCameraRotation = Vector3.zero;
Vector3 mVelocity;
float prePos = 0f;
public float ratio = 111.676f; public float ratio = 111.676f;
public float startOffset = 0f; public float startOffset = 0f;
//获取AR骑行配置信息 //获取AR骑行配置信息
@ -498,7 +483,6 @@ namespace Assets.Scripts.Scenes.VideoRide
return new Vector2d(0, 0); return new Vector2d(0, 0);
} }
} }
private void OnDestroy() private void OnDestroy()
{ {
App.gameRoomDetail = null; App.gameRoomDetail = null;

View File

@ -225,7 +225,17 @@ namespace Assets.Scripts.Scenes.VideoRide
return; return;
startBtnLock = true; startBtnLock = true;
var ui = manager.GetCanvasTransform(); 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 route = manager.mapRoute;
var arDataPath = $"{PFConstants.ARFolder}/{route.Id}/{route.Id}.json"; 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<ARData>((Func<ARData>)(() => aRData = ARData.LoadFromFile(arDataPath)));
await Task.Run<RouteDetailData>((Func<RouteDetailData>)(() => routeDetailData = RouteDetailData.LoadFromFile(videoRoute))); await Task.Run<RouteDetailData>((Func<RouteDetailData>)(() => routeDetailData = RouteDetailData.LoadFromFile(videoRoute)));
var arController = FindObjectOfType<ARTrainingController>(); var arController = FindObjectOfType<ARTrainingController>();
arController.Initialize(aRData, routeDetailData); 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);
};
} }
public void StartRide(int seconds) public void StartRide(int seconds)
{ {
var ui = manager.GetCanvasTransform(); var ui = manager.GetCanvasTransform();
InitAR();
canvasGroup.DOFade(0, 0).onComplete += () => { canvasGroup.DOFade(0, 0).onComplete += () => {
gameObject.SetActive(false); gameObject.SetActive(false);
manager.SetCyclingModel(CyclingModel.GameRoom); manager.SetCyclingModel(CyclingModel.GameRoom);
@ -259,6 +263,8 @@ namespace Assets.Scripts.Scenes.VideoRide
}; };
UIManager.ShowGameRoomCountDownPanel(seconds,()=> { UIManager.ShowGameRoomCountDownPanel(seconds,()=> {
manager.StartGame(); 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.Model;
using Assets.Scenes.Ride.Scripts;
using Assets.Scenes.Ride.Scripts.Model;
using Assets.Scenes.Ride.Scripts.Model.CyclingModels; using Assets.Scenes.Ride.Scripts.Model.CyclingModels;
using DG.Tweening;
using System; using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using UnityEngine; using UnityEngine;
namespace Assets.Scripts.Scenes.VideoRide namespace Assets.Scripts.Scenes.VideoRide
{ {
public class VideoPlayer : AbstractVideoPlayer public class VideoPlayer : AbstractVideoPlayer
{ {
public double EndDistance => totalDistance;
private bool isSingle = true; private bool isSingle = true;
protected override void Start() protected override void Start()
{ {
@ -25,7 +16,7 @@ namespace Assets.Scripts.Scenes.VideoRide
userName = App.CurrentUser.Nickname; userName = App.CurrentUser.Nickname;
} }
protected override bool GetStart() protected bool GetStart()
{ {
return manager.IsStart(); return manager.IsStart();
} }
@ -43,6 +34,8 @@ namespace Assets.Scripts.Scenes.VideoRide
public void SetEndDistance(double distance) public void SetEndDistance(double distance)
{ {
this.totalDistance = distance; this.totalDistance = distance;
this.PreDistance = distance * 1000;
this.EndDistance = PreDistance;
} }
public void Complete() public void Complete()
@ -153,5 +146,16 @@ namespace Assets.Scripts.Scenes.VideoRide
manager.Save(totalDistance); 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) public void UpdateProcess(float process)
{ {
slider.value = process; slider.value = process;
if (process >= 100) if (process >= 1)
{ {
done.SetActive(true); done.SetActive(true);
doneTxt.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;
using Assets.Scripts.Apis.Models; using Assets.Scripts.Apis.Models;
using Cysharp.Threading.Tasks;
using DG.Tweening; using DG.Tweening;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine; using UnityEngine;
using UnityEngine.EventSystems; using UnityEngine.EventSystems;
using UnityEngine.Networking;
using UnityEngine.SceneManagement; using UnityEngine.SceneManagement;
using UnityEngine.UI; using UnityEngine.UI;
public class GameRoomMapItem : MonoBehaviour, IPointerExitHandler, IPointerEnterHandler, IPointerUpHandler public class GameRoomMapItem : MonoBehaviour, IPointerExitHandler, IPointerEnterHandler, IPointerUpHandler,IProgress<float>
{ {
public class PropNames public class PropNames
{ {
@ -39,15 +45,11 @@ public class GameRoomMapItem : MonoBehaviour, IPointerExitHandler, IPointerEnter
listController = FindObjectOfType<GameRoomListController>(); listController = FindObjectOfType<GameRoomListController>();
} }
// Update is called once per frame
void Update()
{
}
float? localY = null; float? localY = null;
MapRoute map; MapRoute map;
Dictionary<string, Texture> caches; Dictionary<string, Texture> caches;
private MapRouteAreaItem area = null; private MapRouteAreaItem area = null;
Slider slider;
public void Initial(MapRoute myMap, Dictionary<string, Texture> caches, MapRouteAreaItem area = null) public void Initial(MapRoute myMap, Dictionary<string, Texture> caches, MapRouteAreaItem area = null)
{ {
if (caches != null) if (caches != null)
@ -64,7 +66,7 @@ public class GameRoomMapItem : MonoBehaviour, IPointerExitHandler, IPointerEnter
var downloadBtn = transform.Find("DownLoadModal/DownLoad").gameObject; var downloadBtn = transform.Find("DownLoadModal/DownLoad").gameObject;
var downloading = transform.Find("DownLoadModal/Downloading").gameObject; var downloading = transform.Find("DownLoadModal/Downloading").gameObject;
var downloadTxt = transform.Find("DownLoadModal/Text").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 fileName = map.FileName;
var path = PFConstants.VideoFolder; var path = PFConstants.VideoFolder;
@ -76,49 +78,10 @@ public class GameRoomMapItem : MonoBehaviour, IPointerExitHandler, IPointerEnter
downloading.SetActive(true); downloading.SetActive(true);
downloadTxt.SetActive(false); downloadTxt.SetActive(false);
slider.gameObject.SetActive(true); slider.gameObject.SetActive(true);
Loom.Current.StartCoroutine(Utils.DownloadFileWithProcess(map.FileName, map.Url, path,(p, req) => Loom.Download(map);
{
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);
}
}));
}); });
transform.Find("Name").GetComponent<Text>().text = myMap.Name; transform.Find("Name").GetComponent<Text>().text = myMap.Name;
transform.Find("IdContainer/Text").GetComponent<Text>().text = $"#{myMap.Id}"; transform.Find("IdContainer/Text").GetComponent<Text>().text = $"#{myMap.Id}";
transform.Find("TimesContainer").gameObject.SetActive(myMap.MineCount > 0); transform.Find("TimesContainer").gameObject.SetActive(myMap.MineCount > 0);
transform.Find("TimesContainer/Text").GetComponent<Text>().text = myMap.MineCountString; 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); 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() private async void GetList()
{ {
if (isEnd) return; 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.result)
{ {
if (res.data.Count == 0) if (res.data.Count == 0)

View File

@ -1,10 +1,14 @@
using Assets.Scenes.Ride.Scripts; using Assets.Scenes.Ride.Scripts;
using Assets.Scripts.Apis.Models;
using Cysharp.Threading.Tasks;
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using UnityEngine; using UnityEngine;
using UnityEngine.Networking;
/// <summary> /// <summary>
/// 异步线程更新ui工具类 /// 异步线程更新ui工具类
@ -174,4 +178,27 @@ public class Loom : MonoBehaviour
_current = null; _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);
}
} }