Как измерить пройденное расстояние по каждой оси 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 }
    }
→ Ссылка