AR骑行动画&换装基本交互逻辑

This commit is contained in:
lishuo committed 2022-04-15 18:14:55 +08:00
1 parent d938a0c8be
commit 995aef63f8
117 files changed
+60802 -2718

No files matched your search

@@ -3,6 +3,7 @@ using Assets.Scripts.Apis.Models;
using DG.Tweening;
using Mapbox.Utils;
using System;
using System.Collections;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
@@ -44,9 +45,12 @@ namespace Assets.Scripts.Scenes.VideoRide
protected RaycastHit hit;
float timer = 1f;
protected bool start = true;
protected Sequence sequence;
protected VideoGameManager manager { get; set; }
Camera camera;
float currenPlayerHeight;
Transform bone_bottle_2 { get; set; }
protected virtual void Start()
{
@@ -63,6 +67,8 @@ namespace Assets.Scripts.Scenes.VideoRide
animator.Play("idle");
}
camera = Camera.main;
//bone_bottle_2
bone_bottle_2 = transform.Find("bone_cable_20");
}
protected virtual void Update()
@@ -70,13 +76,13 @@ namespace Assets.Scripts.Scenes.VideoRide
timer -= Time.deltaTime;
ComputeAnimator();//控制动画
CreateHeadImage();
while (timer <= 0)
{
try
{
ComputeNextSlope();//计算下一个坡度
ComputePlayer();//计算人物属性
//animator.Play("touchHead");
if (manager.IsStart())
{
ticks++;
@@ -102,50 +108,26 @@ namespace Assets.Scripts.Scenes.VideoRide
//人物碰撞
void OnCollisionEnter(Collision collision)
{
//manager.GetSlotIndex();
}
void RayCastHit()
{
//获取player的position信息
Vector3 pos = transform.position;
//射线碰撞物信息接收
//第二种写法
//我们可以先创建出一条射线
Ray ray = new Ray(pos, new Vector3(0, 0, 1));
//然后用这条射线去做射线检测
//射线,输出碰撞体信息,射线长度,射线在那一层检测,射线不忽略开启触发器(istrigger)的碰撞体
isHit = Physics.Raycast(ray, out hit, 1f, 1 << 0, QueryTriggerInteraction.Collide);
if (isHit)
{
print(hit.collider.name);
}
}
protected void ComputeRandom()
{
var offset = 30;
if (ticks % 6 == 0)
transform.DOMoveZ(transform.position.z - 1.1f*offset, 1f);
if (ticks % 5 == 0)
transform.DOMoveZ(transform.position.z + offset, 2f);
//人物的rotation y
transform.DOLocalRotate(new Vector3(0f, bearing, 0f), 1f);
}
//动画状态机
protected virtual void ComputeAnimator()
{
if (animator != null)
{
animator.SetFloat("preSpeed", (float)preSpeed);
animator.SetFloat("speed", (float)speed);
animator.SetFloat("grade", (float)currentSlope);
animator.SetFloat("power", (float)power);
var headBack = ticks % 10 == 0 && speed > 0 && bearing == 0;
var drink = ticks % 15 == 0 && speed > 0 && bearing == 0;
animator.SetBool("headBack", headBack);
animator.SetBool("drinking", drink);
}
}
protected virtual int GetCurrentFrame()
@@ -153,9 +135,9 @@ namespace Assets.Scripts.Scenes.VideoRide
return manager.GetCurrentFrame();
}
private bool animated = false;
//大转弯是60度
private int offset = 0;
protected virtual void Turn()
private float offset = 0;
//控制角色进行向左或向右
protected virtual void Turn()
{
var currentFrame = GetCurrentFrame();
var result = manager.mockDirection.Where(c => c.Start < currentFrame && c.End > currentFrame).FirstOrDefault();
@@ -163,36 +145,55 @@ namespace Assets.Scripts.Scenes.VideoRide
{
bearing = result.Value;
}
else
{
bearing = 0;
}
animator.SetFloat("bearing", bearing);
if (Math.Abs(bearing) > 50)
var headBack = ticks % 60 == 0 && speed > 0 && bearing == 0;
var drink = ticks % 125 == 0 && speed > 0 && bearing == 0;
animator.SetBool("headBack", headBack);
animator.SetBool("drinking", drink);
var waiting = ratio == 0 ? 1 : 1 / ratio;
if (Math.Abs(bearing) > 30)
{
if (!animated)
{
animated = true;
transform.DOMoveX(transform.position.x + 3, 1).onComplete += () =>
var tween = transform.DORotate(new Vector3(0, bearing, -bearing/5), waiting);
tween.onComplete += () =>
{
offset = -3;
var zoffset = bearing / 10.5f;
var doMoveX = transform.DOMoveX(transform.position.x + zoffset, waiting);
doMoveX.onComplete += () =>
{
offset = -zoffset;
};
};
print(176);
tween.SetEase(Ease.InOutSine).SetLoops(2, LoopType.Incremental);
}
}
else
else
{
if (offset != 0)
{
transform.DOMoveX(transform.position.x + offset, 1f).onComplete += () =>
var cpoffset = offset;
transform.DORotate(new Vector3(0, bearing, 0), 1.2f * waiting).onComplete += () =>
{
animated = false;
transform.DOMoveX(transform.position.x + cpoffset, 1.2f * waiting).onComplete += () =>
{
animated = false;
};
};
offset = 0;
}
}
transform.DORotate(new Vector3(0, bearing, 0), 1f);
//var aniInfo = animator.GetCurrentAnimatorStateInfo(0);
//if (aniInfo.loop)
//{
else
{
transform.DORotate(new Vector3(0, bearing, -bearing), waiting);
}
//}
}
}
//计算人物当前属性
protected virtual void ComputePlayer()
@@ -226,17 +227,35 @@ namespace Assets.Scripts.Scenes.VideoRide
distance = Math.Round(speed / 3600, 5, MidpointRounding.AwayFromZero);
totalDistance += distance;
currentlatLon = manager.Along(totalDistance % mapData.TotalDistance);
////根据人物速度设置人物距离摄像头远近
//if (speed > 20 && speed < 30)
//{
// transform.DOMoveZ(3, 1f);
//}
//else if (speed > 30 && speed < 40)
//{
// transform.DOMoveZ(3.5f, 1f);
//}
//else if (speed > 40)
//{
// transform.DOMoveZ(4, 1f);
//}
//else
//{
// transform.DOMoveZ(3, 1f);
//}
}
catch (Exception e)
{
Debug.LogError(e);
}
}
protected float ratio = 1;
protected virtual void ComputeVideo()
{
mapData = manager.GetMapData();
float ratio = 1;
if (currentIndex + 1 < mapData.List.Count)
{
ratio = (float)(speed / mapData.List[currentIndex + 1].Speed);
@@ -247,8 +266,22 @@ namespace Assets.Scripts.Scenes.VideoRide
}
if (manager.CurrentPlayer != null && manager.CurrentPlayer.UserId != UserId)
return;
if (ratio > 1)
{
ratio = Math.Min(ratio, 1.2f);
}
if (ratio < 1)
{
ratio = Math.Max(ratio, 0.6f);
}
var info = animator.GetCurrentAnimatorClipInfo(0);
var currentClip = info.FirstOrDefault();
if (currentClip.clip != null && currentClip.clip.isLooping)
{
animator.speed = ratio;
}
manager.Play(ratio);
}
protected virtual void ComputeRecord() { }
@@ -318,7 +351,7 @@ namespace Assets.Scripts.Scenes.VideoRide
if (head != null)
{
//它们的乘积就是高度
Vector3 worldPosition = new Vector3(transform.position.x, transform.position.y+1.5f, transform.position.z);
Vector3 worldPosition = new Vector3(bone_bottle_2.position.x, bone_bottle_2.position.y+0.8f, bone_bottle_2.position.z);
var playerScreenPos = Camera.main.WorldToScreenPoint(worldPosition);
head.transform.position = playerScreenPos;
ftpImage.fillAmount = (float)(wkg / 6);
@@ -67,15 +67,26 @@ namespace Assets.Scripts.Scenes.VideoRide
{
var players = manager.cyclingController.riders;
var headList = FindObjectsOfType<HeadScript>();
var videoPlayer = manager.CurrentPlayer;
foreach (var item in players)
{
BarChart barChart = GetComponent<BarChart>();
Vector3 vector3 = Vector3.back;
var currentIndex = Math.Round(item.EndDistance / manager.mapRoute.Distance * manager.GetMapData().List.Count);
var distance = item.EndDistance % manager.mapRoute.Distance;
var currentIndex = Math.Round(distance / manager.mapRoute.Distance * manager.GetMapData().List.Count);
barChart.GetBarTrackPosition($"Player {currentIndex}", "Group 1", out vector3);
var currentHead = headList.Where(c => c.UserId == item.UserId).FirstOrDefault();
if (videoPlayer != null)
{
var diff = distance - videoPlayer.totalDistance % manager.mapRoute.Distance;
if (diff < 0)
{
vector3.y = -800f;
}
}
if (currentHead == null)
{
var onlineHead = Instantiate(headPanel, transform);
@@ -87,6 +98,18 @@ namespace Assets.Scripts.Scenes.VideoRide
currentHead.transform.position = vector3;
}
}
//删除离线的人
foreach (var item in headList)
{
if (item.UserId != 0)
{
var player = players.Where(c => c.UserId == item.UserId).FirstOrDefault();
if (player == null)
{
item.gameObject.Destroy();
}
}
}
}
private ChartDynamicMaterial getChartMaterial(double grade = 0d)
@@ -15,7 +15,7 @@ namespace Assets.Scripts.Scenes.VideoRide
private void Update()
{
flag += Time.deltaTime;
if (flag >= 1f)
if (flag >= 0.5f)
{
alph -= Time.deltaTime;
if (alph <= 0)
@@ -56,7 +56,7 @@ namespace Assets.Scripts.Scenes.VideoRide
trail.startColor = new Color(0.9764706f, 0.1882353f, 0.5254902f, 1f);
trail.endColor = new Color(0.9764706f, 0.1882353f, 0.5254902f, 1f);
}
float timer = 0;
private void Update()
{
if (cyclingCotroller.CurrentPlayer != null)
@@ -70,42 +70,8 @@ namespace Assets.Scripts.Scenes.VideoRide
((RectTransform)tr.transform).anchoredPosition = new Vector2((vp2.x * RectRoot.sizeDelta.x) - (RectRoot.sizeDelta.x * 0.5f), (vp2.y * RectRoot.sizeDelta.y) - (RectRoot.sizeDelta.y * 0.5f));
trail.enabled = cyclingCotroller.CurrentPlayer.power > 0;
}
timer += Time.deltaTime;
while (timer >= 1)
{
//CreateMiniPath();
timer = 0;
}
}
void CreateMiniPath()
{
if (cyclingCotroller.CurrentPlayer == null)
return;
var dat = new List<Vector3>();
var mapData = cyclingCotroller.GetMapData();
if (mapData != null)
{
var count = mapData.List.Count;
var interval = Math.Max(Math.Ceiling(count / 100D), 1f);
for (int i = 0; i < mapData.List.Count; i++)
{
if (i % interval == 0)
{
var point = mapData.List[i].Point;
Vector3 item = _map.GeoToWorldPosition(new Vector2d(point[0], point[1]));
item.y += 5f;
if (cyclingCotroller.CurrentPlayer.currentIndex >= i)
{
dat.Add(item);
}
}
}
var feat = new VectorFeatureUnity();
feat.Points.Add(dat);
CreateRedLineRender(feat);//创建小地图路线
}
}
private bool init = false;
private void _map_OnInitialized()
+4 -1
View File
@@ -28,7 +28,10 @@ namespace Assets.Scripts.Scenes.VideoRide
private void Start()
{
manager = FindObjectOfType<VideoGameManager>();
GetComponent<Button>().onClick.AddListener(ButtonListener);
if (manager._aRMode == VideoGameManager.ARMode.INSPECT)
{
GetComponent<Button>().onClick.AddListener(ButtonListener);
}
}
private float timer = 1f;
private void Update()
@@ -47,18 +47,18 @@ namespace Assets.Scripts.Scenes.VideoRide
{
if (_contactList != null) _contactList.Clear();
var list = MapUDPService.GetOnlineUsers(App.RouteIdParam);
int index = 0;
list = list.Where(c => c.Id != App.CurrentUser.Id).ToList();
foreach (var item in list)
{
_isInit = true;
ContactInfo obj = new ContactInfo();
obj.Name = item.Name;
obj.Gender = DateTime.Now.Millisecond.ToString();
obj.Gender = "";
obj.id = item.Id.ToString();
_contactList.Add(obj);
}
}
float timer = 0.5f;
float timer = 1f;
private void Update()
{
timer -= Time.deltaTime;
@@ -67,27 +67,11 @@ namespace Assets.Scripts.Scenes.VideoRide
if (manager.CurrentPlayer == null)
return;
var totalDitance = manager.GetMapData().TotalDistance;
var currentDistance = manager.CurrentPlayer.totalDistance % totalDitance;
var currentDistance = manager.CurrentPlayer.totalDistance;
var currenList = FindObjectsOfType<ListItem>();//当前列表
var list = MapUDPService.GetOnlineUsers(App.RouteIdParam);//最新列表
foreach (ListItem o in currenList)
{
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,diff.ToString("f0")+"M", needUpdate.Id.ToString());
}
else
{
o.gameObject.SetActive(false);
}
}
list = list.Where(c => c.Id != App.CurrentUser.Id).ToList();
if (currenList.Count() == 0 && list.Count() > 0)
{
InitData();
@@ -96,7 +80,28 @@ namespace Assets.Scripts.Scenes.VideoRide
_recyclableScrollRect.ReloadData();
}
}
timer += 0.5f;
//var currenList = FindObjectsOfType<ListItem>();//当前列表
//var list = MapUDPService.GetOnlineUsers(App.RouteIdParam);//最新列表
var currentPlayer = FindObjectOfType<VideoPlayer>();
foreach (ListItem o in currenList)
{
if (currentPlayer.UserId.ToString() == o.Id)
continue;
var needUpdate = list.Where(c => c.Id.ToString() == o.Id).FirstOrDefault();
if (needUpdate != null)
{
var left = Math.Round((needUpdate.EndDistance - manager.CurrentPlayer.totalDistance) * 1000);
//var right = (needUpdate.EndDistance % totalDitance - totalDitance - currentDistance) * 1000;
//var diff = Math.Abs(left) > Math.Abs(right) ? right : left;
o.UpdateItem(needUpdate.Name, left.ToString() + "M", needUpdate.Id.ToString());
//o.gameObject.SetActive(true);
}
else
{
//o.gameObject.SetActive(false);
}
}
timer +=1f;
}
}
@@ -20,70 +20,73 @@ namespace Assets.Scripts.Scenes.VideoRide
//计算
protected override void ComputePlayer()
{
base.ComputePlayer();
var current = manager.CurrentPlayer;
if (current != null && current.UserId != UserId)
{
var left = totalDistance % mapData.TotalDistance;
var right = current.totalDistance % mapData.TotalDistance;
diff = (left - right) * 1000;
if (Math.Abs(diff) > 200)
if (Math.Abs(diff) > 50)
{
Destroy();
}
var z = current.transform.position.z + diff * 0.1;
transform.DOMoveZ((float)z, 1f);
//Push();
}
}
//人物向前超车 右边超车
private void Push()
protected override void Turn()
{
try
{
var offsetX = 1f;
var currentPlayer = FindObjectOfType<VideoPlayer>();
//根据差距动态位移
var current = currentPlayer.transform.position;
var x = current.x + offsetX;
var z = current.z + diff;
var y = current.y;
var end = new Vector3(x, y, (float)z);
//前方有人
if (isHit)
{
var onlinePlayer = hit.collider.transform.GetComponent<AbstractVideoPlayer>();
if (distance - onlinePlayer.distance > 20)
{
var prePos = onlinePlayer.transform.position;
var disx = prePos.x + offsetX;
var disz = prePos.z + diff;
var disy = prePos.y;
end = new Vector3(disx, (float)disz, disy);
animator.Play("turnRight");
transform.DOMove(end, 1f);
}
}
else
{
transform.DOMoveZ((float)z, 1f);
}
}
catch (Exception e) {
print(e.Message);
}
base.Turn();
var current = manager.CurrentPlayer;
var z = current.transform.position.z + diff * 0.5f;
transform.DOMoveZ((float)z, 1f);
//x轴位移
//z轴位移
//人物转向
//try
//{
// var offsetX = 1f;
// var current = manager.CurrentPlayer;
// var z = current.transform.position.z + diff * 0.5f;
// //前方有人
// if (isHit)
// {
// var onlinePlayer = hit.collider.transform.GetComponent<AbstractVideoPlayer>();
// if (distance - onlinePlayer.distance > 20)
// {
// var prePos = onlinePlayer.transform.position;
// var disx = prePos.x + offsetX;
// var disz = prePos.z + diff;
// var disy = prePos.y;
// var end = new Vector3(disx, (float)disz, disy);
// animator.Play("turnRight");
// transform.DOMove(end, 1f);
// }
// }
// else
// {
// transform.DOMoveZ((float)z, 1f);
// }
//}
//catch (Exception e) {
// print(e.Message);
//}
}
protected override void ComputeAnimator()
{
base.ComputeAnimator();
if (manager.CurrentPlayer == null || manager.CurrentPlayer.UserId != UserId)
{
var currentFrame = manager.GetFrameOffSet(diff);
//var currentFrame = manager.GetFrameOffSet(diff);
var mainFrame = manager.GetCurrentFrame();
var min = Math.Min(currentFrame, mainFrame);
var max = Math.Max(currentFrame, mainFrame);
frames = currentFrame;
var result = manager.mockDirection.Where(c => c.Start < min && c.End > max).FirstOrDefault();
var currentFrame = mainFrame + diff * 10;
//var min = Math.Min(currentFrame, mainFrame);
//var max = Math.Max(currentFrame, mainFrame);
frames = (int)currentFrame;
var result = manager.mockDirection.Where(c => c.Start < frames && c.End > frames).FirstOrDefault();
bearing = result?.Value ?? 0;
animator.SetFloat("bearing", bearing);
}
@@ -97,7 +100,7 @@ namespace Assets.Scripts.Scenes.VideoRide
}
protected override int GetCurrentFrame()
{
return manager.DistanceToFrames(diff) + manager.GetCurrentFrame();
return (int)(diff * 10) + manager.GetCurrentFrame();
}
protected override void ComputeVideo()
{
@@ -105,15 +108,16 @@ namespace Assets.Scripts.Scenes.VideoRide
}
//设置当前玩家属性
public void SetPlayer(string name,double totalDistance, double cadance,double heartRate, double wkg, int userId)
public void SetPlayer(string name, double distance, double totalDistance, double cadance,double heartRate, double wkg, int userId,double power)
{
this.wkg = 2.3d;
this.wkg = wkg;
this.UserName = name;
this.cadance = cadance;
this.totalDistance = totalDistance;
this.heartRate = (int?)heartRate;
this.UserId = userId;
this.power = 200;
this.power = power;
this.speed = distance * 3600;
}
}
}
@@ -152,9 +152,10 @@ namespace Assets.Scripts.Scenes.VideoRide
var currentPlayer = list.FirstOrDefault();
if (currentPlayer != null)
{
var onlineRider = currentPlayer as OnlineRiderModel;
var obj = Instantiate(OnlinePlayer, transform);
var online = obj.GetComponent<OnlineVideoPlayer>();
online.SetPlayer(currentPlayer.NickName, currentPlayer.EndDistance, currentPlayer.Cadence, currentPlayer.HeartRate, currentPlayer.TotalTicks, currentPlayer.UserId);
online.SetPlayer(onlineRider.NickName, onlineRider.EndDistance-onlineRider.PreDistance, onlineRider.EndDistance, onlineRider.Cadence, onlineRider.HeartRate, onlineRider.TotalTicks, onlineRider.UserId, onlineRider.Power);
obj.transform.DOMoveX(0, 1);
ChangePlayer(currentPlayer.UserId);
CurrentPlayer = online;
@@ -184,16 +185,17 @@ namespace Assets.Scripts.Scenes.VideoRide
if (exsit != null)
{
var online = exsit.GetComponent<OnlineVideoPlayer>();
online.SetPlayer(onlineRider.NickName,onlineRider.EndDistance, item.Cadence, item.HeartRate, onlineRider.WeightKg, item.UserId);
online.SetPlayer(onlineRider.NickName, onlineRider.EndDistance - onlineRider.PreDistance, onlineRider.EndDistance, item.Cadence, item.HeartRate, onlineRider.WeightKg, item.UserId, onlineRider.Power);
}
else
{
var diff = item.EndDistance % mapData.TotalDistance - CurrentPlayer.totalDistance % mapData.TotalDistance;
if (Math.Abs(diff*1000) < 200)
if (Math.Abs(diff*1000) <= 50)
{
var obj = Instantiate(OnlinePlayer, transform);
var online = obj.GetComponent<OnlineVideoPlayer>();
online.SetPlayer(onlineRider.NickName, onlineRider.EndDistance, item.Cadence, item.HeartRate, onlineRider.WeightKg, item.UserId);
online.SetPlayer(onlineRider.NickName, onlineRider.EndDistance - onlineRider.PreDistance, onlineRider.EndDistance, item.Cadence, item.HeartRate, onlineRider.WeightKg, item.UserId, onlineRider.Power);
obj.transform.DOMoveX(slots[currentOnlineCount], 1);
currentOnlineCount++;
}
@@ -237,12 +239,13 @@ namespace Assets.Scripts.Scenes.VideoRide
else
{
var onlineRiders = cyclingController.riders;
var onlineRider = onlineRiders.Where(c => c.UserId == userId).FirstOrDefault();
if (onlineRider != null)
var currentPlayer = onlineRiders.Where(c => c.UserId == userId).FirstOrDefault();
if (currentPlayer != null)
{
var onlineRider = currentPlayer as OnlineRiderModel;
var obj = Instantiate(OnlinePlayer, transform);
var online = obj.GetComponent<OnlineVideoPlayer>();
online.SetPlayer(onlineRider.NickName, onlineRider.EndDistance, onlineRider.Cadence, onlineRider.HeartRate, 0, onlineRider.UserId);
online.SetPlayer(onlineRider.NickName, onlineRider.EndDistance-onlineRider.PreDistance, onlineRider.EndDistance, onlineRider.Cadence, onlineRider.HeartRate, 0, onlineRider.UserId, onlineRider.Power);
obj.transform.position = origin;
CurrentPlayer = online;
var currentFrames = DistanceToFrames(CurrentPlayer.totalDistance);
@@ -462,10 +465,6 @@ namespace Assets.Scripts.Scenes.VideoRide
cyclingController.recorderData.LastFrame = GetCurrentFrame();
RankingId = cyclingController.recorderData.SaveWithLocalRecordAysnc(cyclingModel, selectParamModel, imageFileName, recordId, path);
}
public void GetUIPanel()
{
}
public void AddEvent(GameObject sender, EventTriggerType eventType, UnityAction<BaseEventData> unityAction)
{
@@ -14,7 +14,6 @@ namespace Assets.Scripts.Scenes.VideoRide
{
base.Start();
animator.Play("idle");
power = 200;;
UserId = App.CurrentUser.Id;
UserName = App.CurrentUser.Nickname;
}
@@ -51,7 +50,7 @@ namespace Assets.Scripts.Scenes.VideoRide
power = manager.UpdatePower();
cadance = manager.UpdateCadence();
#if UNITY_EDITOR
power = 350;
power = 0;
cadance = 150;
heartRate = 160;
#endif
@@ -79,7 +78,7 @@ namespace Assets.Scripts.Scenes.VideoRide
Ticks = ticks,
_Power = power,
_Speed = speed,
_Distance = totalDistance > mapData.TotalDistance ? mapData.TotalDistance : totalDistance,
_Distance = totalDistance,//totalDistance > mapData.TotalDistance ? mapData.TotalDistance : totalDistance,
_Cadence = cadance,
_HeartRate = heartRate,
_Lat = currentlatLon.x,
@@ -85,7 +85,7 @@ namespace Assets.Scripts.Scenes.VideoRide
//ftp
ftpImage.fillAmount = (float)(manager.CurrentPlayer.wkg / MAXWKG);
wkg.text = $"{manager.CurrentPlayer.wkg}w/kg";
explosive.SetActive(manager.CurrentPlayer.power > 600);
explosive.SetActive(true);
}
}
}