根据相机调整玩家移动方向

3
我正在尝试制作一个第一人称摄像机,并且使摄像机和玩家的移动完全按照我的要求进行。然而,现在我的问题是,如果我用摄像机向右看并按下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轴移动,忽略了相机的朝向。

1个回答

1
当您移动角色时,您正在设置其速度相对于世界轴,并且不考虑对象旋转。
要将对象旋转添加到输入中,只需像这样基于旋转的输入:
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()将表示-11之间的数字,我们基本上是在说Input.GetAxis确定了我们想要前进的程度。 1或-1?向前还是向后?forward * 1forward * -1。侧移也是一样;right * 1right * -1


好的,我明白了,我需要根据物体的方向而不是世界的方向进行移动。然而,根据您建议的修改,它会抱怨无法将Vector3转换为Float。那么,如果引用游戏对象并将速度应用于该对象,可能会解决这个问题吗? - Jacine Yatrakos
抱歉,我匆忙写下了这段代码。它写得很糟糕,我会重新写一份更好的解释和可工作的代码。请稍等片刻。 - Fredrik Schön
是的,问题已经解决了。非常感谢你。 - Jacine Yatrakos
太好了!如果答案回答问题正确,请不要忘记接受答案!=) - Fredrik Schön

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接