Отклонение между значениями поворотов вызывает изменение позиции игрового объекта

Ситуация

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

Это мои элементы управления движением и вращением:

 if (Input.GetMouseButton(0))
    {
        
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (Physics.Raycast(ray, out hit, Mathf.Infinity, layerMask))
       {
            
            Vector3 target = hit.point;
            transform.position = Vector3.MoveTowards(transform.position,
             new Vector3(target.x, transform.position.y, target.z), speed);

            if (target.x - transform.position.x > 0)
            {
                right = true;
                isIdle = false;
            }
            else
            {
                right = false;
                isIdle = false;
            }
        }
    }
    else
    {
        isIdle = true;
        
        if (transform.rotation == originalRotation)
        {
            restoreRotation = false;
        }
        else
        {
            restoreRotation = true;
        }

        if (restoreRotation)
        {
            transform.rotation = Quaternion.Lerp(transform.rotation, originalRotation, Time.deltaTime * 5);
        }

Вот почему я добавил 3 сопрограммы, одну для холостого вращения, одну для вращения вправо и одну влево. Например, это сопрограмма движения вправо:

IEnumerator rightAnimation(float time)
{
    while (true)
    {

        if (right == true && isIdle == false)
        {
            float elapsedTime = 0;

            if (transform.rotation != Quaternion.Euler(-2, 13, -8))
            {

                while (elapsedTime < time)
                {
                    transform.rotation = Quaternion.Lerp(transform.rotation, Quaternion.Euler(-2, 13, -8), (elapsedTime / time));
                    elapsedTime += Time.deltaTime;

                    yield return null;
                }
            }

            elapsedTime = 0;

            while (elapsedTime < time)
            {
                transform.rotation = Quaternion.Lerp(Quaternion.Euler(-2, 13, -8), Quaternion.Euler(-7, 13, -8), (elapsedTime / time));
                elapsedTime += Time.deltaTime;

                yield return null;
            }

            elapsedTime = 0;

            while (elapsedTime < time)
            {
                transform.rotation = Quaternion.Lerp(Quaternion.Euler(-7, 13, -8), Quaternion.Euler(-2, 13, -8), (elapsedTime / time));
                elapsedTime += Time.deltaTime;

                yield return null;
            }
        }

        yield return new WaitForSeconds(0.1f);
    }

Если right == true, то моя сопрограмма проверяет вращение и переключается на новое вращение. Я проверил значения в инспекторе, и все выглядело нормально, вот так:

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

Когда я пробую свой код в игре, сопрограммы работают нормально и зацикливаются правильно, но происходит следующее:

Моя камера не может следовать за центром лодки, без анимации все было в порядке, и лодка движется немного правее моего пальца, а иногда даже ломала сопрограммы, потому что, если я продолжаю тянуть палец вправо, похоже, что я все еще нахожусь в лодке, но затем Unity думает, что я двигаюсь влево, и поэтому быстро меняет анимацию, а также перемещается на 2-3 единицы влево, как телепортация.

Сначала я подумал, что это проблема поворота, но лодка на самом деле просто пустой игровой объект внутри модели лодки, и все это центрировано:

Понятия не имею, я никоим образом не меняю позицию с этим лерпом между ротациями, так что понятия не имею об этом

Не удается воспроизвести проблему из кода в вопросе. Отладочные вопросы должны содержать достаточно информации, чтобы их можно было воспроизвести, чтобы они соответствовали теме. Пожалуйста, отредактируйте вопрос, чтобы включить достаточно информации, и см. минимальный воспроизводимый пример для получения дополнительной информации.

Ruzihm 25.12.2020 20:21

хорошо, редактируй это сейчас @Ruzihm

Leoverload 25.12.2020 20:23

У вас нет кода, управляющего камерой? Неудивительно, что он не двигается...

Ruzihm 25.12.2020 20:36

Я думал, что это бесполезно, это просто киномашина, которая следует за игроком, камера — это просто проблема, вызванная проблемой положения или вращением, которое перемещает лодку. Камера движется нормально, анимация немного смещается, когда я поворачиваю @Ruzihm

Leoverload 25.12.2020 20:39

Итак, вы используете какую-то анимацию, верно? Вы проверили прямоугольник преобразования в анимации? убедитесь, что позиция не меняется в вашей анимации

AfiJaabb 26.12.2020 03:53

Я не использую анимацию, я анимирую свою лодку с помощью сопрограмм, как тот, что справа, где я поместил код. Внутри них не меняется позиция @AfiJaabb

Leoverload 26.12.2020 09:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
122
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

вы не заставили камеру следовать за лодкой через код?

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

Извините, но это не так, камера следует за лодкой с синематикой, и она отлично работает без сопрограммы. Но когда я добавил правое и левое вращение, он следует за лодкой с небольшим смещением, как будто лодка больше не находится в центре. Основная проблема не в камере, а в вращении лодки @MohammedThaier

Leoverload 26.12.2020 10:08
Ответ принят как подходящий

На самом деле я решил проблему, удалив синематограф, в основном он создавал следующие проблемы:

  1. Он следовал за вращением лодки и вызывал странные перспективы.
  2. Изменение вращения изменяло направление raycast, заставляя лодку быстро меняться и менять свое положение.

С новой камерой и кодом, сделанным мной, теперь он работает как часы!

Другие вопросы по теме