在Unity中获得WASD键跟随摄像机旋转的功能

问题描述 投票:-2回答:1

我知道网上有很多答案,但我无法将它们正确地应用到我的代码中.我已经尝试使用预制的玩家资产,但无法让它工作。

    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;
c# unity3d trigonometry
1个回答
0
投票

假设这里的 "Camera "等于 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.