У меня есть 3 Vector3: moveDir, LookDir и ForceDir. moveDir — это вектор движения (т. е. нажатие D (вправо) устанавливает для Z в moveDir значение 1, W (вперед) устанавливает значение X на 1 и т. д.). `lookDir` — это направление, в котором смотрит игрок, сплющенное, чтобы учитывать только поворот по оси y. А ForceDir — это векторная сила, которая будет применена.
Я пробовал различные методы комбинирования перемещения и просмотра Dir, чтобы установить ForceDir (умножение перемещения и просмотра В первую очередь Dirs), но это дало странные результаты.
Грубо нарисованное изображение моих желаемых и фактических движений игрока.

Если бы я держал W (вперед), я бы ожидал двигаться в направлении игрока смотрит, удерживая A (влево). Я ожидаю, что он будет двигаться перпендикулярно влево в направлении, в котором смотрит игрок. вместо этого он применяет эти силы только относительно мирового пространства или, что еще более странно, когда я смотрю вниз по плоскостям X или Z.
Блок кода для контекста: (он запускается в каждом кадре)
private void MovePlayer()
{
//above I have it so inputs are handled (fore & backwards motion is handled in walkY, strafing in walkX)
walkX = Mathf.Clamp(walkX, -1.42f, 1.42f); walkY = Mathf.Clamp(walkY, -1.42f, 1.42f);
walkDir = new Vector3(walkY, 0, walkX);
walkX *= 0.7f; walkY *= 0.7f;
walkX = (walkX >= 0.001f || walkX = 0.001f || walkY
Подробнее здесь: https://stackoverflow.com/questions/783 ... of-another
Мобильная версия