AR骑行beta
This commit is contained in:
1 parent
4d5bc8f080
commit
9b1bb3d9ba
45 files changed
+35055
-2401
No files matched your search
@@ -1,5 +1,6 @@
|
||||
using Assets.Scenes.Ride.Scripts;
|
||||
using Assets.Scripts.Apis.Models;
|
||||
using Assets.Scenes.Ride.Scripts.Model;
|
||||
using DG.Tweening;
|
||||
using Mapbox.Utils;
|
||||
using System;
|
||||
@@ -85,45 +86,21 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
//人物移动速度
|
||||
public int moveSpeed = 2;
|
||||
|
||||
void setHeroState(int newState)
|
||||
{
|
||||
//根据当前人物方向与上一次备份的方向计算出模型旋转的角度
|
||||
Vector3 transformValue = new Vector3();
|
||||
//模型移动的位置数值
|
||||
switch (newState)
|
||||
{
|
||||
case HERO_UP:
|
||||
transformValue = Vector3.forward * Time.deltaTime;
|
||||
break;
|
||||
case HERO_DOWN:
|
||||
transformValue = (-Vector3.forward) * Time.deltaTime;
|
||||
break;
|
||||
case HERO_LEFT:
|
||||
transformValue = Vector3.left * Time.deltaTime;
|
||||
break;
|
||||
case HERO_RIGHT:
|
||||
transformValue = (-Vector3.left) * Time.deltaTime;
|
||||
break;
|
||||
}
|
||||
//移动人物
|
||||
transform.Translate(transformValue * moveSpeed, Space.World);
|
||||
state = newState;
|
||||
|
||||
}
|
||||
protected virtual void Update()
|
||||
{
|
||||
timer -= Time.deltaTime;
|
||||
CreateHeadImage();
|
||||
Turn();
|
||||
|
||||
while (timer <= 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
ComputeNextSlope();//计算下一个坡度
|
||||
ComputePlayer();//计算人物属性
|
||||
if (GetStart())
|
||||
{
|
||||
ticks++;
|
||||
ComputePlayer();//计算人物属性
|
||||
Forward();
|
||||
ComputeRecord();
|
||||
ComputeVideo();
|
||||
@@ -223,14 +200,14 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
speed = 0;
|
||||
distance = 0;
|
||||
}
|
||||
//一旦有功率就开始骑行、否则暂停
|
||||
if (!manager.IsQuit() && manager.CurrentPlayer.UserId == UserId && !manager.IsQuit() && manager.cyclingModel == Assets.Scenes.Ride.Scripts.Model.CyclingModel.Single)
|
||||
{
|
||||
if (power > 0)
|
||||
{
|
||||
manager.StartGame();
|
||||
}
|
||||
}
|
||||
////一旦有功率就开始骑行、否则暂停
|
||||
//if (!manager.IsQuit() && manager.CurrentPlayer.UserId == UserId && !manager.IsQuit() && manager.cyclingModel == CyclingModel.Single)
|
||||
//{
|
||||
// if (power > 0)
|
||||
// {
|
||||
// manager.StartGame();
|
||||
// }
|
||||
//}
|
||||
}
|
||||
Vector3 current { get; set; }
|
||||
Vector3 forward { get; set; }
|
||||
@@ -264,8 +241,8 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
}
|
||||
if (manager.CurrentPlayer != null && manager.CurrentPlayer.UserId != UserId)
|
||||
return;
|
||||
|
||||
manager.Play(ratio);
|
||||
//ratio = (float)Math.Round(ratio, 1);
|
||||
manager.Play(totalDistance);
|
||||
|
||||
if (ratio > 1)
|
||||
{
|
||||
@@ -303,6 +280,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
decimal right = (decimal)sumDistance;
|
||||
if (left <= right)
|
||||
{
|
||||
Debug.Log($"当前索引{i}");
|
||||
currentIndex = i;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -119,9 +119,9 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
var screenWidth = UnityEngine.Screen.width;
|
||||
var screenHeight = UnityEngine.Screen.height;
|
||||
|
||||
var sw_world = _minicamera.ViewportToWorldPoint(new Vector3(0.25f, 0.1f, 160));
|
||||
var sw_world = _minicamera.ViewportToWorldPoint(new Vector3(0f, 0f, 160));
|
||||
var sw = _map.WorldToGeoPosition(sw_world);
|
||||
var ne_world = _minicamera.ViewportToWorldPoint(new Vector3(0.75f, 0.9f, 90));
|
||||
var ne_world = _minicamera.ViewportToWorldPoint(new Vector3(1f, 1f, 90));
|
||||
var ne = _map.WorldToGeoPosition(ne_world);
|
||||
|
||||
return new Vector2dBounds(new Vector2d(sw.x, sw.y), new Vector2d(ne.x, ne.y));
|
||||
|
||||
@@ -24,7 +24,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
//var left = totalDistance % mapData.TotalDistance;
|
||||
//var right = current.totalDistance % mapData.TotalDistance;
|
||||
//diff = (left - right) * 1000;
|
||||
if (Math.Abs(diff) > 150)
|
||||
if (Math.Abs(diff) > 100)
|
||||
{
|
||||
Destroy();
|
||||
}
|
||||
|
||||
@@ -99,7 +99,6 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
DeviceCache.Init(PFConstants.DeviceCacheFolder);
|
||||
var check = CheckAnt();//初始化蓝牙设备
|
||||
recordId = Guid.NewGuid().ToString();
|
||||
MockDirection();
|
||||
infoPanel = Resources.Load<GameObject>("UI/Prefab/AR/VideoPlayerHead");
|
||||
OnlinePlayer = Resources.Load<GameObject>("UI/Prefab/AR/OnlineVideoPlayer");
|
||||
OnlinePlayer_NV = Resources.Load<GameObject>("UI/Prefab/AR/OnlineVideoPlayer_NV");
|
||||
@@ -115,6 +114,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
//获取路书
|
||||
GetMapRoute();
|
||||
GetMapData();
|
||||
MockDirection();
|
||||
route = new Route(mapData, mapRoute);
|
||||
|
||||
if (selectParamModel == null)
|
||||
@@ -365,8 +365,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
|
||||
private void MockDirection()
|
||||
{
|
||||
var text = Resources.Load<TextAsset>("UI/direction");
|
||||
var arr = text.text.Replace("\r\n", " ").Split(' ');
|
||||
var arr = mapRoute.ARConfig.Replace("\r\n", " ").Split(' ');
|
||||
foreach (var item in arr)
|
||||
{
|
||||
if (string.IsNullOrEmpty(item))
|
||||
@@ -390,12 +389,6 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
break;
|
||||
}
|
||||
}
|
||||
//模拟登录
|
||||
private async Task Login()
|
||||
{
|
||||
var result = await new UserApi().Login("anyway2019@163.com", "123456", "");
|
||||
App.CurrentUser = result.data;
|
||||
}
|
||||
//开始游戏
|
||||
public void StartGame()
|
||||
{
|
||||
@@ -428,33 +421,40 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
return isStop;
|
||||
}
|
||||
double preframe = 0;
|
||||
//设置当前视频播放速度
|
||||
public void Play(float playbackRate = 1f)
|
||||
public void Play(double totalDistance)
|
||||
{
|
||||
if (!isStart)
|
||||
return;
|
||||
if (mediaPlayer != null)
|
||||
{
|
||||
mediaPlayer.PlaybackRate = playbackRate;
|
||||
mediaPlayer.Play();
|
||||
//mediaPlayer.PlaybackRate = totalDistance;
|
||||
//if (!mediaPlayer.Control.IsPlaying())
|
||||
// mediaPlayer.Play();
|
||||
//var frame = DistanceToFrames(totalDistance);
|
||||
var frame = DistanceToTimers(totalDistance);
|
||||
StartCoroutine(DOSeekToFrame(preframe, frame - preframe));
|
||||
preframe = frame;
|
||||
}
|
||||
if (startTime == null)
|
||||
{
|
||||
startTime = UIManager.Now.GetDateTime();
|
||||
}
|
||||
isStart = true;
|
||||
}
|
||||
//暂停
|
||||
public void Pause()
|
||||
{
|
||||
isStart = !isStart;
|
||||
isStop = !isStop;
|
||||
if (isStop)
|
||||
{
|
||||
mediaPlayer?.Pause();
|
||||
}
|
||||
else
|
||||
{
|
||||
mediaPlayer?.Play();
|
||||
}
|
||||
//if (isStop)
|
||||
//{
|
||||
// mediaPlayer?.Pause();
|
||||
//}
|
||||
//else
|
||||
//{
|
||||
// mediaPlayer?.Play();
|
||||
//}
|
||||
}
|
||||
//退出骑行
|
||||
public void Quit()
|
||||
@@ -477,6 +477,13 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
distance %= TotalDistance;
|
||||
return TotalDistance > 0 ? Convert.ToInt32(frames / TotalDistance * distance) : 0;
|
||||
}
|
||||
public double DistanceToTimers(double distance)
|
||||
{
|
||||
var timers = mediaPlayer.Info.GetDuration();
|
||||
var TotalDistance = route?.TotalDistance ?? 0;
|
||||
distance %= TotalDistance;
|
||||
return TotalDistance > 0 ? timers / TotalDistance * distance : 0;
|
||||
}
|
||||
public int GetFrameOffSet(double distance)
|
||||
{
|
||||
var currentFrame = GetCurrentFrame();
|
||||
@@ -492,6 +499,21 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
mediaPlayer?.Control.SeekToFrame(seq);
|
||||
}
|
||||
double currentFrame = 0d;
|
||||
private IEnumerator DOSeekToFrame(double preFrame, double offset)
|
||||
{
|
||||
float t = 0;
|
||||
while (t < 1)
|
||||
{
|
||||
t += Time.deltaTime;
|
||||
var result = preFrame + offset * t;
|
||||
currentFrame = result;
|
||||
mediaPlayer?.Control.SeekFast(result);
|
||||
yield return new WaitForEndOfFrame();
|
||||
}
|
||||
}
|
||||
//获取AR骑行配置信息
|
||||
|
||||
//获取路书gps信息
|
||||
public MapDataModel GetMapData()
|
||||
{
|
||||
@@ -499,7 +521,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
var mapApi = ConfigHelper.mapApi;
|
||||
int routeId = App.RouteIdParam;
|
||||
mapData = mapApi.GetData(routeId);//获取路书地理数据
|
||||
mapData = mapApi.GetData(routeId,20);//获取路书地理数据
|
||||
}
|
||||
return mapData;
|
||||
}
|
||||
|
||||
@@ -106,7 +106,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
|
||||
download = transform.Find("Panel/Download").gameObject;
|
||||
watch = transform.Find("Panel/Watch").gameObject;
|
||||
|
||||
|
||||
UIManager.AddEvent(watch, UnityEngine.EventSystems.EventTriggerType.PointerClick, WatchHandler);
|
||||
canvasGroup = transform.GetComponent<CanvasGroup>();
|
||||
|
||||
@@ -117,12 +117,14 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
|
||||
if (File.Exists(filepath))
|
||||
{
|
||||
watch.SetActive(true);
|
||||
slider.value = 100;
|
||||
download.gameObject.SetActive(false);
|
||||
manager.SetMedia(filepath);
|
||||
}
|
||||
else
|
||||
{
|
||||
watch.SetActive(false);
|
||||
//检查本地文件是否存在 如果存在直接设置mediaPlayer 否则显示下载按钮
|
||||
UIManager.AddEvent(download.gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, Download);
|
||||
}
|
||||
@@ -200,7 +202,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
#endregion
|
||||
//显示线路背景图
|
||||
DrawMapRouteAsync(route.Id);
|
||||
//查询排行榜
|
||||
//查询排行榜 TODO优化
|
||||
var list = ConfigHelper.mapApi.GetRouteRanking(route.Id, "1", 0, 10000, "");
|
||||
if (list.result)
|
||||
{
|
||||
@@ -212,9 +214,10 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
var ui = manager.GetCanvasTransform();
|
||||
canvasGroup.DOFade(0, 1).onComplete += () => {
|
||||
gameObject.SetActive(false);
|
||||
manager.StartGame();
|
||||
manager.SetCyclingModel(Assets.Scenes.Ride.Scripts.Model.CyclingModel.Single);
|
||||
manager.SetCurrentMode(VideoGameManager.ARMode.RIDE);
|
||||
ui.Find("Panel").gameObject.SetActive(true);
|
||||
//ui.Find("Panel").gameObject.SetActive(true);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -236,10 +239,14 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
var path = PFConstants.VideoFolder;
|
||||
var filepath = path + $"/{route.FileName}";
|
||||
var text = rideNow.GetComponentInChildren<Text>();
|
||||
StartCoroutine(Utils.DownloadVideo(route.FileName, route.Url
|
||||
, (p, req) =>
|
||||
{
|
||||
rideNow.enabled = false;
|
||||
rideNow.interactable = false;
|
||||
slider.value = (float)Math.Round(p * 100, 2);
|
||||
text.text = slider.value.ToString()+"%";
|
||||
request = req;
|
||||
download.SetActive(false);
|
||||
}
|
||||
@@ -250,6 +257,10 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
}
|
||||
else
|
||||
{
|
||||
rideNow.enabled = true;
|
||||
rideNow.interactable = true;
|
||||
text.text = App.GetLocalString("Ride Now");
|
||||
watch.SetActive(true);
|
||||
slider.value = 100;
|
||||
manager.SetMedia(filepath);
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
public double EndDistance => totalDistance;
|
||||
protected Transform LightTrans { get; set; }
|
||||
private bool isSingle = true;
|
||||
protected override void Start()
|
||||
{
|
||||
base.Start();
|
||||
@@ -42,7 +43,11 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
public void Complete()
|
||||
{
|
||||
start = false;
|
||||
manager.Save(totalDistance);
|
||||
var uimanager= FindObjectOfType<VideoUIManager>();
|
||||
if (uimanager!= null)
|
||||
{
|
||||
uimanager.SaveAndShowResult();
|
||||
}
|
||||
}
|
||||
protected override void ComputeAnimator()
|
||||
{
|
||||
@@ -67,11 +72,11 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
heartRate = manager.UpDateHeart();
|
||||
power = manager.UpdatePower();
|
||||
cadance = manager.UpdateCadence();
|
||||
//#if UNITY_EDITOR
|
||||
power = 100;
|
||||
#if UNITY_EDITOR
|
||||
power = 280;
|
||||
cadance = 70;
|
||||
heartRate = 160;
|
||||
//#endif
|
||||
#endif
|
||||
weight = App.CurrentUser.Weight;
|
||||
bicycleWeight = App.CurrentUser.BicycleWeight;
|
||||
wkg = Math.Round(power / weight, 2);
|
||||
@@ -81,13 +86,15 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
//发送阻力
|
||||
manager.TrackResistance(currentSlope);
|
||||
base.ComputePlayer();
|
||||
//比人先完成触发关门时间
|
||||
HandleForGameRoom();
|
||||
}
|
||||
private bool gameRoomHandled { get; set; }
|
||||
//房间倒计时保存
|
||||
private void HandleForGameRoom()
|
||||
{
|
||||
var model = manager.cyclingController as GameModel;
|
||||
if (model != null && model.FirstEndTime.HasValue && !gameRoomHandled)
|
||||
if (model != null && model.FirstEndTime.HasValue && !gameRoomHandled && App.CurrentUser.Id != model.FirstUserId)
|
||||
{
|
||||
gameRoomHandled = true;
|
||||
var gap = model.FirstEndTime.Value - UIManager.Now.GetDateTime();
|
||||
@@ -96,13 +103,14 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
Upload();
|
||||
var uiManager = FindObjectOfType<VideoUIManager>();
|
||||
uiManager.ShowResultPanel();
|
||||
});
|
||||
},true);
|
||||
}
|
||||
}
|
||||
//控制视频播放速度
|
||||
protected override void ComputeVideo()
|
||||
{
|
||||
base.ComputeVideo();
|
||||
//单人骑行到终点自动暂停
|
||||
}
|
||||
|
||||
protected override void ComputeRecord()
|
||||
@@ -116,7 +124,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
Ticks = ticks,
|
||||
_Power = power,
|
||||
_Speed = speed,
|
||||
_Distance = totalDistance,//totalDistance > mapData.TotalDistance ? mapData.TotalDistance : totalDistance,
|
||||
_Distance = totalDistance > mapData.TotalDistance ? mapData.TotalDistance : totalDistance,
|
||||
_Cadence = cadance,
|
||||
_HeartRate = heartRate,
|
||||
_Lat = currentlatLon.x,
|
||||
@@ -124,16 +132,20 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
_TotalClimb = totalClimb,
|
||||
_FrameRate = manager.GetCurrentFrame()
|
||||
};
|
||||
var preDistance = targetData._Distance - distance;//totalDistance >= mapData.TotalDistance ? targetData._Distance : targetData._Distance - distance;
|
||||
|
||||
var preDistance = totalDistance >= mapData.TotalDistance ? targetData._Distance : targetData._Distance - distance;
|
||||
if (!isSingle)
|
||||
{
|
||||
preDistance = targetData._Distance - distance;
|
||||
}
|
||||
recorderData.PreDistance = Math.Round(preDistance, 6, MidpointRounding.AwayFromZero);
|
||||
recorderData.EndDistance = Math.Round(targetData._Distance, 6, MidpointRounding.AwayFromZero);
|
||||
recorderData.RiderDatas.Add(targetData);
|
||||
//默认启用多圈
|
||||
//if (totalDistance >= mapData.TotalDistance)
|
||||
//{
|
||||
// start = false;
|
||||
// manager.Save(totalDistance);
|
||||
//}
|
||||
if (isSingle && totalDistance >= mapData.TotalDistance)
|
||||
{
|
||||
Complete();
|
||||
}
|
||||
}
|
||||
|
||||
protected override void Forward()
|
||||
|
||||
@@ -5,6 +5,7 @@ using UnityEngine.EventSystems;
|
||||
using UnityEngine.UI;
|
||||
using DG.Tweening;
|
||||
using UnityEngine.SceneManagement;
|
||||
using Assets.Scenes.Ride.Scripts.Model.CyclingModels;
|
||||
|
||||
namespace Assets.Scripts.Scenes.VideoRide
|
||||
{
|
||||
@@ -43,6 +44,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
//modal
|
||||
GameObject settingPanel { get; set; }
|
||||
GameObject resultPanel { get; set; }
|
||||
GameObject gameRoomResultPanel { get; set; }
|
||||
|
||||
//ftp
|
||||
GameObject ftpPanel { get; set; }
|
||||
@@ -136,6 +138,7 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
//modal
|
||||
settingPanel = transform.Find("Panel/SettingPanel").gameObject;
|
||||
resultPanel = transform.Find("Panel/ResultPanel").gameObject;
|
||||
gameRoomResultPanel = transform.Find("Panel/GameRoomResult").gameObject;
|
||||
//
|
||||
explosive = transform.Find("Panel/Explosive").gameObject;
|
||||
//toolbar 事件注册
|
||||
@@ -225,6 +228,25 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
videoResultScript.InjectController(manager);
|
||||
videoResultScript.SetDataSource(manager.cyclingController.recorderData);
|
||||
}
|
||||
public void SaveAndShowResult()
|
||||
{
|
||||
videoPlayer = FindObjectOfType<VideoPlayer>();
|
||||
videoPlayer?.Upload();
|
||||
//show result
|
||||
if (manager.cyclingController is GameModel)
|
||||
{
|
||||
gameRoomResultPanel.SetActive(true);
|
||||
gameRoomResultPanel.transform.SetAsLastSibling();
|
||||
}
|
||||
else
|
||||
{
|
||||
resultPanel.SetActive(true);
|
||||
resultPanel.transform.SetAsLastSibling();
|
||||
var videoResultScript = resultPanel.GetComponent<VideoResultScript>();
|
||||
videoResultScript.InjectController(manager);
|
||||
videoResultScript.SetDataSource(manager.cyclingController.recorderData);
|
||||
}
|
||||
}
|
||||
private void QuitClick(BaseEventData e)
|
||||
{
|
||||
if (manager._aRMode == VideoGameManager.ARMode.RIDE)
|
||||
@@ -233,15 +255,8 @@ namespace Assets.Scripts.Scenes.VideoRide
|
||||
UIManager.ShowConfirm("Quit", "Do you want to keep the record?",
|
||||
() =>
|
||||
{
|
||||
videoPlayer = FindObjectOfType<VideoPlayer>();
|
||||
videoPlayer?.Upload();
|
||||
SaveAndShowResult();
|
||||
UIManager.CloseConfirm();
|
||||
//show result
|
||||
resultPanel.SetActive(true);
|
||||
resultPanel.transform.SetAsLastSibling();
|
||||
var videoResultScript = resultPanel.GetComponent<VideoResultScript>();
|
||||
videoResultScript.InjectController(manager);
|
||||
videoResultScript.SetDataSource(manager.cyclingController.recorderData);
|
||||
},
|
||||
2,
|
||||
() =>
|
||||
|
||||
Reference in new issue
Block a user