在线用户和影子选手信息面板,小地图已经骑行路线

This commit is contained in:
lishuo committed 2021-05-12 18:51:03 +08:00
1 parent 53ec9c60ac
commit 87d581291b
25 files changed
+4332 -3675

No files matched your search

+3703 -3620
View File
File diff suppressed because it is too large. Load diff
+1 -1
View File
@@ -24,7 +24,7 @@ namespace Assets.Scenes.Ride.Scripts
protected AbstractMap map;
//AbstractMap map;
public bool IsShowInfo { get; set; }
#region 动画控制参数
public Vector3 nextPos;
Vector3 prePos = Vector3.zero;
+29 -13
View File
@@ -28,6 +28,8 @@ public class CyclingController : DeviceServiceMonoBase
public RouteResultParam selectParamModel;
public RouteResult routeResult;
public Dictionary<int, SeletedPlayerScript> selectPlayerDic { set; get; } = new Dictionary<int, SeletedPlayerScript>();
public int preticks;
#region 参数
@@ -212,12 +214,13 @@ public class CyclingController : DeviceServiceMonoBase
AutoStart();
InitPlayer();
}
PlayerController playerController;
//初始化人物位置角度
private void InitPlayer()
{
lockView = true;
TrailRenderer trail = player.GetComponent<TrailRenderer>();
PlayerController playerController = player.GetComponent<PlayerController>();
playerController = player.GetComponent<PlayerController>();
Vector2d lastLatLon = Along(recorderData.EndDistance);
Vector3 currentPos = map.GeoToWorldPosition(lastLatLon);
currentPos.y += 1f;
@@ -284,7 +287,7 @@ public class CyclingController : DeviceServiceMonoBase
otherList.Add(onlinePlayerController);
onlinePlayerController.UserId = onlineRider.UserId;
//onlinePlayerController.SetDistance(onlineDistance);
onlinePlayerController.SetTotalDistance(onlineTotalDistance, onlineDistance);
onlinePlayerController.SetDataSource(onlineTotalDistance, onlineDistance, onlineRider.NickName, onlineRider.WeightKg);
onlinePlayerController.SetHead(onlineRider.WxHeadImg);
//小地图人物
GameObject miniPlayer = (GameObject)Instantiate(miniMapPlayerPrefab, transform);
@@ -294,19 +297,31 @@ public class CyclingController : DeviceServiceMonoBase
}
else
{
//currentUser.SetDistance(onlineDistance);
currentUser.SetTotalDistance(onlineTotalDistance, onlineDistance);
currentUser.SetDataSource(onlineTotalDistance, onlineDistance, onlineRider.NickName, onlineRider.WeightKg);
}
}
////移除
//foreach (var item in currentOnlineUserList)
//{
// var currentItem = onlineRiders.Where(c => c.UserId == item.UserId).FirstOrDefault();
// if (currentItem == null)
// {
// item.RemoveSelf();
// }
//}
//移除
foreach (var item in currentOnlineUserList)
{
var currentItem = onlineRiders.Where(c => c.UserId == item.UserId).FirstOrDefault();
if (currentItem == null)
{
item.RemoveSelf();
}
var s = playerController.TotalDistance - item.TotalDistance;
}
//显示面板信息
var others = FindObjectsOfType<AbstractPlayer>();
foreach (var item in others)
{
item.IsShowInfo = false;
}
var frontPlayer = others.Where(c => c.TotalDistance - playerController.TotalDistance < 0.5 && c.TotalDistance - playerController.TotalDistance >= 0 && !(c is PlayerController)).OrderBy(c=>c.TotalDistance).FirstOrDefault();
var bakePlayer = others.Where(c => c.TotalDistance - playerController.TotalDistance >-0.5 && c.TotalDistance - playerController.TotalDistance < 0 && !(c is PlayerController)).OrderByDescending(c=>c.TotalDistance).FirstOrDefault();
if(frontPlayer != null)
frontPlayer.IsShowInfo = true;
if (bakePlayer != null)
bakePlayer.IsShowInfo = true;
}
#endregion
@@ -461,6 +476,7 @@ public class CyclingController : DeviceServiceMonoBase
CaptureCamera(Camera.main, new Rect(Screen.width * 0f, Screen.height * 0f, Screen.width * 0.5f, Screen.height * 0.5f), imageFileName);
cyclingController.recorderData.StartTime = startTime;
cyclingController.recorderData.EndTime = UIManager.Now.GetDateTime();
cyclingController.recorderData.IsCompleted = totalDistance == mapData.TotalDistance;
cyclingController.recorderData.EndDistance = totalDistance;
cyclingController.recorderData.AntModelId = AntModelId;
@@ -42,6 +42,7 @@ namespace Assets.Scenes.Ride.Scripts
}
}
}
float timer = 0;
private void Update()
{
if (playerController != null)
@@ -51,8 +52,44 @@ namespace Assets.Scenes.Ride.Scripts
((RectTransform)tr.transform).position = _minicamera.WorldToScreenPoint(_player.transform.localPosition);
//((RectTransform)tr).localPosition = _minicamera.WorldToViewportPoint(_player.transform.localPosition);
}
timer += Time.deltaTime;
while (timer>=1)
{
CreateMiniPath();
timer = 0;
}
}
private bool init = false;
void CreateMiniPath()
{
if (playerController == 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 (playerController.CurrentIndex >= i-1)
{
dat.Add(item);
}
}
}
var feat = new VectorFeatureUnity();
feat.Points.Add(dat);
CreateRedLineRender(feat);//创建小地图路线
}
}
private bool init = false;
private void _map_OnInitialized()
{
init = true;
@@ -161,6 +198,31 @@ namespace Assets.Scenes.Ride.Scripts
lineRender.loop = false;
_mipMapRoute.layer = 9;
}
#endregion
}
GameObject _mipMapPath;
void CreateRedLineRender(VectorFeatureUnity feat)
{
if (_mipMapPath != null)
{
_mipMapPath.Destroy();
}
_mipMapPath = new GameObject("MiniMapPath");
_mipMapPath.transform.parent = transform;
var lineRender = _mipMapPath.AddComponent<LineRenderer>();
lineRender.material = Instantiate(Resources.Load<Material>("UI/Material/2"));
var dat = feat.Points[0];
lineRender.endColor = Color.red;
lineRender.startColor = Color.red;
//设置宽度
lineRender.startWidth = 10f;
lineRender.endWidth = 10f;
lineRender.positionCount = dat.Count;
lineRender.SetPositions(feat.Points[0].ToArray());
lineRender.numCornerVertices = 20;
lineRender.numCapVertices = 20;
lineRender.loop = false;
_mipMapPath.layer = 9;
}
#endregion
}
}
@@ -37,7 +37,7 @@ namespace Assets.Scenes.Ride.Scripts
if (!string.IsNullOrEmpty(Name))
{
text.text = Name;
canvas.alpha = 1;
canvas.DOFade(1, 1);
Name = string.Empty;
}
else
@@ -78,6 +78,7 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
Point = new GeoJSON.Net.Geometry.GeographicPosition(item.Point[0], item.Point[1]),
EndDistance = item.EndDistance,
PreDistance = item.PreDistance,
WeightKg = item.WeightKg,
});
}
@@ -27,8 +27,8 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
CyclingState = CyclingStateEnum.Prepare,
CurrentRoute = route,
CurrentRouteStartDistance = 0,
StartTime = DateTime.Now
};
StartTime = UIManager.Now.GetDateTime(),//DateTime.Now
};
if (param != null)
{
@@ -78,6 +78,7 @@ namespace Assets.Scenes.Ride.Scripts.Model.CyclingModels
Point = new GeoJSON.Net.Geometry.GeographicPosition(item.Point[0], item.Point[1]),
EndDistance = item.EndDistance,
PreDistance = item.PreDistance,
WeightKg = item.WeightKg,
});
}
@@ -100,6 +100,8 @@ namespace Assets.Scenes.Ride.Scripts.Model
public double CurrentRouteStartDistance { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
/// <summary>
/// 是否已经保存成功
/// </summary>
@@ -159,7 +161,7 @@ namespace Assets.Scenes.Ride.Scripts.Model
ManufacturerId = ManufacturerId,
AntModelId = AntModelId,
StartTime = StartTime,
CreateTime = StartTime.AddSeconds(ticks),
CreateTime = EndTime, //StartTime.AddSeconds(ticks),
Ticks = ticks,
Mode = cyclingModel.ToString(),
Param = Newtonsoft.Json.JsonConvert.SerializeObject(selectParam),
@@ -12,6 +12,7 @@ namespace Assets.Scenes.Ride.Scripts.Model.RiderModels
public override RiderType riderType => RiderType.Online;
public double PreDistance { get; set; } = 0;
public double WeightKg { get; set; } = 0;
/// <summary>
///
/// </summary>
@@ -17,12 +17,15 @@ namespace Assets.Scenes.Ride.Scripts
GameObject headPanel;
Image arrowImage;
GameObject reviewInfoPanel;
GameObject infoPanel;
Transform uiObject;
GraphChartBase graph;
ChartDataSourceScript chartDataSourceScript;
string nickName;
string weightKgStr;
protected override void Init()
{
base.Init();
@@ -45,21 +48,20 @@ namespace Assets.Scenes.Ride.Scripts
protected override void Compute()
{
currentlatlong = mainController.Along(totalDistance);//下一个坐标
//var currentUser = cyclingExcutor.riders.Where(c => c.UserId == UserId).FirstOrDefault();
//var currentUser = cyclingExcutor?.riders.Where(c => c.UserId == UserId).FirstOrDefault();
//if (currentUser == null)
//{
// RemoveSelf();
//}
}
public void SetDistance(double _distance)
{
}
public void SetTotalDistance(double _totalDistance, double _distance)
public void SetDataSource(double _totalDistance, double _distance,string Name,double weightKg)
{
totalDistance = _totalDistance;
distance = _distance;
speed = distance*3600;
nickName = Name;
weightKgStr = weightKg.ToString("f2") + "W/KG";
}
public int GetCurrentIndex(double endistance,MapDataModel mapDataModel)
@@ -111,15 +113,91 @@ namespace Assets.Scenes.Ride.Scripts
headPanel.transform.DOMove(new Vector3(itemPosition.x, itemPosition.y, 0), 1);
}
public void ShowInfoPanel(Vector3 playerScreenPos)
{
if (infoPanel == null)
{
infoPanel = Instantiate(Resources.Load<GameObject>("UI/Prefab/Ride/OnlineInfoPanel"), uiObject);
}
var infoPos = playerScreenPos + new Vector3(100f, 60f, 0f);
((RectTransform)infoPanel.transform).position = infoPos;
CreateInfoLine(playerScreenPos, infoPos);
var infoHead = infoPanel.transform.Find("Head").GetComponent<RawImage>();
if (head != null)
{
infoHead.texture = head.texture;
}
var infoName = infoPanel.transform.Find("Name").GetComponent<Text>();
infoName.text = nickName;
var infoDistance = infoPanel.transform.Find("Distance").GetComponent<Text>();
if (_playerController != null)
{
infoDistance.text = ((totalDistance - _playerController.TotalDistance ) * 1000).ToString("f0") + "M";
}
var infoWKG = infoPanel.transform.Find("WKG").GetComponent<Text>();
infoWKG.text = weightKgStr;
var speedText = infoPanel.transform.Find("Speed").GetComponent<Text>();
speedText.text = speed.ToString("f1")+"KM/H";
}
public void RemoveSelf()
{
transform.gameObject.Destroy();
headPanel.Destroy();
headPanel?.SetActive(false);
//transform.gameObject.SetActive(false);
infoPanel?.SetActive(false);
//transform.DestroyChildren();
}
protected override void AfterExcute()
{
((RectTransform)arrowImage.transform).position = Camera.main.WorldToScreenPoint(transform.position);
var playerScreenPos = Camera.main.WorldToScreenPoint(transform.position);
((RectTransform)arrowImage.transform).position = playerScreenPos;
MoveHead(graph.transform);
if (IsShowInfo)
{
ShowInfoPanel(playerScreenPos);
}
else
{
if (infoPanel == null)
return;
infoPanel.transform.GetComponent<CanvasGroup>().DOFade(0, 1).onComplete += () => {
IsShowInfo = false;
infoPanel?.Destroy();
_directionsGO?.Destroy();
};
}
}
GameObject _directionsGO;
void CreateInfoLine(Vector3 startPos,Vector3 endPos)
{
if (_directionsGO != null)
{
_directionsGO.Destroy();
}
startPos = Camera.main.ScreenToWorldPoint(startPos);
endPos.x -= 50f;
endPos = Camera.main.ScreenToWorldPoint(endPos);
_directionsGO = new GameObject("InfoLinerender");
_directionsGO.transform.SetParent(transform);
var lineRender = _directionsGO.AddComponent<LineRenderer>();
lineRender.material = new Material(Shader.Find("Sprites/Default"));
//lineRender.material = Resources.Load<Material>("UI/Material/color8");
lineRender.endColor = new Color(0.1529412f, 0.8745098f, 0.8901961f, 1f);
lineRender.startColor = new Color(0.1529412f, 0.8745098f, 0.8901961f, 1f);
//设置宽度
lineRender.startWidth = 0.2f;
lineRender.endWidth = 0.2f;
lineRender.positionCount = 2;
lineRender.SetPositions(new Vector3[] { startPos, endPos });
lineRender.loop = false;
lineRender.numCapVertices = 10;
lineRender.numCornerVertices = 10;
}
}
}
@@ -9,16 +9,23 @@ namespace Assets.Scenes.Ride.Scripts
{
public class OtherPlayerController : AbstractPlayer
{
public string[] record;
public string[] record { set; get; }
public ReviewItemScript _reviewItemScript;
public PlayerController _playerController;
RawImage head;
GameObject headPanel;
GameObject infoPanel;
public int tickOffset = 0;
Image arrowImage;
GameObject reviewInfoPanel;
Transform uiObject;
string nickName;
string weightKgStr;
public double Weight { get; set; }
public double BikeWeight { get; set; }
protected override void Init()
{
base.Init();
@@ -34,22 +41,28 @@ namespace Assets.Scenes.Ride.Scripts
if (tickOffset + ticks < record.Length)
{
var data = TargetData.Read(record[tickOffset + ticks - 1]);
power = data._Power;
speed = data._Speed;
distance = data._Speed/3600;
totalDistance = data._Distance;
}
else
{
var data = TargetData.Read(record[record.Length - 1]);
power = data._Power;
speed = data._Speed;
distance = data._Speed / 3600;
totalDistance = data._Distance;
}
currentlatlong = mainController.Along(totalDistance);//下一个坐标
var diff = Math.Round(totalDistance - _playerController.TotalDistance, 3) * 1000;
_reviewItemScript.SetDistance(diff);
}
public void SetController(ReviewItemScript reviewItemScript)
{
_reviewItemScript = reviewItemScript;
nickName = _reviewItemScript.GetName();
}
public void MoveHead(Transform parent,Vector3 nextPosition)
{
@@ -66,9 +79,86 @@ namespace Assets.Scenes.Ride.Scripts
}
headPanel.transform.DOMove(new Vector3(nextPosition.x, nextPosition.y, 0), 1);
}
public void ShowInfoPanel(Vector3 playerScreenPos)
{
if (infoPanel == null)
{
infoPanel = Instantiate(Resources.Load<GameObject>("UI/Prefab/Ride/OnlineInfoPanel"), uiObject);
}
var infoPos = playerScreenPos + new Vector3(100f, 60f, 0f);
((RectTransform)infoPanel.transform).position = infoPos;
CreateInfoLine(playerScreenPos, infoPos);
var infoHead = infoPanel.transform.Find("Head").GetComponent<RawImage>();
if (head != null)
{
infoHead.texture = head.texture;
}
var infoName = infoPanel.transform.Find("Name").GetComponent<Text>();
infoName.text = nickName;
var infoDistance = infoPanel.transform.Find("Distance").GetComponent<Text>();
if (_playerController != null)
{
infoDistance.text = ((totalDistance - _playerController.TotalDistance) * 1000).ToString("f0") + "M";
}
var infoWKG = infoPanel.transform.Find("WKG").GetComponent<Text>();
if (Weight + BikeWeight != 0) {
weightKgStr = (power / (Weight + BikeWeight)).ToString("f2")+"W/KG";
infoWKG.text = weightKgStr;
}
var speedText = infoPanel.transform.Find("Speed").GetComponent<Text>();
speedText.text = speed.ToString("f1") + "KM/H";
}
GameObject _directionsGO;
void CreateInfoLine(Vector3 startPos, Vector3 endPos)
{
if (_directionsGO != null)
{
_directionsGO.Destroy();
}
startPos = Camera.main.ScreenToWorldPoint(startPos);
endPos.x -= 80f;
endPos = Camera.main.ScreenToWorldPoint(endPos);
_directionsGO = new GameObject("InfoLinerender");
_directionsGO.transform.SetParent(transform);
var lineRender = _directionsGO.AddComponent<LineRenderer>();
lineRender.material = new Material(Shader.Find("Sprites/Default"));
//lineRender.material = Resources.Load<Material>("UI/Material/color8");
lineRender.endColor = new Color(1, 1f, 1f, 0.65f);
lineRender.startColor = new Color(1, 1f, 1f, 0.65f);
//设置宽度
lineRender.startWidth = 0.2f;
lineRender.endWidth = 0.2f;
lineRender.positionCount = 2;
lineRender.SetPositions(new Vector3[] { startPos, endPos });
lineRender.loop = false;
lineRender.numCapVertices = 10;
lineRender.numCornerVertices = 10;
}
protected override void AfterExcute()
{
((RectTransform)arrowImage.transform).position = Camera.main.WorldToScreenPoint(transform.position);
var playerScreenPos = Camera.main.WorldToScreenPoint(transform.position);
((RectTransform)arrowImage.transform).position = playerScreenPos;//Camera.main.WorldToScreenPoint(transform.position);
if (IsShowInfo)
{
ShowInfoPanel(playerScreenPos);
}
else
{
if (infoPanel == null)
return;
infoPanel.transform.GetComponent<CanvasGroup>().DOFade(0, 1).onComplete += () => {
IsShowInfo = false;
infoPanel?.Destroy();
_directionsGO?.Destroy();
};
}
}
}
}
@@ -11,7 +11,10 @@ namespace Assets.Scenes.Ride.Scripts
{
#region 骑行逻辑
TrailRenderer trail;
//前面的人
public double frontOffset { set; get; } = double.NegativeInfinity;
//后面的人
public double backOffset { set; get; } = double.MaxValue;
protected override void Init()
{
@@ -49,7 +52,7 @@ namespace Assets.Scenes.Ride.Scripts
weight = App.CurrentUser.Weight;
bicycleWeight = App.CurrentUser.BicycleWeight;
#if UNITY_EDITOR
power = 300;//测试功率
power = 3000;//测试功率
#endif
mainController.TrackResistance(currentSlope * App.rideSetting.sensitivity / 100);
speed = Helper.CalculateSpeed(elevation, currentSlope, power, weight, bicycleWeight);
@@ -98,6 +98,10 @@ namespace Assets.Scenes.Ride.Scripts
var otherPlayerController = otherPlayerObj.GetComponent<OtherPlayerController>();
otherList.Add(otherPlayerController);
otherPlayerController.record = item.record;
otherPlayerController.Weight = cyclingController.selectPlayerDic[item.UserId].Weight;
otherPlayerController.BikeWeight = cyclingController.selectPlayerDic[item.UserId].BikeWeight;
otherPlayerController.SetController(reviewItemScript);
GameObject miniPlayer = (GameObject)Instantiate(miniMapPlayer, transform.parent.parent.parent);
var miniController = miniPlayer.GetComponent<MiniMapPlayerController>();
@@ -30,7 +30,10 @@ namespace Assets.Scenes.Ride.Scripts
{
Name.text = name;
}
public string GetName()
{
return Name.text;
}
public Texture GetHead()
{
return Head.texture;
@@ -161,6 +161,7 @@ namespace Assets.Scenes.Ride.Scripts
if (seletedPlayerScript.isUsed)
{
cyclingController.selectParamModel.RankingsId.Add(seletedPlayerScript.GetRankingId());
cyclingController.selectPlayerDic.Add(seletedPlayerScript.UserId, seletedPlayerScript);
}
}
//查询选中人员的骑行记录
@@ -221,14 +222,6 @@ namespace Assets.Scenes.Ride.Scripts
}
private void CreateGameObject(List<MapRouteRanking> list)
{
//if (list.Count == 0)
//{
// noRecord.SetActive(true);
//}
//else
//{
// noRecord.SetActive(false);
//}
var parent = transform.Find("Panel/PlayerList/Scroll View/Viewport/Content");
int index = 0;
foreach (var item in list)
@@ -241,6 +234,9 @@ namespace Assets.Scenes.Ride.Scripts
selectPlayerItemScript.SetTimer(item.TotalTime);
selectPlayerItemScript.SetWeightKg(item.WeightKg.ToString());
selectPlayerItemScript.SetHeadImage(item.WxHeadImg);
selectPlayerItemScript.Weight = item.Weight;
selectPlayerItemScript.BikeWeight = item.BicycleWeight;
selectPlayerItemScript.UserId = item.UserId;
selectPlayerItemScripts.Add(selectPlayerItemScript);
//UIManager.AddEventWithoutCursor(selectPlayerItemScript.GetButton().gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, OnSelectClick);
selectPlayerItemScript.GetButton().onClick.AddListener(delegate () { this.OnSelectClick(selectPlayerItemScript); });
@@ -258,6 +254,9 @@ namespace Assets.Scenes.Ride.Scripts
seletedPlayerScript.SetHead(selectPlayerItemScript.GetImageTexture(), true);
seletedPlayerScript.SetName(selectPlayerItemScript.GetName());
seletedPlayerScript.SetRankingId(selectPlayerItemScript.GetRankingId());
seletedPlayerScript.UserId = selectPlayerItemScript.UserId;
seletedPlayerScript.Weight = selectPlayerItemScript.Weight;
seletedPlayerScript.BikeWeight = selectPlayerItemScript.BikeWeight;
UIManager.AddEvent(seletedPlayerScript.GetButton().gameObject, UnityEngine.EventSystems.EventTriggerType.PointerClick, OnCloseClick);
selectPlayerItemScript.isSelected = true;
}
@@ -273,7 +272,7 @@ namespace Assets.Scenes.Ride.Scripts
}
seletedPlayerScript.Reset();
}
//TODO BUG
private void OnEndDrag(BaseEventData arg0)
{
var scrollrect = scroll.GetComponent<ScrollRect>();
@@ -17,6 +17,11 @@ namespace Assets.Scenes.Ride.Scripts
private Text WeightKg;
private Button selectbutton;
public bool isSelected;
public double Weight { get; set; }
public double BikeWeight { get; set; }
public int UserId { get; set; }
private void Awake()
{
selectbutton = transform.GetComponent<Button>();
@@ -16,6 +16,11 @@ namespace Assets.Scenes.Ride.Scripts
private string RankingId = string.Empty;
public bool isUsed = false;
public double Weight { get; set; }
public double BikeWeight { get; set; }
public int UserId { get; set; }
private void Awake()
{
Head = transform.GetComponent<RawImage>();