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

+2 -2
View File
@@ -181,9 +181,7 @@ public class MainController : BaseScene
var m = msgs[selectIndex];
if (msgIndex >= 5) //
{
//msgIndex = 0;
Sequence se = DOTween.Sequence();
//m.transform.DOLocalMoveY(m.transform.localPosition.y - 38, 0.5f);
foreach (var item in msgs)
{
se.Join(item.transform.DOLocalMoveY(item.transform.localPosition.y - moveOffset, 0.5f));
@@ -544,6 +542,8 @@ public class MainController : BaseScene
var userName = arr[1];
var roomName = arr[2];
var roomId = Convert.ToInt32(arr[3]);
if (userName.Equals(App.CurrentUser.Nickname))
return;
var content = $"{userName} {App.GetLocalString("invite you to join in")} {roomName} , {App.GetLocalString("are you accept the invitation?")}";
UIManager.ShowConfirm(App.GetLocalString("Invitition"), content, () => {
UIManager.CloseConfirm();
@@ -167,16 +167,21 @@ namespace Assets.Scenes.Ride.Scripts
public void setUserId(int userId,string WxHeadImg)
{
_userId = userId;
var isself = userId == cyclingController.currentPlayer.UserId && !cyclingController.isWatch;
bool isself;
if (cyclingController != null)
{
isself = userId == cyclingController.currentPlayer.UserId && !cyclingController.isWatch;
}
else
{
isself = userId == App.CurrentUser.Id;
}
//头像根据是否是自己显示
if (isself)
{
Utils.DisplayImage(Head, WxHeadImg, true);
}
Head.gameObject.SetActive(isself);
//边框样式
var color = isself ? WHITE : TRANSPARENT;
//outline.effectColor = color;
}
}
}
@@ -1,10 +1,9 @@
using Assets.Scenes.Ride.Scripts.Model.RiderModels;
using Assets.Scripts;
using Assets.Scripts.Apis.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
{
@@ -14,7 +13,9 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
/// 第一个到终点的时间
/// </summary>
public DateTime? FirstEndTime { get; private set; }
public int? FirstUserId { get; private set; }
public GameRoomModel GameRoom { get; private set; }
public List<RoomRankItem> mapWorkoutRecordRankings = new List<RoomRankItem>();
public GameModel(Route route,RouteResultParam param)
: base(route, CyclingModel.Single)
@@ -87,15 +88,69 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
protected override void BeforeRunAfterPakcData()
{
base.BeforeRunAfterPakcData();
var userList = MapUDPService.GetOnlineUsers(recorderData.CurrentRoute.RouteInstance.Id,recorderData.RoomId).Where(c=>c.IsSelf == false).OrderByDescending(u => u.Saved).ThenBy(d => d.CreateTime).ThenByDescending(d => d.EndDistance);
int index = 0;
List<CompetitionRankingSortModel> sort = new List<CompetitionRankingSortModel>();
var userList = MapUDPService.GetOnlineUsers(recorderData.CurrentRoute.RouteInstance.Id,recorderData.RoomId).OrderByDescending(u => u.Saved).ThenBy(d => d.CreateTime).ThenByDescending(d => d.EndDistance);
if (userList.Any())
{
//计算关门时间
foreach (var item in userList)
{
if(!FirstEndTime.HasValue && item.IsCompleted)
if (!FirstEndTime.HasValue && item.IsCompleted)
{
FirstEndTime = Now.AddMinutes(GameRoom.CloseTime);
FirstUserId = item.Id;
}
index++;
double near = Math.Round(item.EndDistance - currentDistance, 2); //Math.Round(TurfHelper.GetDistances(point, item.Point), 2);
if (item.IsCompleted)
{
sort.Add(new CompetitionRankingSortModel
{
Index = index,
Name = item.Name,
Near = near,
KGWeight = Math.Round(item.WeightKg, 2).ToString(),
Speed = Math.Round(item.Speed, 1),
CountryImg = item.Country,//ConfigHelper.Host + $"User/GetCountryImg?userid={ item.Id }",
UserId = item.Id,
IsSelf = item.IsSelf,
Headimage = item.HeadImage,
CreateTime = DateTime.MaxValue,
EndDistance = item.EndDistance,
IsCompleted = item.IsCompleted,
});
}
}
#region 骑行结束,比赛结果展示数据
var results = new List<CompetitionResultModel>();
if (recorderData.IsCompleted || recorderData.Saved)
{
var users1 = userList.Where(d => d.IsCompleted || d.Saved);
if ((users1.Any() && users1.Any(d => mapWorkoutRecordRankings.All(u => u.UserId != d.Id)))
|| mapWorkoutRecordRankings.All(u => u.UserId != recorderData.BelongUserId))
{
var result = ConfigHelper.GameRoomApi.GetDetail(GameRoom.RoomId);
if (result.result)
{
mapWorkoutRecordRankings = result.data.RoomRankingList;
}
}
foreach (var ranking in mapWorkoutRecordRankings)
{
var needUpdate = sort.Where(c => c.UserId == ranking.UserId).FirstOrDefault();
if (needUpdate != null)
{
ranking.WeightKG = needUpdate.KGWeight;
needUpdate.Index = ranking.Rank;
needUpdate.IsCompleted = true;
}
}
}
#endregion
}
}
}
@@ -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,
() =>