AR骑行beta

This commit is contained in:
lishuo committed 2022-08-05 15:10:09 +08:00
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);
}
+25 -13
View File
@@ -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,
() =>