331 lines
13 KiB
C#
331 lines
13 KiB
C#
using Assets.Scenes.Ride.Scripts.Model;
|
|
using Assets.Scripts;
|
|
using Assets.Scripts.Apis.Models;
|
|
using ChartAndGraph;
|
|
using DG.Tweening;
|
|
using System;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using System.Linq;
|
|
using Mapbox.Utils;
|
|
|
|
namespace Assets.Scenes.Ride.Scripts
|
|
{
|
|
public class OnlinePlayerController : AbstractPlayer
|
|
{
|
|
public PlayerController _playerController;
|
|
RawImage head;
|
|
Image arrowImage;
|
|
GameObject infoPanel;
|
|
Transform uiObject;
|
|
|
|
string nickName;
|
|
string weightKgStr;
|
|
|
|
protected override void Init()
|
|
{
|
|
base.Init();
|
|
currentlatlong = mainController.GetCenterCoordinate();
|
|
_playerController = FindObjectOfType<PlayerController>();
|
|
//创建UI
|
|
var uipanel = mainController.GetUIPanel();
|
|
uiObject = uipanel.transform.Find("ArrowList");
|
|
// if (mainController.cyclingController.Mode == CyclingModel.Competition)
|
|
// {
|
|
//#if UNITY_IOS || UNITY_ANDROID
|
|
// var CompetitionArrow = mainController.GetCompetitionMobileArrow();
|
|
// arrowImage = Instantiate(CompetitionArrow, uiObject);
|
|
//#else
|
|
// var CompetitionArrow = mainController.GetCompetitionArrow();
|
|
// arrowImage = Instantiate(CompetitionArrow, uiObject);
|
|
//#endif
|
|
// //比赛模式
|
|
// if (!string.IsNullOrEmpty(headUrl))
|
|
// {
|
|
// var rawImge = arrowImage.transform.Find("Head").GetComponent<RawImage>();
|
|
// Utils.DisplayImage(rawImge, headUrl, true);
|
|
// rawImge.gameObject.SetActive(true);
|
|
// }
|
|
// }
|
|
// else
|
|
{
|
|
arrowImage = Instantiate(Resources.Load<Image>("UI/Prefab/Ride/ReviewArrow"), uiObject);
|
|
arrowImage.color = new Color(0.1529412f, 0.8745098f, 0.8901961f);
|
|
#if UNITY_IOS || UNITY_ANDROID
|
|
arrowImage.transform.DOScale(new Vector3(1f,1f,1f),0);
|
|
#else
|
|
arrowImage.transform.DOScale(new Vector3(2f,2f,2f),0);
|
|
#endif
|
|
}
|
|
}
|
|
public override bool GetStart()
|
|
{
|
|
return true;
|
|
}
|
|
protected override void Compute()
|
|
{
|
|
if (mainController.currentPlayer != null)
|
|
{
|
|
diff = Math.Round((totalDistance - mainController.currentPlayer.TotalDistance) * 1000, 0);
|
|
}
|
|
else
|
|
{
|
|
diff = 0;
|
|
}
|
|
}
|
|
double diff = 0;
|
|
public void SetDataSource(double _totalDistance, double _distance, double _power, double _heartRate, double _cadence,int _totalTicks, string Name,double weightKg,Vector2d point,int index=0)
|
|
{
|
|
totalDistance = _totalDistance;
|
|
distance = _distance;
|
|
speed = distance*3600;
|
|
nickName = Name;
|
|
weightKgStr = weightKg.ToString("f2") + "W/KG";
|
|
CurrentIndex = index;
|
|
//Point = point;
|
|
currentlatlong = point;
|
|
heartRate = Convert.ToInt32( _heartRate);
|
|
power = Convert.ToInt32(_power);
|
|
cadance = _cadence;
|
|
ticks = _totalTicks;
|
|
}
|
|
|
|
public Vector2d Point { get; set; }
|
|
|
|
private string headUrl;
|
|
public void SetHead(string url )
|
|
{
|
|
headUrl = url;
|
|
}
|
|
|
|
public void ShowInfoPanel(Vector3 playerScreenPos)
|
|
{
|
|
if (infoPanel == null)
|
|
{
|
|
#if UNITY_IOS || UNITY_ANDROID
|
|
if (mainController.cyclingModel == CyclingModel.Competition)
|
|
{
|
|
infoPanel = Instantiate(Resources.Load<GameObject>("UI/Prefab/Ride/Mobile/OnlineRaceInfoPanel"), uiObject);
|
|
}
|
|
else
|
|
{
|
|
infoPanel = Instantiate(Resources.Load<GameObject>("UI/Prefab/Ride/Mobile/OnlineInfoPanel"), uiObject);
|
|
}
|
|
#else
|
|
if (mainController.cyclingModel == CyclingModel.Competition)
|
|
{
|
|
infoPanel = Instantiate(Resources.Load<GameObject>("UI/Prefab/Ride/OnlineRaceInfoPanel"), uiObject);
|
|
}
|
|
else
|
|
{
|
|
infoPanel = Instantiate(Resources.Load<GameObject>("UI/Prefab/Ride/OnlineInfoPanel"), uiObject);
|
|
}
|
|
#endif
|
|
}
|
|
var headPos = infoPanel.transform.Find("Head").position;
|
|
var infoPos = playerScreenPos + new Vector3(150f, 60f, 0f);
|
|
((RectTransform)infoPanel.transform).position = infoPos;
|
|
CreateInfoLine(playerScreenPos, headPos);
|
|
//头像
|
|
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 (mainController.currentPlayer != null)
|
|
{
|
|
infoDistance.text = diff > 0? $"+{diff}M" : $"{diff}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()
|
|
{
|
|
arrowImage?.gameObject?.Destroy();
|
|
headPanel?.Destroy();
|
|
infoPanel?.Destroy();
|
|
transform.gameObject.Destroy();
|
|
}
|
|
|
|
TrailRenderer trailRenderer { get; set; }
|
|
|
|
protected override void AfterExcute()
|
|
{
|
|
var playerScreenPos = Camera.main.WorldToScreenPoint(transform.position);
|
|
////如果是比赛模式头像
|
|
//if (mainController.cyclingModel == CyclingModel.Competition)
|
|
//{
|
|
// playerScreenPos.y += 10f;
|
|
//}
|
|
//如果观察的是当前用户 隐藏UI 添加trailrender
|
|
var iscurrentUser = mainController.currentPlayer.UserId == UserId;
|
|
var s = mainController.currentPlayer.Currentlatlong;
|
|
var e = currentlatlong;
|
|
var distancesss = mainController.Distance(s, e);
|
|
arrowImage.gameObject.SetActive(!iscurrentUser && distancesss <= 2);
|
|
|
|
if (iscurrentUser && trailRenderer == null)
|
|
{
|
|
trailRenderer = gameObject.AddComponent<TrailRenderer>();
|
|
trailRenderer = FindObjectOfType<TrailRenderer>();
|
|
//var color7 = Resources.Load<Material>("UI/Material/color7");
|
|
var Graph2 = mainController.Get3dGraph2(); //Resources.Load<Material>("UI/Material/3dGraph2");
|
|
trailRenderer.material = Graph2;//new Material[] { Graph2 };
|
|
trailRenderer.time = 30;
|
|
trailRenderer.startWidth = 0.5f;
|
|
trailRenderer.endWidth = 0.5f;
|
|
trailRenderer.startColor = new Color(0.9764706f, 0.1882353f, 0.5254902f, 1f);
|
|
trailRenderer.endColor = new Color(0.9764706f, 0.1882353f, 0.5254902f, 1f);
|
|
trailRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
|
|
trailRenderer.allowOcclusionWhenDynamic = false;
|
|
trailRenderer.textureMode = LineTextureMode.Tile;
|
|
trailRenderer.motionVectorGenerationMode = MotionVectorGenerationMode.ForceNoMotion;
|
|
trailRenderer.receiveShadows = false;
|
|
trailRenderer.rayTracingMode = UnityEngine.Experimental.Rendering.RayTracingMode.Off;
|
|
}
|
|
//如果不是当前用户则销毁轨迹效果
|
|
if (!iscurrentUser)
|
|
{
|
|
trailRenderer?.Destroy();
|
|
}
|
|
var rect = ((RectTransform)arrowImage.transform);
|
|
rect.position = new Vector3(playerScreenPos.x, playerScreenPos.y, 0);
|
|
|
|
if (IsShowInfo)
|
|
{
|
|
ShowInfoPanel(playerScreenPos);
|
|
}
|
|
else
|
|
{
|
|
if (infoPanel == null)
|
|
return;
|
|
_directionsGO?.Destroy();
|
|
infoPanel.transform.GetComponent<CanvasGroup>().DOFade(0, 1).onComplete += () => {
|
|
IsShowInfo = false;
|
|
infoPanel?.Destroy();
|
|
};
|
|
}
|
|
}
|
|
|
|
GameObject _directionsGO;
|
|
void CreateInfoLine(Vector3 startPos,Vector3 endPos)
|
|
{
|
|
if (_directionsGO != null)
|
|
{
|
|
_directionsGO.Destroy();
|
|
}
|
|
startPos = Camera.main.ScreenToWorldPoint(startPos);
|
|
//endPos.x -= 120f;
|
|
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 = mainController.GetMaterial4(); //Resources.Load<Material>("UI/Material/4");
|
|
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;
|
|
}
|
|
|
|
protected override void MoveGraphHead(bool init=false)
|
|
{
|
|
if (mainController.cyclingModel == CyclingModel.Competition)
|
|
{
|
|
MoveGraghHead4Race();
|
|
}
|
|
else
|
|
{
|
|
MoveHead();
|
|
}
|
|
}
|
|
|
|
private double horizontalScrolling { get; set; }
|
|
private void MoveHead()
|
|
{
|
|
if (headPanel == null)
|
|
{
|
|
var onlineHeadPanel = mainController.GetOnlineheadPanel();
|
|
headPanel = Instantiate(onlineHeadPanel);
|
|
headPanel.transform.SetParent(graph.transform);
|
|
headPanel.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f);
|
|
}
|
|
|
|
int nextIndex = CurrentIndex;
|
|
var viewIndex = chartDataSourceScript.GetViewIndex(nextIndex);
|
|
//人物移动 停止条件 到中间且线未加载完
|
|
if (GetStart() && chartDataSourceScript.ReachMid(viewIndex) && !chartDataSourceScript.ReachEnd())
|
|
{
|
|
var currentDistance = CurrentDistance;
|
|
var distance = Distance;
|
|
var offset = currentDistance > 0 ? distance * 1000 / currentDistance : 1;
|
|
//horizontalScrolling += offset;
|
|
if (UserId == mainController.currentPlayer.UserId)
|
|
{
|
|
graph.HorizontalScrolling += offset;
|
|
}
|
|
}
|
|
//设定当前头像位置
|
|
var m = graph.DataSource.GetPoint("Player 2", viewIndex);
|
|
graph.PointToWorldSpace(out Vector3 itemPosition, m.x, m.y, "Player 2");
|
|
itemPosition.x -= 12f;
|
|
itemPosition.y += 5f;
|
|
headPanel.transform.position = new Vector3(itemPosition.x, itemPosition.y, 0);
|
|
//超出边界隐藏
|
|
var start = graph.HorizontalScrolling;
|
|
var end = graph.HorizontalScrolling + graph.DataSource.HorizontalViewSize;
|
|
headPanel.SetActive(nextIndex >= start && nextIndex <= end);
|
|
//显示头像
|
|
if (head == null)
|
|
{
|
|
head = headPanel.transform.Find("Head").GetComponent<RawImage>();
|
|
if (!string.IsNullOrEmpty(headUrl))
|
|
{
|
|
Utils.DisplayImage(head, headUrl, true);
|
|
}
|
|
else
|
|
{
|
|
headPanel.transform.Find("DefaultHead").gameObject.SetActive(true);
|
|
}
|
|
}
|
|
}
|
|
Color transparent = new Color(0.1529412f, 0.8745098f, 0.8901961f, 0);
|
|
Color blue = new Color(0.1529412f, 0.8745098f, 0.8901961f, 1);
|
|
private void MoveGraghHead4Race()
|
|
{
|
|
MoveHead();
|
|
var rect = ((RectTransform)(headPanel.transform));
|
|
//如果切换到当前用户,当前用户头像变大,并且只显示当前用户
|
|
if (mainController.currentPlayer.UserId == UserId)
|
|
{
|
|
headPanel.transform.SetAsLastSibling();
|
|
head.gameObject.SetActive(true);
|
|
headPanel.GetComponent<Image>().color = blue;
|
|
rect.DOScale(new Vector3(1.2f, 1.2f, 1.2f), 0.5f);
|
|
}
|
|
else
|
|
{
|
|
head.gameObject.SetActive(false);
|
|
headPanel.GetComponent<Image>().color = transparent;
|
|
rect.DOScale(new Vector3(1f, 1f, 1f), 0.5f);
|
|
}
|
|
}
|
|
}
|
|
} |