骑行计算逻辑调整
This commit is contained in:
1 parent
971a6f7e0e
commit
0ab0e99597
15 files changed
+309
-393
No files matched your search
@@ -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
|
||||
|
||||
Reference in new issue
Block a user