Vic Wild
Vic Wild

Reputation: 87

Unity forward position = camera angle

Hi I am very new to Unity and only got basic knowledge. I created a player who can move and also a camera which follows the player and according to the mouseX and mouseY acis the camera rotates. Now I want the camera rotation angle to be the forward position.

If the player press w he moves along x acis but if the camera angle change and the player press w it should move into this direction. player.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DoublePlayer : MonoBehaviour
{
    private CharacterController _controller;
    public float _jumpHeight = 3f;
    [SerializeField]
    private float _moveSpeed = 5f;
    [SerializeField]
    private float _gravity = 9.81f;
    private float _directionY;
    void Start()
    {
        _controller = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update()
    {
        float horizontalInput = Input.GetAxis("Horizontal");
        float verticalInput = Input.GetAxis("Vertical");
        Vector3 direction = new Vector3(horizontalInput, 0, verticalInput);
        
        // set gravity
        _directionY -= _gravity * Time.deltaTime;
        direction.y = _directionY;

        _controller.Move(direction * _moveSpeed * Time.deltaTime);
    }
}

camera.cs

public class CameraController : MonoBehaviour
{
    public float RotationSpeed = 1;
    public Transform Target, Player;
    float mouseX, mouseY;
    void Start()
    {
        Cursor.visible = false;
        Cursor.lockState = CursorLockMode.Locked;
    }

    // Update is called once per frame
    void LateUpdate()
    {
        CamControl();
    }
    void CamControl()
    {
        mouseX += Input.GetAxis("Mouse X") * RotationSpeed;
        mouseY += Input.GetAxis("Mouse Y") * RotationSpeed;
        mouseY = Mathf.Clamp(mouseY, -35, 60);

        transform.LookAt(Target);

        Target.rotation = Quaternion.Euler(mouseY, mouseX, 0);
        Player.rotation = Quaternion.Euler(0, mouseX, 0);
    }
}

For Target and Player variable I selected the player object. Do someone has a simple solution I can understand?

Upvotes: 0

Views: 1076

Answers (2)

Ruzihm
Ruzihm

Reputation: 20249

Since you're getting the rotation directly from a Transform, you could use Transform.TransformDirection:

Vector3 rotatedDirection = transform.TransformDirection(direction);

Upvotes: 1

derHugo
derHugo

Reputation: 90580

You could simply take the direction and rotate it along with the object that component is attached to using Quaternion * Vector3 operator

var rotatedDirection = transform.rotation * direction;

Or if you rather need the orientation of the other script attached to a different object then do e.g.

// link your camera or whatever shall be used for the orientation via the Inspector
[SerializeField] private Transform directionProvider;

and then

var rotatedDirection = directionProvider.rotation * direction;

Upvotes: 1

Related Questions