多人动画位移计算和动画帧数偏差公式调整

This commit is contained in:
lishuo 2022-04-06 19:27:45 +08:00
parent efdc95ed3d
commit d938a0c8be
10 changed files with 2555 additions and 2156 deletions

File diff suppressed because it is too large Load Diff

View File

@ -167,9 +167,9 @@ namespace Assets.Scripts.Apis
return await PostAsync<JsonResult<object>>("/MapRecord/Delete", new { id }); return await PostAsync<JsonResult<object>>("/MapRecord/Delete", new { id });
} }
public JsonResult<MapRouteRankingList> GetRouteRanking(int id,string type, int pageIndex,int pageSize,string name) public JsonResult<MapRouteRankingList> GetRouteRanking(int id,string type, int pageIndex,int pageSize,string name,DateTime? startTime=null,DateTime? endTime = null)
{ {
var url = $"Map/v1/GetRouteRanking?pageIndex={ pageIndex }&pageSize={ pageSize }&name={ name }&id={ id }&type={ type }&filterSelf={ false }"; var url = $"Map/v1/GetRouteRanking?pageIndex={ pageIndex }&pageSize={ pageSize }&name={ name }&id={ id }&type={ type }&filterSelf={ false }&startTime={ startTime }&endTime={ endTime }";
return Get<JsonResult<MapRouteRankingList>>(url); return Get<JsonResult<MapRouteRankingList>>(url);
} }

View File

@ -445,5 +445,33 @@ namespace Assets.Scenes.Ride.Scripts
var url = $"https://api.mapbox.com/styles/v1/juzetest/ckmkdjwsa1nvt17nr1ps4fqgs/static/path-4+fff-1({encodeline})/auto/1280x768?access_token={App.MapBoxAccessToken}&padding=200&pitch=30"; var url = $"https://api.mapbox.com/styles/v1/juzetest/ckmkdjwsa1nvt17nr1ps4fqgs/static/path-4+fff-1({encodeline})/auto/1280x768?access_token={App.MapBoxAccessToken}&padding=200&pitch=30";
return url; return url;
} }
/// <summary>
/// 获取日 周 月第一天
/// </summary>
/// <param name="now">截止日期</param>
/// <param name="type">日day周:week月:month</param>
/// <returns></returns>
public static DateTime GetStartTime(DateTime now,string type = "month")
{
//日
DateTime startTime = new DateTime(now.Year,now.Month,now.Day);
if (type.Equals("week"))
{
//周
var week = now.DayOfWeek;
for (int i = 0; i < 7; i++)
{
startTime = now.AddDays(-i);
if (startTime.DayOfWeek != week)
break;
}
}
if (type.Equals("month"))
{
//月
startTime = new DateTime(now.Year, now.Month, 1);
}
return startTime;
}
} }
} }

View File

