获取WASD键以跟随Unity中的相机旋转

时间:2020-06-01 20:57:29

标签: c# unity3d trigonometry

我知道在线上对此有很多答案,但是我无法将它们正确地应用于我的代码。 我尝试使用预制的播放器资产,但无法正常使用。

    Vector3 pos = transform.position;

    public float X;
    public float Y;
    public float Z;

// Used to tilt camera up and down
float tilt = 0;

        if (Input.GetMouseButton(1))
    {
        transform.Rotate(new Vector3(Input.GetAxis("Mouse Y") * panSpeed, Input.GetAxis("Mouse X") * panSpeed, 0));
        X = transform.rotation.eulerAngles.x;
        Y = transform.rotation.eulerAngles.y;
        Z = transform.rotation.eulerAngles.z;
        // Add current position of mouse input
        tilt += X;
        transform.rotation = Quaternion.Euler(0, Y, tilt);
    }

    //Spaceship does not go in direction it is facing once panned
    if (Input.GetKey("w"))
    {
        //transform.rotation = Quaternion.Euler(0, Y, tilt);
        pos.z += speed * Time.deltaTime;
    }
    if (Input.GetKey("s"))
    {
        pos.z -= speed * Time.deltaTime;
    }
    if (Input.GetKey("d"))
    {
        pos.x += speed * Time.deltaTime;
        // DEBUG Does not work properly while mouse held down
        //transform.Rotate(-1, 0, 0);
    }
    if (Input.GetKey("a"))
    {
        pos.x -= speed * Time.deltaTime;
    }

    transform.position = pos;

1 个答案:

答案 0 :(得分:0)

假设这里的“相机”等于transform,则只需使用其局部轴transform.forward

返回表示世界空间中变换的蓝轴的归一化向量。

transform.right

返回表示世界空间中变换红色轴的归一化向量。

例如

private void Update()
{
    if (Input.GetMouseButton(1))
    {
        // NOTE: I DON'T UNDERSTAND THIS CODE BLOCK YET
        // YOU KNOW E.G. THAT IF YOU "transform.eulerAngles.x" ALREADY IS "45°"
        // THE "tilt" WOULD JUMP EVERY FRAME IN HUGER STEPS (45 -> 90 -> 180 - 360 ....)

        // ALSO WHY ROTATE IN X AXIS IF AFTERWARDS YOU RESET THE X ROTATION
        // AND RATHER APPLY IT TO Z?

        transform.Rotate(new Vector3(Input.GetAxis("Mouse Y") * panSpeed, Input.GetAxis("Mouse X") * panSpeed, 0));
        X = transform.eulerAngles.x;
        Y = transform.eulerAngles.y;
        Z = transform.eulerAngles.z;
        // Add current position of mouse input
        tilt += X;
        transform.rotation = Quaternion.Euler(0, Y, tilt);
    }

    Vector3 movement = Vector3.zero;

    if (Input.GetKey(KeyCode.W))
    {
        movement += transform.forward;
    }
    if (Input.GetKey(KeyCode.S))
    {
        movement -= transform.forward;
    }
    if (Input.GetKey(KeyCode.D))
    {
        movement += transform.right;
    }
    if (Input.GetKey(KeyCode.A))
    {
        movement -= transform.right;
    }

    // I would do it like this to make sure that diagonal movement 
    // does not move faster
    transform.position = movement.normalized * speed * Time.deltaTime;
}