Как движение по синусоиде Unity C#

У меня есть код который заставляет двигать объект по синусоиде. Я вижу что оно зависит от времени. При зажатии пробела куб останавливает свое движение. Но после отжатия он появляется в другом месте. Можно ли это как то решить или нужен новый скрипт ?

public float frequency = 20f;

public float magnitude = 0.5f;

Vector3 pos;

void Start ()
{
    pos = transform.position;
}

// Update is called once per frame
void Update ()
{
    if(!Input.GetKey(KeyCode.Space))
        transform.position = pos + transform.up * Mathf.Sin(Time.time * frequency) * magnitude;
}

Ответы (1 шт):

Автор решения: Вадим

Time.time - это время в которое работает приложение. Как следствие оно продолжает тикать невзирая на то, зажать пробел или нет (ну и как следствие при отпускании пробела, кубик кидает туда, сколько оно натикало.

Проще добавить еще один счетчик (i++) в Udpate, который будет сдвигать кубик в более контролируемое время.

P.S. Из документации по функции: Regular (per frame) calls should be avoided: Time.time is intended to supply the length of time the application has been running for, and not the time per frame.

Так что лучше не использовать данные часы в апдейте.

P.P.S И если добавлять туда счетчик, то движение лучше проводить в FixedUpdate, он, в отличие от Update, не зависит от FPS)

→ Ссылка