@ -33,11 +33,14 @@ namespace Assets.Scripts.Scenes.VideoRide
//Dummy data List //Dummy data List
private List<ContactInfo> _contactList = new List<ContactInfo>(); private List<ContactInfo> _contactList = new List<ContactInfo>();
private VideoGameManager manager { get; set; }
//Recyclable scroll rect's data source must be assigned in Awake. //Recyclable scroll rect's data source must be assigned in Awake.
private void Awake() private void Awake()
{ {
InitData(); InitData();
_recyclableScrollRect.DataSource = this; _recyclableScrollRect.DataSource = this;
manager = FindObjectOfType<VideoGameManager>();
} }
private void InitData() private void InitData()
@ -61,6 +64,11 @@ namespace Assets.Scripts.Scenes.VideoRide
timer -= Time.deltaTime; timer -= Time.deltaTime;
while (timer < 0) while (timer < 0)
{ {
if (manager.CurrentPlayer == null)
return;
var totalDitance = manager.GetMapData().TotalDistance;
var currentDistance = manager.CurrentPlayer.totalDistance % totalDitance;
var currenList = FindObjectsOfType<ListItem>();//当前列表 var currenList = FindObjectsOfType<ListItem>();//当前列表
var list = MapUDPService.GetOnlineUsers(App.RouteIdParam);//最新列表 var list = MapUDPService.GetOnlineUsers(App.RouteIdParam);//最新列表
foreach (ListItem o in currenList) foreach (ListItem o in currenList)
@ -68,8 +76,11 @@ namespace Assets.Scripts.Scenes.VideoRide
var needUpdate = list.Where(c => c.Id.ToString() == o.Id).FirstOrDefault(); var needUpdate = list.Where(c => c.Id.ToString() == o.Id).FirstOrDefault();
if (needUpdate != null) if (needUpdate != null)
{ {
var left = (needUpdate.EndDistance % totalDitance - currentDistance) * 1000;
var right = (needUpdate.EndDistance % totalDitance - totalDitance - currentDistance) * 1000;
var diff = Math.Abs(left) > Math.Abs(right) ? right : left;
o.gameObject.SetActive(true); o.gameObject.SetActive(true);
o.UpdateItem(needUpdate.Name, needUpdate.LastActiveTime.ToShortTimeString(), needUpdate.Id.ToString()); o.UpdateItem(needUpdate.Name,diff.ToString("f0")+"M", needUpdate.Id.ToString());
} }
else else
{ {

View File

@ -11,6 +11,7 @@ namespace Assets.Scripts.Scenes.VideoRide
public class OnlineVideoPlayer : AbstractVideoPlayer public class OnlineVideoPlayer : AbstractVideoPlayer
{ {
public double diff; public double diff;
public int frames;
protected override void Update() protected override void Update()
{ {
base.Update(); base.Update();
@ -26,13 +27,13 @@ namespace Assets.Scripts.Scenes.VideoRide
var left = totalDistance % mapData.TotalDistance; var left = totalDistance % mapData.TotalDistance;
var right = current.totalDistance % mapData.TotalDistance; var right = current.totalDistance % mapData.TotalDistance;
diff = (left - right) * 1000; diff = (left - right) * 1000;
if (Math.Abs(diff) > 100) if (Math.Abs(diff) > 200)
{ {
Destroy(); Destroy();
} }
var z = current.transform.position.z + diff * 0.5; var z = current.transform.position.z + diff * 0.1;
transform.DOMoveZ((float)z, 1f); transform.DOMoveZ((float)z, 1f);
Push(); //Push();
} }
} }
//人物向前超车 右边超车 //人物向前超车 右边超车
@ -81,7 +82,8 @@ namespace Assets.Scripts.Scenes.VideoRide
var mainFrame = manager.GetCurrentFrame(); var mainFrame = manager.GetCurrentFrame();
var min = Math.Min(currentFrame, mainFrame); var min = Math.Min(currentFrame, mainFrame);
var max = Math.Max(currentFrame, mainFrame); var max = Math.Max(currentFrame, mainFrame);
var result = manager.mockDirection.Where(c => c.Start < currentFrame && c.End > currentFrame).FirstOrDefault(); frames = currentFrame;
var result = manager.mockDirection.Where(c => c.Start < min && c.End > max).FirstOrDefault();
bearing = result?.Value ?? 0; bearing = result?.Value ?? 0;
animator.SetFloat("bearing", bearing); animator.SetFloat("bearing", bearing);
} }

View File

@ -6,6 +6,7 @@ using System.Threading.Tasks;
using UnityEngine; using UnityEngine;
using UnityEngine.EventSystems; using UnityEngine.EventSystems;
using DG.Tweening; using DG.Tweening;
using UnityEngine.UI;
namespace Assets.Scripts.Scenes.VideoRide namespace Assets.Scripts.Scenes.VideoRide
{ {
@ -13,27 +14,48 @@ namespace Assets.Scripts.Scenes.VideoRide
{ {
GameObject Hide { get; set; } GameObject Hide { get; set; }
GameObject Show { get; set; } GameObject Show { get; set; }
GameObject Month { get; set; }
GameObject Week { get; set; }
GameObject Day { get; set; }
VideoGameManager manager { get; set; } VideoGameManager manager { get; set; }
Transform Container { get; set; }
Text MonthTxt { get; set; }
Text WeekTxt { get; set; }
Text DayTxt { get; set; }
private bool isAnimating = false; private bool isAnimating = false;
private void Start() private void Start()
{ {
Hide = transform.Find("Head/Hide").gameObject; Hide = transform.Find("Head/Hide").gameObject;
Show = transform.Find("Head/Show").gameObject; Show = transform.Find("Head/Show").gameObject;
Month = transform.Find("Head/Month").gameObject;
Week = transform.Find("Head/Week").gameObject;
Day = transform.Find("Head/Day").gameObject;
MonthTxt = transform.Find("Head/Month/Text").GetComponent<Text>();
MonthTxt.color = Color.red;
WeekTxt = transform.Find("Head/Week/Text").GetComponent<Text>();
DayTxt = transform.Find("Head/Day/Text").GetComponent<Text>();
manager = FindObjectOfType<VideoGameManager>(); manager = FindObjectOfType<VideoGameManager>();
UIManager.AddEvent(Hide, UnityEngine.EventSystems.EventTriggerType.PointerClick, Hidehandler); UIManager.AddEvent(Hide, UnityEngine.EventSystems.EventTriggerType.PointerClick, Hidehandler);
UIManager.AddEvent(Show, UnityEngine.EventSystems.EventTriggerType.PointerClick, Showhandler); UIManager.AddEvent(Show, UnityEngine.EventSystems.EventTriggerType.PointerClick, Showhandler);
Init(); UIManager.AddEvent(Month, UnityEngine.EventSystems.EventTriggerType.PointerClick, MonthClick);
UIManager.AddEvent(Week, UnityEngine.EventSystems.EventTriggerType.PointerClick, WeekClick);
UIManager.AddEvent(Day, UnityEngine.EventSystems.EventTriggerType.PointerClick, DayClick);
Container = transform.Find("List/Viewport/Content");
Month.GetComponent<Text>();
Refresh();
} }
private void Init() private void Refresh(string type = "month")
{ {
var list = manager.GetRankingList(); var list = manager.GetRankingList(type);
if (list != null) if (list != null)
{ {
var prefab = Resources.Load<GameObject>("UI/Prefab/AR/RankingItem"); var prefab = Resources.Load<GameObject>("UI/Prefab/AR/RankingItem");
Container.DestroyChildren();
foreach (var item in list.list) foreach (var item in list.list)
{ {
GameObject newObj = (GameObject)Instantiate(prefab, transform.Find("List/Viewport/Content")); GameObject newObj = (GameObject)Instantiate(prefab, Container);
var itemScript = newObj.GetComponent<RankingItemScript>(); var itemScript = newObj.GetComponent<RankingItemScript>();
itemScript.SetName(item.NickName); itemScript.SetName(item.NickName);
var texture = manager.GetCountryImageByCode(item.CountryCode); var texture = manager.GetCountryImageByCode(item.CountryCode);
@ -64,5 +86,26 @@ namespace Assets.Scripts.Scenes.VideoRide
isAnimating = false; isAnimating = false;
}; };
} }
public void MonthClick(BaseEventData data)
{
MonthTxt.color = Color.red;
WeekTxt.color = Color.white;
DayTxt.color = Color.white;
Refresh("month");
}
public void WeekClick(BaseEventData data)
{
MonthTxt.color = Color.white;
WeekTxt.color = Color.red;
DayTxt.color = Color.white;
Refresh("week");
}
public void DayClick(BaseEventData data)
{
MonthTxt.color = Color.white;
WeekTxt.color = Color.white;
DayTxt.color = Color.red;
Refresh("day");
}
} }
} }

View File

@ -17,6 +17,7 @@ using DG.Tweening;
using Assets.Scenes.Ride.Scripts.Model.RiderModels; using Assets.Scenes.Ride.Scripts.Model.RiderModels;
using UnityEngine.EventSystems; using UnityEngine.EventSystems;
using UnityEngine.Events; using UnityEngine.Events;
using Helper = Assets.Scenes.Ride.Scripts.Helper;
namespace Assets.Scripts.Scenes.VideoRide namespace Assets.Scripts.Scenes.VideoRide
{ {
@ -63,13 +64,14 @@ namespace Assets.Scripts.Scenes.VideoRide
base.Awake(); base.Awake();
#if UNITY_EDITOR #if UNITY_EDITOR
App.RouteIdParam = 12353; App.RouteIdParam = 12353;
#endif
mediaPlayer = FindObjectOfType<MediaPlayer>();
//自动登录 //自动登录
if (App.CurrentUser == null) if (App.CurrentUser == null)
{ {
Login(); Login();
UIManager.InitNow();//重置当前时间
} }
#endif
mediaPlayer = FindObjectOfType<MediaPlayer>();
DeviceCache.Init(PFConstants.DeviceCacheFolder); DeviceCache.Init(PFConstants.DeviceCacheFolder);
var check = CheckAnt();//初始化蓝牙设备 var check = CheckAnt();//初始化蓝牙设备
recordId = Guid.NewGuid().ToString(); recordId = Guid.NewGuid().ToString();
@ -80,7 +82,9 @@ namespace Assets.Scripts.Scenes.VideoRide
void Start() void Start()
{ {
InitSlots(); InitSlots();
startTime = DateTime.Now;//UIManager.Now.GetDateTime();
UIManager.Instance.MainPanel = GetCanvasTransform().GetComponent<PFUIPanel>();
UIManager.Instance.ModalsPanel = this.transform.Find("Canvas/ModalPanel").GetComponent<PFUIPanel>();
var routeId = App.RouteIdParam; var routeId = App.RouteIdParam;
//获取路书 //获取路书
GetMapRoute(); GetMapRoute();
@ -127,11 +131,11 @@ namespace Assets.Scripts.Scenes.VideoRide
} }
} }
MapRouteRankingList rankingList; MapRouteRankingList rankingList;
public MapRouteRankingList GetRankingList() public MapRouteRankingList GetRankingList(string type = "month")
{ {
if (rankingList != null) var endTime = UIManager.Now.GetDateTime();
return rankingList; var startTime = Helper.GetStartTime(endTime, type);
var list = ConfigHelper.mapApi.GetRouteRanking(App.RouteIdParam, "1", 0, 10, ""); var list = ConfigHelper.mapApi.GetRouteRanking(App.RouteIdParam, "1", 0, 10, "", startTime,endTime);
if (list.result) if (list.result)
{ {
rankingList = list.data; rankingList = list.data;
@ -185,7 +189,7 @@ namespace Assets.Scripts.Scenes.VideoRide
else else
{ {
var diff = item.EndDistance % mapData.TotalDistance - CurrentPlayer.totalDistance % mapData.TotalDistance; var diff = item.EndDistance % mapData.TotalDistance - CurrentPlayer.totalDistance % mapData.TotalDistance;
if (Math.Abs(diff*1000) < 100) if (Math.Abs(diff*1000) < 200)
{ {
var obj = Instantiate(OnlinePlayer, transform); var obj = Instantiate(OnlinePlayer, transform);
var online = obj.GetComponent<OnlineVideoPlayer>(); var online = obj.GetComponent<OnlineVideoPlayer>();
@ -306,6 +310,7 @@ namespace Assets.Scripts.Scenes.VideoRide
//设置骑行模式 //设置骑行模式
public void SetCyclingModel(CyclingModel mode) public void SetCyclingModel(CyclingModel mode)
{ {
startTime = UIManager.Now.GetDateTime();
this.cyclingModel = mode; this.cyclingModel = mode;
switch (cyclingModel) switch (cyclingModel)
{ {
@ -406,6 +411,7 @@ namespace Assets.Scripts.Scenes.VideoRide
var currentFrame = GetCurrentFrame(); var currentFrame = GetCurrentFrame();
var frames = mediaPlayer.Info.GetMaxFrameNumber(); //视频打开后生效 var frames = mediaPlayer.Info.GetMaxFrameNumber(); //视频打开后生效
var TotalDistance = route?.TotalDistance ?? 0; var TotalDistance = route?.TotalDistance ?? 0;
TotalDistance *= 1000;
distance %= TotalDistance; distance %= TotalDistance;
var offset = TotalDistance > 0 ? Convert.ToInt32(frames / TotalDistance * distance) : 0; var offset = TotalDistance > 0 ? Convert.ToInt32(frames / TotalDistance * distance) : 0;
return currentFrame + offset; return currentFrame + offset;

View File

@ -51,7 +51,7 @@ namespace Assets.Scripts.Scenes.VideoRide
power = manager.UpdatePower(); power = manager.UpdatePower();
cadance = manager.UpdateCadence(); cadance = manager.UpdateCadence();
#if UNITY_EDITOR #if UNITY_EDITOR
power = 1200; power = 350;
cadance = 150; cadance = 150;
heartRate = 160; heartRate = 160;
#endif #endif

View File

@ -68,6 +68,7 @@ namespace Assets.Scripts.Scenes.VideoRide
{ {
if (manager != null) if (manager != null)
{ {
mapName.text = manager.GetMapRoute().Name; mapName.text = manager.GetMapRoute().Name;
infoText.text = $"帧数:{manager.GetCurrentFrame()}"; infoText.text = $"帧数:{manager.GetCurrentFrame()}";
if (manager.CurrentPlayer != null) if (manager.CurrentPlayer != null)
@ -147,7 +148,7 @@ namespace Assets.Scripts.Scenes.VideoRide
private void SetSlopePanel() private void SetSlopePanel()
{ {
var normalizedSlope = (float)Math.Round(manager.CurrentPlayer.currentSlope, 1); var normalizedSlope = (float)Math.Round(manager.CurrentPlayer.currentSlope, 1);
slope.text = normalizedSlope.ToString(); slope.text = normalizedSlope > 0 ? "+"+normalizedSlope.ToString():normalizedSlope.ToString();
var strength = 3;//增强旋转角度系数 var strength = 3;//增强旋转角度系数
if (normalizedSlope > 10) { if (normalizedSlope > 10) {
normalizedSlope = 10f; normalizedSlope = 10f;
@ -198,8 +199,8 @@ namespace Assets.Scripts.Scenes.VideoRide
var cameraImage = changeViewBtn.transform.Find("Camera").gameObject; var cameraImage = changeViewBtn.transform.Find("Camera").gameObject;
if (_viewMode == ViewMode.FIRST) if (_viewMode == ViewMode.FIRST)
{ {
currentPlayer.DOMoveZ(-0.1f, 0f); currentPlayer.DOMoveZ(-0.09f, 0f);
currentPlayer.DOMoveY(-1.1f, 0f); currentPlayer.DOMoveY(-0.85f, 0f);
ftpPanel.SetActive(true); ftpPanel.SetActive(true);
nearByScript.Hidehandler(null); nearByScript.Hidehandler(null);
rankingScript.Hidehandler(null); rankingScript.Hidehandler(null);

View File

@ -23,7 +23,8 @@ namespace Assets.Scripts.UI.Control
Normal, Normal,
Border, Border,
Primary, Primary,
Image Image,
Transparent
} }
[SerializeField] Type mType; [SerializeField] Type mType;
@ -121,6 +122,11 @@ namespace Assets.Scripts.UI.Control
image.color = ConvertColor("#F93086"); image.color = ConvertColor("#F93086");
} }
break; break;
case Type.Transparent:
{
image.color = Color.clear;
}
break;
default: default:
break; break;
} }