powerfun-unity/Assets/Scripts/Scenes/Ride/Scripts/OnlinePlayerController.cs

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