157 lines
3.8 KiB
C#
157 lines
3.8 KiB
C#
using System.Collections;
|
|
using UnityEngine;
|
|
using Mapbox.Unity.Map;
|
|
using Mapbox.Utils;
|
|
using Assets.Scripts.Apis.Models;
|
|
using static Assets.Scripts.Apis.Models.MapDataModel;
|
|
|
|
namespace Assets.Scenes.Ride.Scripts
|
|
{
|
|
public class PlayerController : MonoBehaviour
|
|
{
|
|
[Header("Character")]
|
|
[SerializeField]
|
|
GameObject character;
|
|
[SerializeField]
|
|
float characterSpeed;
|
|
[SerializeField]
|
|
Animator characterAnimator;
|
|
[SerializeField]
|
|
AbstractMap map;
|
|
|
|
Vector3 nextPos;
|
|
Vector3 prePos;
|
|
private Vector2d currentlatlong; //当前坐标
|
|
private Vector2d nextlatlong; //下一个点的坐标
|
|
private double totalDistance;
|
|
private int ticks;//秒数
|
|
public float timer = 1.0f;//计时器
|
|
|
|
void Start()
|
|
{
|
|
characterAnimator = GetComponentInChildren<Animator>();
|
|
InitializePlayer();
|
|
}
|
|
//初始化人物
|
|
void InitializePlayer()
|
|
{
|
|
//获取玩家初始距离
|
|
currentlatlong = map.WorldToGeoPosition(transform.localPosition);
|
|
nextlatlong = currentlatlong;
|
|
totalDistance = 0;
|
|
ticks = 0;
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
timer -= Time.deltaTime;
|
|
if (timer <= 0 && GameManger.IsStart)//定时器
|
|
{
|
|
ticks++;
|
|
Riding();
|
|
timer = 1.0f;
|
|
}
|
|
}
|
|
//计算当前玩家高度和坡度
|
|
Item find(double totalDistance)
|
|
{
|
|
double sumDistance = 0;
|
|
MapDataModel mapDataModel = GameManger.MapData;
|
|
foreach (var item in mapDataModel.List)
|
|
{
|
|
sumDistance += item.Distance;
|
|
if (totalDistance < sumDistance)
|
|
{
|
|
return item;
|
|
}
|
|
}
|
|
return mapDataModel.List[0];
|
|
}
|
|
|
|
void Riding()
|
|
{
|
|
//yield return new WaitForSeconds(1.0f);
|
|
////读取当前速度以及骑行距离
|
|
MapDataModel mapDataModel = GameManger.MapData;
|
|
Item nextRange = find(totalDistance);
|
|
double elevation = nextRange.Elevation;
|
|
double gradev = nextRange.Grade;
|
|
double power = Random.Range(700, 2000);//TODO
|
|
double distance = Helper.CalculateSpeed(elevation, gradev, power, 65, 7) / 3600;
|
|
|
|
|
|
characterAnimator.SetBool("IsRide", false);
|
|
totalDistance += distance;
|
|
if (totalDistance <= mapDataModel.TotalDistance)
|
|
{
|
|
if (distance > 0)
|
|
{
|
|
var v = GameManger.Along(totalDistance);
|
|
StartCoroutine(CamControl());
|
|
//设定动画状态
|
|
characterAnimator.SetBool("IsRide", true);
|
|
nextPos = map.GeoToWorldPosition(v);
|
|
prePos = transform.localPosition;
|
|
//转向
|
|
StartCoroutine(LookAtNextPos());
|
|
//移动
|
|
StartCoroutine(MoveTo());
|
|
}
|
|
}
|
|
}
|
|
IEnumerator MoveTo()
|
|
{
|
|
//让人物移动分点增加动画的流畅度
|
|
float t = 0;
|
|
while (t < 1)
|
|
{
|
|
t += Time.deltaTime;
|
|
Vector3 v = Vector3.Lerp(transform.localPosition, nextPos, t);
|
|
transform.localPosition = v;
|
|
yield return null;
|
|
}
|
|
}
|
|
#region Character : Rotation
|
|
IEnumerator LookAtNextPos()
|
|
{
|
|
Quaternion neededRotation = Quaternion.LookRotation(transform.localPosition - nextPos);
|
|
Quaternion thisRotation = character.transform.localRotation;
|
|
|
|
float t = 0;
|
|
while (t < 1.0f)
|
|
{
|
|
t += Time.deltaTime / 0.25f;
|
|
var rotationValue = Quaternion.Slerp(thisRotation, neededRotation, t);
|
|
character.transform.rotation = Quaternion.Euler(0, rotationValue.eulerAngles.y, 0);
|
|
yield return null;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region CameraControl
|
|
[Header("CameraSettings")]
|
|
[SerializeField]
|
|
Camera cam;
|
|
Vector3 previousPos = Vector3.zero;
|
|
Vector3 deltaPos = Vector3.zero;
|
|
|
|
IEnumerator CamControl()
|
|
{
|
|
if (cam != null)
|
|
{
|
|
float t = 0;
|
|
while (t < 1.0f)
|
|
{
|
|
t += Time.deltaTime / 0.5f;
|
|
deltaPos = transform.position - previousPos;
|
|
//deltaPos.y = 0;
|
|
cam.transform.position = Vector3.Lerp(cam.transform.position, cam.transform.position + deltaPos, t);
|
|
previousPos = transform.position;
|
|
yield return null;
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
} |