- Home /
How to have free rotation camera?
Hi Unity Answers
So I'm trying to create an RTS style camera using the Camera linked to a Camera Rig. Included in this will be the option for the user to move around using WASD / arrows and rotate using Q&E. However, I also want to give the user the option to go into a sort of "free look" mode whenever they click and hold the scroll wheel (Mouse 2). I think the Q&E rotate and scroll wheel free look are conflicting as when I added the Q&E rotate option to my code, whenever I try playing in the scene, the free look always snaps back to the X axis rotation it began with.
It's worth pointing out that I'm relatively new to C# so I think the issue is me not understanding the Quaternion concept (last line of code) as when I // that out of the code, the Q&E keys no longer rotate, the camera but free look mode works perfectly. Any help or signposting would be greatly appreciated!
Here's the code:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraController : MonoBehaviour
{
public float normalSpeed;
public float fastSpeed;
public float movementSpeed;
public float movementTime;
public float rotationAmount;
public Vector3 newPosition;
public Quaternion newRotation;
public float freeLookSensitivity = 3f;
private bool looking = false;
// Start is called before the first frame update
void Start()
{
newPosition = transform.position;
newRotation = transform.rotation;
}
// Update is called once per frame
void Update()
{
HandleMovementInput();
if (looking)
{
float newRotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * freeLookSensitivity;
float newRotationY = transform.localEulerAngles.x - Input.GetAxis("Mouse Y") * freeLookSensitivity;
transform.localEulerAngles = new Vector3(newRotationY, newRotationX, 0f);
}
float axis = Input.GetAxis("Mouse ScrollWheel");
if (Input.GetKeyDown(KeyCode.Mouse2))
{
StartLooking();
}
else if (Input.GetKeyUp(KeyCode.Mouse2))
{
StopLooking();
}
}
void OnDisable()
{
StopLooking();
}
public void StartLooking()
{
looking = true;
Cursor.visible = false;
Cursor.lockState = CursorLockMode.Locked;
}
public void StopLooking()
{
looking = false;
Cursor.visible = true;
Cursor.lockState = CursorLockMode.None;
}
void HandleMovementInput()
{
if(Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift))
{
movementSpeed = fastSpeed;
}
else
{
movementSpeed = normalSpeed;
}
if(Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.UpArrow))
{
newPosition += (transform.forward * movementSpeed);
}
if(Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.DownArrow))
{
newPosition += (transform.forward * -movementSpeed);
}
if(Input.GetKey(KeyCode.D) || Input.GetKey(KeyCode.RightArrow))
{
newPosition += (transform.right * movementSpeed);
}
if(Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.LeftArrow))
{
newPosition += (transform.right * -movementSpeed);
}
if(Input.GetKey(KeyCode.Q))
{
newRotation *= Quaternion.Euler(Vector3.up * rotationAmount);
}
if (Input.GetKey(KeyCode.E))
{
newRotation *= Quaternion.Euler(Vector3.up * -rotationAmount);
}
transform.position = Vector3.Lerp(transform.position, newPosition, Time.deltaTime * movementTime);
transform.rotation = Quaternion.Lerp(transform.rotation, newRotation, Time.deltaTime * movementTime);
}
}
Answer by Z_Y_X · Jul 11, 2020 at 04:09 PM
Your camera's rotation always goes to newRotation (line 116).
Your tries to set another rotation, however camera rotates back, so to rotate camera you need to change newRotation not transform.rotation. Possible solution as you did:
if (looking)
{
float newRotationX = newRotation.eulerAngles.x + Input.GetAxis("Mouse Y") * freeLookSensitivity;
float newRotationY = newRotation.eulerAngles.y - Input.GetAxis("Mouse X") * freeLookSensitivity;
newRotation.eulerAngles = new Vector3(newRotationX, newRotationY, newRotation.eulerAngles.z);
}
as I like:
if (looking)
{
newRotation.eulerAngles += new Vector3(
Input.GetAxis("Mouse Y") * freeLookSensitivity,
-Input.GetAxis("Mouse X") * freeLookSensitivity,
0);
}
Now it works strange for me, so change axis as you need.
Your answer
Follow this Question
Related Questions
Camera gets stuck when cursor is locked 0 Answers
Camera movement and gun follow in unity 1 Answer
Camera follow a sphere which look at another object on the ground 0 Answers
Free camera look question 2 Answers
camera zoom 1 Answer