Search Unity

[Help] Character controller will not rotate player correctly

Discussion in 'Scripting' started by Rocheofpower, Sep 18, 2019.

  1. Rocheofpower

    Rocheofpower

    Joined:
    Feb 5, 2018
    Posts:
    4
    I'm trying to develop a very basic 3rd person character controller, using a skinned mesh player from makehuman and Unities Character controller. The camera orbiting the player is a Cinemachine freelook camera.

    I've searched around youtube, the forum, unity answers etc but I can't seem to crack it, below is the code:

    Code (CSharp):
    1.  
    2. public class ThirdPersonMovement : MonoBehaviour
    3. {
    4.     public float speed = 8;
    5.     public CinemachineFreeLook freeLook;
    6.     private Vector3 movementVector;
    7.     private Quaternion slerpToRot;
    8.     [SerializeField] private float slerpSpeed = 2.0f;
    9.     private CharacterController charController;
    10.     private float gravity = 9.7f;
    11.  
    12.     private void Start()
    13.     {
    14.         charController = GetComponent<CharacterController>();
    15.     }
    16.  
    17.     private void Update()
    18.     {
    19.         MovePlayer();
    20.     }
    21.  
    22.     private void FixedUpdate()
    23.     {
    24.         RotatePlayer();
    25.     }
    26.     void MovePlayer()
    27.     {
    28.         movementVector.x = Input.GetAxis("Horizontal");
    29.         movementVector.y = 0.0f;
    30.         movementVector.z = Input.GetAxis("Vertical");
    31.         movementVector = movementVector.normalized * speed;
    32.         movementVector = transform.InverseTransformDirection(movementVector);
    33.  
    34.         movementVector.y -= gravity * Time.deltaTime;
    35.         charController.Move(movementVector * Time.deltaTime);
    36.     }
    37.  
    38.     void RotatePlayer()
    39.     {
    40.         slerpToRot = Quaternion.Euler(0, freeLook.m_XAxis.Value, 0.0f);
    41.         transform.rotation = Quaternion.Slerp(transform.rotation, slerpToRot, slerpSpeed * Time.fixedDeltaTime);
    42.     }
    43. }
    44.  
    This script is attached to the player, at the topmost Gameobject, also where the animator and character controller are.
    Initially the player can move vertically and horizontally without any issue, but once I rotate him 90 degrees the WASD input starts to work backwards ie left makes him go right etc.


    It's probably something simple I'm missing but if anyone can help it's super appreciated.
     
  2. WarmedxMints

    WarmedxMints

    Joined:
    Feb 6, 2017
    Posts:
    1,035
    multiple the x and z by transforms right and forward vectors

    Code (CSharp):
    1.         void MovePlayer()
    2.         {
    3.             movementVector.x = Input.GetAxis("Horizontal");
    4.             movementVector.y = 0.0f;
    5.             movementVector.z = Input.GetAxis("Vertical");
    6.             movementVector = (transform.forward * movementVector.z) + (transform.right * movementVector.x);
    7.             movementVector = movementVector.normalized * speed;
    8.             movementVector = transform.InverseTransformDirection(movementVector);
    9.  
    10.             movementVector.y -= gravity * Time.deltaTime;
    11.             charController.Move(movementVector * Time.deltaTime);
    12.         }