non bee
non bee

Reputation: 13

Unity3D - Why doesn't my player rotate properly?

I'm building a top down shooter and so I have my camera above my player and the map. Here's the code I've written in the player controller script for movement:

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));
        }

    }

}

I want to be able to move the player using the WASD keys and also rotate following the direction on where the mouse is, however I don't want the rotation of the player to change the direction of the keys, I need the player to move forwards if the W key is pressed no matter which way the player is facing.

However for some reason my code makes the player move forwards depending on which way it is facing which I don't want.

How can I fix this?

Upvotes: 1

Views: 1563

Answers (2)

avariant
avariant

Reputation: 2300

The problem is that your transform.Translate call is in "self" space. Forward, backward, left, right are all relative to the direction the transform is facing. That is why your player is moving relative to the facing direction.

If you want to translate relative to "global" or "world" space, you have to add an additional parameter.

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

Note the Space.World parameter at the end, to set the world coordinate system. You can find more in the Unity docs here: https://docs.unity3d.com/ScriptReference/Transform.Translate.html

Upvotes: 2

James
James

Reputation: 85

You need to look at the difference between local and global coordinate systems.

Right now your WASD keys are moving the player character according to global coordinates, and you want the WASD movement to be dependant on the player's orientation so you need to use a local coordinate system.

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

Upvotes: 0

Related Questions