#unity3d
#unity3d
Вопрос:
У меня есть скрипт, который должен заставить монету в воздухе плавать вверх и вниз.
float increment = Mathf.Sin(startTime Time.time * speed) * strength * Time.deltaTime;
Vector3 pos = new Vector3(this.transform.position.x, this.transform.position.y increment, this.transform.position.z);
this.transform.position = pos;
Похоже, это работает, но оно должно обновлять только позицию Y. Теперь он также изменяет позиции X и Z, но настолько мало, что это заметно только тогда, когда игра запущена в течение многих минут.
Выполняет ли Unity преобразования округлений внутри Vector3? Position.x и position.z никоим образом не изменяются, но объект по-прежнему медленно удаляется.
Комментарии:
1. Почему вы указываете синус как приращение? Разве это не должно скорее заменить позицию? -> сохранить исходную позицию Y и всегда добавлять приращение к этой исходной позиции Y вместо этого
2. Кроме того, @kor_, вы можете очень легко отладить это, добавив «Debug.Log …» везде. Кроме того, вам просто не нужно и не следует использовать «это». в этом случае
Ответ №1:
Почему:
transform.position
является мировым положением объекта, что означает, что он включает в себя все преобразования его родителей вплоть до корня, и это пересчитывается каждый раз, когда вы меняете transform.position
. Это нестабильно, когда какой-либо из родительских объектов имеет вращение не по умолчанию (вероятно, из-за ошибок округления в вычислениях матрицы / кватерниона).
Решение:
Сохранение исходного transform.position
(т. Е. В Start
методе) и изменение его y
компонента будут работать, но с побочным эффектом: преобразования любого из его родителей будут потеряны. Это может быть или не быть тем, чего кто-то хочет. Если мы действительно хотим сохранить преобразования родителей (то есть платформу с перемещением монет), мы должны хранить и использовать transform.localPosition
.