骑行计算逻辑调整

This commit is contained in:
lishuo committed 2021-03-30 17:29:39 +08:00
1 parent 971a6f7e0e
commit 0ab0e99597
15 files changed
+309 -393

No files matched your search

+88 -105
View File
@@ -1,13 +1,11 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mapbox.Unity.Map;
using Mapbox.Utils;
using Mapbox.Unity.Utilities;
using System.Linq;
using Assets.Scripts.Apis.Models;
using static Assets.Scripts.Apis.Models.MapDataModel;
namespace Ride.Scripts
namespace Assets.Scenes.Ride.Scripts
{
public class PlayerController : MonoBehaviour
{
@@ -18,126 +16,105 @@ namespace Ride.Scripts
float characterSpeed;
[SerializeField]
Animator characterAnimator;
//[Header("References")]
//[SerializeField]
//AstronautDirections directions;
//[SerializeField]
//Transform startPoint;
//[SerializeField]
//Transform endPoint;
[SerializeField]
AbstractMap map;
[SerializeField]
GameObject rayPlane;
//[SerializeField]
//Transform _movementEndPoint;
[SerializeField]
LayerMask layerMask;
Ray ray;
RaycastHit hit;
LayerMask raycastPlane;
float clicktime;
bool moving;
bool characterDisabled;
private List<Vector2d> rideList;
void Start()
{
characterAnimator = GetComponentInChildren<Animator>();
//初始化玩家坐标
currentlatlong = map.WorldToGeoPosition(transform.localPosition);
nextlatlong = currentlatlong;
totalDistance = 0;
//StartCoroutine("Timer");
//if (!Application.isEditor)
//{
// this.enabled = false;
// return;
//}
}
//gameStatus idle start pause finish
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()
{
if (characterDisabled)
return;
//CamControl();
bool click = false;
if (Input.GetMouseButtonDown(0))
timer -= Time.deltaTime;
if (timer <= 0 && GameManger.IsStart)//定时器
{
clicktime = Time.time;
}
if (Input.GetMouseButtonUp(0))
{
if (Time.time - clicktime > 0.15f)
{
click = true;
}
}
//开始骑行
//if (click)
{
StartCoroutine("Walk");
ticks++;
Riding();
timer = 1.0f;
}
}
IEnumerator Walk()
//计算当前玩家高度和坡度
Item find(double totalDistance)
{
yield return new WaitForSeconds(1f);
//读取当前速度以及骑行距离
double distance = MockData.CalculateSpeed(Random.Range(100,300), 10, 100, 65, 7) / 3600;
if (totalDistance + distance <= MockData.totaldistance)
{
totalDistance += distance;
//计算下一个点的位置
nextlatlong = MockData.Along(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)
{
CamControl();
var v = GameManger.Along(totalDistance);
StartCoroutine(CamControl());
//设定动画状态
characterAnimator.SetBool("IsRide", true);
nextPos = map.GeoToWorldPosition(nextlatlong);
nextPos = map.GeoToWorldPosition(v);
prePos = transform.localPosition;
//转向
StartCoroutine(LookAtNextPos());
//让人物移动 TODO 可以继续分点增加动画的流畅度
transform.localPosition = nextPos;
//StartCoroutine(MoveTo());
//移动
StartCoroutine(MoveTo());
}
else
{
moving = false;
characterAnimator.SetBool("IsRide", false);
}
}
else
{
moving = false;
characterAnimator.SetBool("IsRide", false);
}
}
#region Character : Movement
List<Vector3> futurePositions = new List<Vector3>();
bool interruption;
Vector3 nextPos;
Vector3 prevPos;
#endregion
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(character.transform.position - nextPos);
Quaternion neededRotation = Quaternion.LookRotation(transform.localPosition - nextPos);
Quaternion thisRotation = character.transform.localRotation;
float t = 0;
@@ -158,14 +135,20 @@ namespace Ride.Scripts
Vector3 previousPos = Vector3.zero;
Vector3 deltaPos = Vector3.zero;
void CamControl()
IEnumerator CamControl()
{
if (cam != null)
{
deltaPos = transform.position - previousPos;
//deltaPos.y = 0;
cam.transform.position = Vector3.Lerp(cam.transform.position, cam.transform.position + deltaPos, Time.time);
previousPos = transform.position;
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