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

174 lines
6.5 KiB
C#

using Assets.Scenes.Ride.Scripts.Model;
using Assets.Scripts;
using DG.Tweening;
using System;
using UnityEngine;
using UnityEngine.UI;
namespace Assets.Scenes.Ride.Scripts
{
public class OtherPlayerController : AbstractPlayer
{
public string[] record { set; get; }
public ReviewItemScript _reviewItemScript;
public PlayerController _playerController;
public int tickOffset = 0;
string nickName;
string weightKgStr;
public double Weight { get; set; }
public double BikeWeight { get; set; }
//UI
RawImage head;
GameObject infoPanel;
Image arrowImage;
Transform uiObject;
protected override void Init()
{
base.Init();
_playerController = FindObjectOfType<PlayerController>();
tickOffset = mainController.preticks;
//创建UI
uiObject = transform.parent.Find("SingleUI/Panel/ArrowList");
arrowImage = Instantiate(Resources.Load<Image>("UI/Prefab/Ride/ReviewArrow"), uiObject);
}
double diff = 0;
protected override void Compute()
{
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);//下一个坐标
diff = Math.Round((totalDistance - _playerController.TotalDistance) * 1000, 0);
_reviewItemScript.SetDistance(diff);
}
public void SetController(ReviewItemScript reviewItemScript)
{
_reviewItemScript = reviewItemScript;
nickName = _reviewItemScript.GetName();
}
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>();
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 -= 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/color8");
lineRender.material = Resources.Load<Material>("UI/Material/1");
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()
{
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;
_directionsGO?.Destroy();
infoPanel.transform.GetComponent<CanvasGroup>().DOFade(0, 1).onComplete += () => {
IsShowInfo = false;
infoPanel?.Destroy();
};
}
}
protected override void MoveGraphHead()
{
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/HeadPanel"));
headPanel.transform.SetParent(graph.transform);
headPanel.transform.localScale = new Vector3(0.8f, 0.8f, 0.8f);
}
if (head == null)
{
head = headPanel.GetComponentInChildren<RawImage>();
head.texture = _reviewItemScript.GetHead();
}
headPanel.transform.DOMove(new Vector3(itemPosition.x, itemPosition.y, 0), 1);
}
}
}