transform.Rotate
имеет необязательный параметр
relativeTo
Определяет, вращать ли GameObject локально по отношению к GameObject или относительно сцены в мировом пространстве.
, который по умолчанию равен Space.Self
.
Итак, ваш
transform.Rotate(GetAxis(myAxis[i]), angle);
всегда выполняется в локальной системе координат GameObject. Эта локальная система вращается вместе с GameObject, поэтому локальная ось transform.up
, transform.forward
и т. Д. Постоянно меняется.
Вместо этого заставьте его вращаться вокруг мировой оси
transform.Rotate(GetAxis(myAxis[i]), angle, Space.World);
Как я могу обновить массив vectorAxises в режиме реального времени, пока игра запущена, чтобы показать в Инспекторе текущее состояние оси
Это уже должно быть так. Или вы имеете в виду, что хотите увидеть текущее «выбранное» значение. Вы должны использовать отладку и точки останова для этого. Так как вы делаете
for (int i = 0; i < myAxis.Length; i++)
{
transform.Rotate(GetAxis(myAxis[i]), angle);
}
без дальнейших действий yield return
объект будет напрямую "прыгать" в новое вращение, и в инспекторе вы всегда будете видеть только последние GetAxis(myAxis[i])
.
Если вы ищете плавное вращение, проверьте Ответ Дест слегка измененный, например, вы могли бы. пусть объект вращается в течение 1 секунды
while (stopRotation == true)
{
// calculate the target rotation
Quaternion rotationQuaternion = Quaternion.identity;
for (int i = 0; i < myAxis.Length; i++)
{
rotationQuaternion *= Quaternion.AngleAxis(angle, GetAxis(myAxis[i]));
}
// before starting to rotate store initial and target rotation
var initialRotation = transform.rotation;
var targetRotation = initialRotation * rotationQuaternion;
// could also get this from the Inspector e.g.
var rotationDuration = 1;
// Do a smooth rotation from the initial to target rotation
// within the defined rotationDuration
var timePassed = 0f;
do
{
// additionally ease-in and -out the rotation
var lerpFactor = Mathf.SmoothStep(0, 1, timePassed / rotationDuration);
transform.rotation = Quaternion.Slerp(initialRotation, targetRotation, lerpFactor);
timePassed += Time.deltaTime;
// let this state be rendered
yield return null;
} while(timePassed < rotationDuration);
// if you still want the pause
yield return new WaitForSeconds(speed);
}
Просто из любопытства: зачем вообще здесь использовать enum
? Не могли бы вы вместо этого напрямую пройтись по индексу vectorAxises
и добавить только те записи, которые вы будете использовать?