首页 文章

Unity3D - 为什么我的播放器不能正常旋转?

提问于
浏览
1

我正在 Build 一个自上而下的射手,所以我把我的相机放在我的播放器和 Map 上方 . 这是我在播放器控制器脚本中编写的用于移动的代码:

public class playerMovement : MonoBehaviour {

    public float speed;
    private Camera mainCamera;


    void Start () {
        mainCamera = FindObjectOfType<Camera>();
    }

    // Update is called once per frame
    void Update () {

        // player movement
        transform.Translate(speed * Input.GetAxis("Horizontal") * Time.deltaTime, 0f, speed * Input.GetAxis("Vertical") * Time.deltaTime);

        // Camera Ray casting

        Ray cameraRay = mainCamera.ScreenPointToRay(Input.mousePosition);
        Plane groundPlane = new Plane(Vector3.up, Vector3.zero);
        float rayLength;

        if (groundPlane.Raycast(cameraRay, out rayLength)) {
            Vector3 look = cameraRay.GetPoint(rayLength);
            Debug.DrawLine(cameraRay.origin, look, Color.red);

            transform.LookAt(new Vector3(look.x, transform.position.y, look.z));
        }

    }

}

我希望能够使用WASD键移动播放器并按照鼠标所在的方向旋转,但是我不希望播放器的旋转改变键的方向,我需要播放器移动如果按下W键,无论玩家面对哪个方向,都可以转发 .

但是由于某种原因,我的代码会让玩家向前移动,具体取决于我不想要的方式 .

我怎样才能解决这个问题?

2 回答

  • 2

    问题是你的transform.Translate调用是在“自我”空间 . 前向,后向,左,右都是相对于变换面向的方向 . 这就是为什么你的球员相对于面向方向移动的原因 .

    如果要相对于“全局”或“世界”空间进行转换,则必须添加其他参数 .

    // player movement
    transform.Translate(speed * Input.GetAxis("Horizontal") * Time.deltaTime, 
        0f, 
        speed * Input.GetAxis("Vertical") * Time.deltaTime, 
        Space.World);
    

    请注意最后的 Space.World 参数,以设置世界坐标系 . 您可以在Unity文档中找到更多信息:https://docs.unity3d.com/ScriptReference/Transform.Translate.html

  • 0

    您需要查看局部坐标系和全局坐标系之间的区别 .

    现在您的WASD键正在根据全局坐标移动玩家角色,并且您希望WASD移动取决于玩家的方向,因此您需要使用本地坐标系 .

    http://wiki.unity3d.com/index.php?title=Converting_Between_Coordinate_Systems

相关问题