Я пытаюсь заставить камеру от первого лица, а движение камеры и игрока работать именно так, как мне нужно, однако теперь моя проблема заключается в том, что если я посмотрю вправо камерой и нажму W, чтобы двигаться вперед, она будет двигаться вперед в соответствии с игровой мир, а не направление, в котором смотрит камера.
Я пытался изменить родитель или использовать преобразование, чтобы связать плеер и камеру вместе.
// Simple Player movement
Rigidbody rb;
public float speed;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void FixedUpdate()
{
float mH = Input.GetAxis("Horizontal");
float mV = Input.GetAxis("Vertical");
rb.velocity = new Vector3(mH * speed, rb.velocity.y, mV * speed);
}
// Camera controls (separate script)
private Transform playerBody;
void update()
{
CameraRotation();
}
private void CameraRotation()
{
float mouseX = Input.GetAxis(mouseXInputName) * mouseSensitivity * Time.deltaTime;
float mouseY = Input.GetAxis(mouseYInputName) * mouseSensitivity * Time.deltaTime;
xAxisClamp += mouseY;
if (xAxisClamp > 90.0f)
{
xAxisClamp = 90.0f;
mouseY = 0.0f;
ClampAxisRotationToValue(270.0f);
}
else if (xAxisClamp < -90.0f)
{
xAxisClamp = -90.0f;
mouseY = 0.0f;
ClampAxisRotationToValue(90.0f);
}
transform.Rotate(Vector3.left * mouseY);
playerBody.Rotate(Vector3.up * mouseX);
}
С последней строкой playerBody.rotate
я ожидал, что она будет вращать объект, к которому прикреплена камера, поэтому, когда я нажимаю вперед, он будет двигаться вперед в направлении, в котором смотрит камера, но он все еще движется по своим статическим X и Z, игнорируя направление камеры.
Когда вы перемещаете своего персонажа, вы устанавливаете его скорость относительно осей мира и не принимаете во внимание вращение объекта.
Чтобы добавить вращение объекта во ввод, просто создайте ввод на основе поворота следующим образом:
void FixedUpdate()
{
Vector3 mH = transform.right * Input.GetAxis("Horizontal");
Vector3 mV = transform.forward * Input.GetAxis("Vertical");
rb.velocity = (mH + mV) * speed;
}
mH и mV теперь должны быть относительно того, куда направлен ваш объект, потому что transform.forward
(и .right
) будет представлением того, что «вперед» для вашего объекта.
И поскольку GetAxis() будет представлять число между -1
и 1
, мы в основном говорим, что Input.GetAxis
определяет СКОЛЬКО, куда мы хотим перейти. 1 или -1? Вперед или назад? forward * 1
или forward * -1
. То же самое с обстрелом; right * 1
или right * -1
.
Прошу прощения - я написал это на скорую руку. Он плохо написан, я переделаю его с лучшим объяснением и рабочим кодом. Подожди минутку
Да, это исправлено. Большое спасибо
Здорово! Не забудьте принять ответ, если это правильный ответ на вопрос! знак равно
Хорошо, я понимаю, что мне нужно сделать движение относительно направления объектов, а не направления мира. Однако с предложенным вами редактированием он жалуется на невозможность преобразовать Vector3 в Float. Таким образом, если бы я сделал ссылку на игровой объект и применил скорость к этому объекту, возможно, это исправило бы это.