How to mix 3 player controller scripts for a 3D isometric game
Hello everyone,
I'm currently struggling with my project of 3D isometric voxel game, i have 3 scripts and i want to mix them up so i can have a working player controller. With this first script i can rotate my character depending on the mouse location
 using UnityEngine;
 
 public class PlayerTurning : MonoBehaviour
 {
 
     Rigidbody playerRigidbody;          // Reference to the player's rigidbody.
     int floorMask;                      // A layer mask so that a ray can be cast just at gameobjects on the floor layer.
     float camRayLength = 100000f;          // The length of the ray from the camera into the scene.
 
     void Awake()
     {
         // Create a layer mask for the floor layer.
         floorMask = LayerMask.GetMask("Floor");
 
         // Set up references.
         playerRigidbody = GetComponent<Rigidbody>();
     }
 
 
     void FixedUpdate()
     {
 
 
         // Turn the player to face the mouse cursor.
         Turning();
 
     }
 
     void Turning()
     {
         // Create a ray from the mouse cursor on screen in the direction of the camera.
         Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);
 
         // Create a RaycastHit variable to store information about what was hit by the ray.
         RaycastHit floorHit;
 
         // Perform the raycast and if it hits something on the floor layer...
         if (Physics.Raycast(camRay, out floorHit, camRayLength, floorMask))
         {
             // Create a vector from the player to the point on the floor the raycast from the mouse hit.
             Vector3 playerToMouse = floorHit.point - transform.position;
 
             // Ensure the vector is entirely along the floor plane.
             playerToMouse.y = 0f;
 
             // Create a quaternion (rotation) based on looking down the vector from the player to the mouse.
             Quaternion newRotation = Quaternion.LookRotation(playerToMouse);
 
             // Set the player's rotation to this new rotation.
             playerRigidbody.MoveRotation(newRotation);
         }
     }
 
 }
 
               With this second i can go make my character move UP the screen and not UPPER RIGHT direction (as DOWN and not LOWER LEFT) But ! And here is my problem : when i move my character, the first script doesn't work and my character faces the direction he is going to. So i can't move and face the direction i aim with my mouse ...
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class PlayerMovement : MonoBehaviour {
 
     [SerializeField]
     float movespeed = 4f;
 
     Vector3 forward, right;
 
     void Start ()
     {
         forward = Camera.main.transform.forward;
         forward.y = 0;
         forward = Vector3.Normalize(forward);
         right = Quaternion.Euler(new Vector3(0, 90, 0)) * forward;
     }
     
 
     void Update ()
     {
         if (Input.anyKey)
             Move();
     }
 
     void Move()
    
     {
         Vector3 direction = new Vector3(Input.GetAxis("HorizontalKey"), 0, Input.GetAxis("VerticalKey"));
         Vector3 rightMovement = right * movespeed * Time.deltaTime * Input.GetAxis("HorizontalKey");
         Vector3 upMovement = forward * movespeed * Time.deltaTime * Input.GetAxis("VerticalKey");
 
         Vector3 heading = Vector3.Normalize(rightMovement + upMovement);
 
         transform.forward = heading;
         transform.position += rightMovement;
         transform.position += upMovement;
     }
 
 }
 
               Finally, i have this third script, with this one i can rotate as i want when i move but i'm going UPPER RIGHT and DOWN LEFT, i don't get the the improvement of the second script ...
 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;
 
 public class ItWorks : MonoBehaviour
 {
     public float speed = 6f;            // The speed that the player will move at.
 
     Vector3 movement;                   // The vector to store the direction of the player's movement.
     Animator anim;                      // Reference to the animator component.
     Rigidbody playerRigidbody;          // Reference to the player's rigidbody.
     int floorMask;                      // A layer mask so that a ray can be cast just at gameobjects on the floor layer.
     float camRayLength = 100f;          // The length of the ray from the camera into the scene.
 
     void Awake()
     {
         // Create a layer mask for the floor layer.
         floorMask = LayerMask.GetMask("Floor");
 
         // Set up references.
         anim = GetComponent<Animator>();
         playerRigidbody = GetComponent<Rigidbody>();
     }
 
 
     void FixedUpdate()
     {
         // Store the input axes.
         float h = Input.GetAxisRaw("Horizontal");
         float v = Input.GetAxisRaw("Vertical");
 
         // Move the player around the scene.
         Move(h, v);
 
         // Turn the player to face the mouse cursor.
         Turning();
 
         // Animate the player.
         Animating(h, v);
     }
 
     void Move(float h, float v)
     {
         // Set the movement vector based on the axis input.
         movement.Set(h, 0f, v);
 
         // Normalise the movement vector and make it proportional to the speed per second.
         movement = movement.normalized * speed * Time.deltaTime;
 
         // Move the player to it's current position plus the movement.
         playerRigidbody.MovePosition(transform.position + movement);
     }
 
     void Turning()
     {
         // Create a ray from the mouse cursor on screen in the direction of the camera.
         Ray camRay = Camera.main.ScreenPointToRay(Input.mousePosition);
 
         // Create a RaycastHit variable to store information about what was hit by the ray.
         RaycastHit floorHit;
 
         // Perform the raycast and if it hits something on the floor layer...
         if (Physics.Raycast(camRay, out floorHit, camRayLength, floorMask))
         {
             // Create a vector from the player to the point on the floor the raycast from the mouse hit.
             Vector3 playerToMouse = floorHit.point - transform.position;
 
             // Ensure the vector is entirely along the floor plane.
             playerToMouse.y = 0f;
 
             // Create a quaternion (rotation) based on looking down the vector from the player to the mouse.
             Quaternion newRotation = Quaternion.LookRotation(playerToMouse);
 
             // Set the player's rotation to this new rotation.
             playerRigidbody.MoveRotation(newRotation);
         }
     }
 
     void Animating(float h, float v)
     {
         // Create a boolean that is true if either of the input axes is non-zero.
         bool walking = h != 0f || v != 0f;
 
         // Tell the animator whether or not the player is walking.
         anim.SetBool("IsWalking", walking);
     }
 }
 
               I'm struggling with this and i don't know how to mix these script to get a fully working character controller with independant rotation, please can you help me to understand ? Thank you in advance :)
Your answer