Как выровнять изменение переменной FixedUpdate с пользовательским вводом - PullRequest
0 голосов
/ 28 апреля 2019

Я создаю маленького бесконечного раннера, в котором игрок должен смахивать вверх и вниз по экрану, чтобы перемещать рыбу.Представьте себе Subway Surfers, где вы путешествуете плавно, а не просто прыгаете ногой влево или вправо.В любом случае, я пытаюсь заставить рыбу вращаться в приблизительном направлении пальца игрока и постепенно поворачивать назад, когда игрок отпускает экран.Программа работала почти без сбоев - за исключением того факта, что рыба постоянно возвращалась в исходное положение, поэтому она выглядела действительно глючно.

Этот скрипт работает так, что он принимает две переменные Vector2 -текущие и предыдущие позиции рыбы.Затем он вычитает их, чтобы получить Vector2, обозначающий изменение положения с момента последнего кадра.Затем я передаю его в Mathf.Atan, чтобы получить направление этого движения.Наконец, я поворачиваю рыбу на эту новую величину - минус ее текущее вращение - чтобы она двигалась в правильном направлении.Я покажу код ниже.Изучив, почему это заставляло рыбу постоянно поворачиваться назад на 0 градусов в течение нескольких кадров, снова и снова, я узнал, что Unity считает, что изменение положения y - это то, что переключается в ноль через каждый второй кадр.Весь мой код работает на FixedUpdate, и я нигде не использую Update, поэтому я понятия не имею, почему он так беспорядочно переключается.Если пользовательский сенсорный ввод измеряется во время обновления, это может быть источником проблемы, но было бы неплохо, если бы я мог найти решение.Я просто немного растерялся, и мне было бы приятно, если бы кто-нибудь смог прояснить это для меня как можно скорее.

Теперь вот мой код для класса "RotateByTouch":

C #

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class RotateByTouch : MonoBehaviour {
    public TrackObjectMotion trackObjectMotion;
    public GameObject thisObject;

    public float rotationValue;

    void FixedUpdate() {
        rotationValue = Mathf.Atan(trackObjectMotion.DeltaY / trackObjectMotion.DeltaX) * Mathf.Rad2Deg;

        thisObject.transform.Rotate(Vector3.forward, rotationValue - thisObject.transform.rotation.eulerAngles.z);
    }
}

А вот мой код для класса "TrackObjectMotion":

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TrackObjectMotion : MonoBehaviour {
    public Vector3 CurrentPosition;
    public Vector3 PreviousPosition;

    public float DeltaX;
    public float DeltaY;

    // Update is called once per frame
    void FixedUpdate() {
        PreviousPosition = CurrentPosition;
        CurrentPosition = this.gameObject.transform.position;

        DeltaX = CurrentPosition.x - PreviousPosition.x;
        DeltaY = CurrentPosition.y - PreviousPosition.y;
    }
}

И, наконец, вот код, который я использовал для фактического перемещения рыбы:

public void FixedUpdate() {
    foreach(Touch touch in Input.touches) {
        if(touch.Phase == TouchPhase.Moved) {
            this.transform.Translate(0, touch.deltaPosition.y, 0);
        }
    }
}

Этот последний бит просто не учитывает умножение на константы для получения желаемого результата, но это не важно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...