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

302 lines
12 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
uiObject = transform.parent.Find("UI/Panel/ArrowList");
if (mainController.cyclingController.Mode == CyclingModel.Competition)
{
arrowImage = Instantiate(Resources.Load<Image>("UI/Prefab/Match/CompetitionArrow"), uiObject);
//比赛模式
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);
}
}
public override bool GetStart()
{
return true;
}
protected override void Compute()
{
currentlatlong = mainController.Along(totalDistance);//下一个坐标
if (_playerController != null)
{
diff = Math.Round((totalDistance - _playerController.TotalDistance) * 1000, 0);
}
else
{
diff = 0;
}
}
double diff = 0;
public void SetDataSource(double _totalDistance, double _distance,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;
}
public Vector2d Point { get; set; }
private string headUrl;
public void SetHead(string url )
{
headUrl = url;
}
public void ShowInfoPanel(Vector3 playerScreenPos)
{
if (infoPanel == null)
{
infoPanel = Instantiate(Resources.Load<GameObject>("UI/Prefab/Ride/OnlineInfoPanel"), uiObject);
}
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 (_playerController != 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;
arrowImage.gameObject.SetActive(!iscurrentUser);
if (iscurrentUser && trailRenderer == null)
{
trailRenderer = gameObject.AddComponent<TrailRenderer>();
trailRenderer = FindObjectOfType<TrailRenderer>();
//var color7 = Resources.Load<Material>("UI/Material/color7");
var Graph2 = Resources.Load<Material>("UI/Material/3dGraph2");
trailRenderer.materials = new Material[] { Graph2 };
trailRenderer.time = 30;
trailRenderer.startWidth = 1f;
trailRenderer.endWidth = 1f;
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();
}
((RectTransform)arrowImage.transform).position = playerScreenPos;
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 = 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()
{
if (mainController.cyclingModel == CyclingModel.Competition)
{
MoveGraghHead4Race();
}
else
{
MoveHead();
}
}
private double horizontalScrolling { get; set; }
private void MoveHead()
{
var itemIndex = chartDataSourceScript.GetViewIndex(CurrentIndex);
var m = graph.DataSource.GetPoint("Player 2", itemIndex);
graph.PointToWorldSpace(out Vector3 itemPosition, m.x, m.y, "Player 2");
itemPosition.x -= 12f;
itemPosition.y += 5f;
if (headPanel == null)
{
headPanel = Instantiate(Resources.Load<GameObject>("UI/Prefab/Ride/OnlineHeadPanel"));
headPanel.transform.SetParent(graph.transform);
headPanel.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f);
headPanel.transform.position = itemPosition;
}
else
{
//if (UserId != mainController.currentPlayer.UserId)
//{
// headPanel.transform.position = new Vector3(itemPosition.x, itemPosition.y, 0);
//}
//else
{
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 = horizontalScrolling;
}
headPanel.transform.position = new Vector3(headPanel.transform.position.x, itemPosition.y, 0);
}
else
{
headPanel.transform.position = new Vector3(itemPosition.x, itemPosition.y, 0);
//headPanel.transform.DOMove(new Vector3(nextPosition.x, nextPosition.y, 0), 1);
}
}
//headPanel.transform.DOMove(new Vector3(itemPosition.x, itemPosition.y, 0), 1);
}
if (head == null)
{
head = headPanel.GetComponentInChildren<RawImage>();
if (!string.IsNullOrEmpty(headUrl))
{
Utils.DisplayImage(head, headUrl, true);
}
else
{
headPanel.transform.Find("DefaultHead").gameObject.SetActive(true);
}
}
}
private void MoveGraghHead4Race()
{
MoveHead();
var rect = ((RectTransform)(headPanel.transform));
//如果切换到当前用户,当前用户头像变大,并且只显示当前用户
if (mainController.currentPlayer.UserId == UserId)
{
headPanel.SetActive(true);
rect.DOScale(new Vector3(1.5f, 1.5f, 1.5f), 0.5f);
}
else
{
headPanel.SetActive(false);
rect.DOScale(new Vector3(1f, 1f, 1f), 0.5f);
}
}
}
}