В моей игре у меня есть лодка, и она следует за моим пальцем в любом месте экрана (или мышью с рейкастом просто для тестирования). Я не хотел использовать анимацию для движения или физики из-за того, чего я пытаюсь достичь (анимация не подходит для движения лодки, а физика слишком сложна для того, что я делаю).
Это мои элементы управления движением и вращением:
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
У вас нет кода, управляющего камерой? Неудивительно, что он не двигается...
Я думал, что это бесполезно, это просто киномашина, которая следует за игроком, камера — это просто проблема, вызванная проблемой положения или вращением, которое перемещает лодку. Камера движется нормально, анимация немного смещается, когда я поворачиваю @Ruzihm
Итак, вы используете какую-то анимацию, верно? Вы проверили прямоугольник преобразования в анимации? убедитесь, что позиция не меняется в вашей анимации
Я не использую анимацию, я анимирую свою лодку с помощью сопрограмм, как тот, что справа, где я поместил код. Внутри них не меняется позиция @AfiJaabb





Если я прав, просто добавьте скрипт, чтобы камера следовала за лодкой, и все должно работать нормально... Думаю
Извините, но это не так, камера следует за лодкой с синематикой, и она отлично работает без сопрограммы. Но когда я добавил правое и левое вращение, он следует за лодкой с небольшим смещением, как будто лодка больше не находится в центре. Основная проблема не в камере, а в вращении лодки @MohammedThaier
На самом деле я решил проблему, удалив синематограф, в основном он создавал следующие проблемы:
С новой камерой и кодом, сделанным мной, теперь он работает как часы!
Не удается воспроизвести проблему из кода в вопросе. Отладочные вопросы должны содержать достаточно информации, чтобы их можно было воспроизвести, чтобы они соответствовали теме. Пожалуйста, отредактируйте вопрос, чтобы включить достаточно информации, и см. минимальный воспроизводимый пример для получения дополнительной информации.