У меня есть человек GameObject, которым игрок может управлять с помощью клавиш со стрелками. Когда игрок нажимает left или right, я поворачиваю персонажа с помощью Transform.Rotate.
Однако я обнаружил неточность, которую не могу объяснить, пытаясь продвинуть персонажа вперед.
velocity на компоненте GameobjectRigidbody (нажав вверх), то персонаж будет двигаться в том направлении, в котором смотрит.Tranform.Translate в направлении transform.forward (нажимая W), то персонаж не будет двигаться в том направлении, в котором смотрит. Вместо этого они движутся в том направлении, в котором они смотрели бы, если бы к ним было применено это вращение дважды. Так, например, если я удержу left, пока они не повернутся на 45 градусов, а затем нажму W, персонаж переместится так, как если бы я повернул их на 90 градусов, а затем нажал Up.void Start()
{
m_Rigidbody = GetComponent<Rigidbody>();
m_Speed = 1.0f;
}
void Update()
{
if (Input.GetKey(KeyCode.UpArrow))
{
m_Rigidbody.velocity = transform.forward * m_Speed;
}
if (Input.GetKey(KeyCode.W))
{
transform.Translate(transform.forward * Time.deltaTime * m_Speed);
}
if (Input.GetKey(KeyCode.RightArrow))
{
transform.Rotate(new Vector3(0, 1, 0) * Time.deltaTime * m_Speed * 50, Space.Self);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.Rotate(new Vector3(0, -1, 0) * Time.deltaTime * m_Speed * 50, Space.Self);
}
}
Я напечатал направление transform.forward, и кажется, что оно всегда указывает в том направлении, в котором смотрит персонаж. Тогда почему Transform.Translate в направлении transform.forward не перемещает персонажа в том направлении, в котором он смотрит?
Возможные параметры конфигурации, которые могут повлиять на ситуацию:
convexMeshColliderRigidbody персонажа не является kinematic и ограничен вращением X и Z.




Путаница связана с местными и мировыми координатами. Давайте разберемся:
transform.Translate(m_Speed * Time.deltaTime * transform.forward)
Если вы не укажете Space, Transform.Translate() переместит ваш объект в локальные координаты. Теперь transform.foward захватывает локальный forward вектор, но возвращает его в мировых координатах. Поэтому у вас есть два варианта:
В местных координатах:
transform.Translate(m_Speed * Time.deltaTime * Vector3.forward);
В мировых координатах:
transform.Translate(m_Speed * Time.deltaTime * transform.forward, Space.World);
Кстати: изменение порядка коэффициентов умножения может сыграть роль с точки зрения эффективности вычислений, поскольку скалярное умножение выполняется быстрее, чем векторное
Спасибо за ответ и за дополнительный совет об эффективности вычислений.