Home > OS >  How to add relative movement to multiple virtual cameras?
How to add relative movement to multiple virtual cameras?

Time:05-20

I am using a Cinemachine state driver to transition between my 8 directional cameras orbiting my player. Right now my player script is set to a basic isometric character controller:

Player.cs

    public float speed = 5f;
    Vector3 forward;
    Vector3 right;

    // Start is called before the first frame update
    void Start()
    {
        forward = Camera.main.transform.forward;
        forward.y = 0;
        forward = Vector3.Normalize(forward);
        right = Quaternion.Euler(new Vector3(0, 90, 0)) * forward;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.anyKey)
        {
            Move();
        }

    }

    void Move ()
    {
        Vector3 direction = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
        Vector3 rightMovement = right * speed * Time.deltaTime * Input.GetAxis("Horizontal");
        Vector3 upMovement = forward * speed * Time.deltaTime * Input.GetAxis("Vertical");

        Vector3 heading = Vector3.Normalize(rightMovement   upMovement);
        transform.forward  = heading;
        transform.position  = rightMovement;
        transform.position  = upMovement;
    }

enter image description here I want the players move direction to reflect the direction of the camera. For example, using W (from WASD) will always move the player up. Could I edit the script to pick up the direction of each of my virtual cameras and add that to my player controller or is there a better way?

CodePudding user response:

To solve this problem you have to change the movement of the keys according to the angle of the camera. This is done as follows with transform.TransformDirection. When the movement is synchronized with the direction of the camera, it causes the W key to press the character towards the ground, because the angle in front of the camera is inside the ground. To solve the problem, we set y to zero and then normalize the axis.

public float speed = 10f;
void Update()
{
    var moveInput = new Vector3(Input.GetAxis("Horizontal"), 0f , Input.GetAxis("Vertical"));

    moveInput = Camera.main.transform.TransformDirection(moveInput);
    moveInput.y = 0;
    moveInput = moveInput.normalized;
    
    transform.position  = moveInput * Time.deltaTime * speed;
}
  • Related