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