Unity3D - 为什么我的播放器无法正常旋转?

时间:2018-04-05 14:51:32

标签: c# unity3d

我正在构建一个自上而下的射击游戏,因此我将相机放在我的播放器和地图上方。这是我在播放器控制器脚本中编写的用于移动的代码:

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键移动播放器,并按照鼠标所在的方向旋转,但是我不希望播放器的旋转改变键的方向,I如果按下W键无论玩家面对哪个方向,都需要玩家向前移动。

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

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

问题是你的transform.Translate调用是在&#34; self&#34;空间。前向,后向,左,右都是相对于变换面向的方向。这就是为什么你的玩家相对于面向方向移动的原因。

如果你想翻译相对于&#34;全球&#34;或者&#34;世界&#34;空间,你必须添加一个额外的参数。

// 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

答案 1 :(得分:0)

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

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

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