Как измерить пройденное расстояние по каждой оси Unity?
Этот код измеряет пройденное персонажем расстояние по каждой оси, и если оно больше какого-то значения, то сцена перезагружается.
private float oldPositionX;
private float oldPositionY;
public float totalDistanceX;
public float totalDistanceY;
public float maxDistanceX;
public float maxDistanceY;
void Start()
{
var position = transform.position;
oldPositionX = position.x;
oldPositionY = position.y;
}
void Update()
{
var position = transform.position;
var newPositionX = position.x;
totalDistanceX += Math.Abs(newPositionX - oldPositionX);
oldPositionX = newPositionX;
var newPositionY = position.y;
totalDistanceY += Math.Abs(newPositionY - oldPositionY);
oldPositionY = newPositionY;
if (totalDistanceX >= maxDistanceX || totalDistanceY >= maxDistanceY)
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
Получается, что расстояние накапливается по обеим осям. А как сделать так, чтобы если игрок шел по оси Х, накапливалось расстояние оси Х, но как только он начинает идти по оси Y - пройденное расстояние оси Х сбрасывается и начинает копиться Y?
Попытался сделать так, но расстояние на осях сразу сбрасывается.
private float oldPositionX;
private float oldPositionY;
public float totalDistanceX;
public float totalDistanceY;
public float maxDistanceX;
public float maxDistanceY;
void Start()
{
var position = transform.position;
oldPositionX = position.x;
oldPositionY = position.y;
}
void Update()
{
var position = transform.position;
var newPositionX = position.x;
var subDistanceX = totalDistanceX;
totalDistanceX += Math.Abs(newPositionX - oldPositionX);
oldPositionX = newPositionX;
if (subDistanceX == totalDistanceX)
totalDistanceX = 0;
var newPositionY = position.y;
var subDistanceY = totalDistanceY;
totalDistanceY += Math.Abs(newPositionY - oldPositionY);
oldPositionY = newPositionY;
if (subDistanceY == totalDistanceY)
totalDistanceY = 0;
if (totalDistanceX >= maxDistanceX || totalDistanceY >= maxDistanceY)
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
Ответы (1 шт):
Автор решения: Andrew
→ Ссылка
Код писал из головы и не проверял.
private vector3 oldPosition;
private float distanceX = 0;
private float distanceY = 0;
void Start()
{
oldPosition = transform.position;
}
void Update()
{
UpdateDistance();
}
void UpdateDistance()
{
//высчитываем дистанцию пройденную за кадр
var tmpDistX = Mathf.Abs( transform.position.x - oldPosition.x );
var tmpDistY = Mathf.Abs( transform.position.y - oldPosition.y );
oldPosition = transform.position;
distanceX += tmpDistX;
distanceY += tmoDistY;
// обнуляем пройденную дистанцию при остановке движения
// по оси и начале движения по второй оси
if (tmpDistX == 0 && tmpDistY > 0) { distanceX = 0 }
if (tmpDistX > 0 && tmpDistY == 0) { distanceY = 0 }
}