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

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 });
}
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);
}

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";
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
private List<ContactInfo> _contactList = new List<ContactInfo>();
private VideoGameManager manager { get; set; }
//Recyclable scroll rect's data source must be assigned in Awake.
private void Awake()
{
InitData();
_recyclableScrollRect.DataSource = this;
manager = FindObjectOfType<VideoGameManager>();
}
private void InitData()
@ -61,6 +64,11 @@ namespace Assets.Scripts.Scenes.VideoRide
timer -= Time.deltaTime;
while (timer < 0)
{
if (manager.CurrentPlayer == null)
return;
var totalDitance = manager.GetMapData().TotalDistance;
var currentDistance = manager.CurrentPlayer.totalDistance % totalDitance;
var currenList = FindObjectsOfType<ListItem>();//当前列表
var list = MapUDPService.GetOnlineUsers(App.RouteIdParam);//最新列表
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();
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.UpdateItem(needUpdate.Name, needUpdate.LastActiveTime.ToShortTimeString(), needUpdate.Id.ToString());
o.UpdateItem(needUpdate.Name,diff.ToString("f0")+"M", needUpdate.Id.ToString());
}
else
{

View File

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

View File

@ -6,6 +6,7 @@ using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.EventSystems;
using DG.Tweening;
using UnityEngine.UI;
namespace Assets.Scripts.Scenes.VideoRide
{
@ -13,27 +14,48 @@ namespace Assets.Scripts.Scenes.VideoRide
{
GameObject Hide { get; set; }
GameObject Show { get; set; }
GameObject Month { get; set; }
GameObject Week { get; set; }
GameObject Day { 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 void Start()
{
Hide = transform.Find("Head/Hide").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>();
UIManager.AddEvent(Hide, UnityEngine.EventSystems.EventTriggerType.PointerClick, Hidehandler);
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)
{
var prefab = Resources.Load<GameObject>("UI/Prefab/AR/RankingItem");
Container.DestroyChildren();
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>();
itemScript.SetName(item.NickName);
var texture = manager.GetCountryImageByCode(item.CountryCode);
@ -64,5 +86,26 @@ namespace Assets.Scripts.Scenes.VideoRide
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 UnityEngine.EventSystems;
using UnityEngine.Events;
using Helper = Assets.Scenes.Ride.Scripts.Helper;
namespace Assets.Scripts.Scenes.VideoRide
{
@ -63,13 +64,14 @@ namespace Assets.Scripts.Scenes.VideoRide
base.Awake();
#if UNITY_EDITOR
App.RouteIdParam = 12353;
#endif
mediaPlayer = FindObjectOfType<MediaPlayer>();
//自动登录
if (App.CurrentUser == null)
{
Login();
UIManager.InitNow();//重置当前时间
}
#endif
mediaPlayer = FindObjectOfType<MediaPlayer>();
DeviceCache.Init(PFConstants.DeviceCacheFolder);
var check = CheckAnt();//初始化蓝牙设备
recordId = Guid.NewGuid().ToString();
@ -80,7 +82,9 @@ namespace Assets.Scripts.Scenes.VideoRide
void Start()
{
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;
//获取路书
GetMapRoute();
@ -127,11 +131,11 @@ namespace Assets.Scripts.Scenes.VideoRide
}
}
MapRouteRankingList rankingList;
public MapRouteRankingList GetRankingList()
public MapRouteRankingList GetRankingList(string type = "month")
{
if (rankingList != null)
return rankingList;
var list = ConfigHelper.mapApi.GetRouteRanking(App.RouteIdParam, "1", 0, 10, "");
var endTime = UIManager.Now.GetDateTime();
var startTime = Helper.GetStartTime(endTime, type);
var list = ConfigHelper.mapApi.GetRouteRanking(App.RouteIdParam, "1", 0, 10, "", startTime,endTime);
if (list.result)
{
rankingList = list.data;
@ -185,7 +189,7 @@ namespace Assets.Scripts.Scenes.VideoRide
else
{
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 online = obj.GetComponent<OnlineVideoPlayer>();
@ -306,6 +310,7 @@ namespace Assets.Scripts.Scenes.VideoRide
//设置骑行模式
public void SetCyclingModel(CyclingModel mode)
{
startTime = UIManager.Now.GetDateTime();
this.cyclingModel = mode;
switch (cyclingModel)
{
@ -406,6 +411,7 @@ namespace Assets.Scripts.Scenes.VideoRide
var currentFrame = GetCurrentFrame();
var frames = mediaPlayer.Info.GetMaxFrameNumber(); //视频打开后生效
var TotalDistance = route?.TotalDistance ?? 0;
TotalDistance *= 1000;
distance %= TotalDistance;
var offset = TotalDistance > 0 ? Convert.ToInt32(frames / TotalDistance * distance) : 0;
return currentFrame + offset;

View File

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

View File

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

View File

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