Here’s the script, it doesn’t work if I set wasShooting to false when I’m not shooting anymore
using UnityEngine;
using System.Collections;
/// MouseLook rotates the transform based on the mouse delta.
/// Minimum and Maximum values can be used to constrain the possible rotation
/// To make an FPS style character:
/// - Create a capsule.
/// - Add the MouseLook script to the capsule.
/// -> Set the mouse look to use LookX. (You want to only turn character but not tilt it)
/// - Add FPSInputController script to the capsule
/// -> A CharacterMotor and a CharacterController component will be automatically added.
/// - Create a camera. Make the camera a child of the capsule. Reset it's transform.
/// - Add a MouseLook script to the camera.
/// -> Set the mouse look to use LookY. (You want the camera to tilt up and down like a head. The character already turns.)
[AddComponentMenu("Camera-Control/Mouse Look")]
public class MouseLook : MonoBehaviour {
public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
public RotationAxes axes = RotationAxes.MouseXAndY;
public float sensitivityX = 15F;
public float sensitivityY = 15F;
public float minimumX = -360F;
public float maximumX = 360F;
public float minimumY = -60F;
public float maximumY = 60F;
bool wasShooting = false;
public GameObject camera;
float oldRotation;
float time = 0;
float rotationY = 0F;
void Update ()
{
if(!wasShooting)
{
oldRotation = rotationY;
}
if(Input.GetKey(KeyCode.Mouse0))
{
wasShooting = true;
rotationY += 10.0f * Time.deltaTime;
}
else
if(!Input.GetKey(KeyCode.Mouse0) && wasShooting)
{
rotationY = oldRotation;
wasShooting = false; //here it doesn't work
}
if(Input.GetKey(KeyCode.Mouse1))
{
sensitivityX = 5.0f;
sensitivityY = 5.0f;
}
else
{
sensitivityX = 15f;
sensitivityY = 15f;
}
if (axes == RotationAxes.MouseXAndY)
{
float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
else if (axes == RotationAxes.MouseX)
{
transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);
}
else
{
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0);
}
}
void Start ()
{
// Make the rigid body not change rotation
if (GetComponent<Rigidbody>())
GetComponent<Rigidbody>().freezeRotation = true;
}
}
I’m stupid and I forgot to add the old version of the script.
Instead of rotationY = oldRotation I want to use rotationY = Mathf.Lerp(rotationY, oldRotation, 20.0f * Time.deltaTime); but it never works, the camera doesn’t got back to its rotation when I’m not shooting.
Updated code
using UnityEngine;
using System.Collections;
/// MouseLook rotates the transform based on the mouse delta.
/// Minimum and Maximum values can be used to constrain the possible rotation
/// To make an FPS style character:
/// - Create a capsule.
/// - Add the MouseLook script to the capsule.
/// -> Set the mouse look to use LookX. (You want to only turn character but not tilt it)
/// - Add FPSInputController script to the capsule
/// -> A CharacterMotor and a CharacterController component will be automatically added.
/// - Create a camera. Make the camera a child of the capsule. Reset it's transform.
/// - Add a MouseLook script to the camera.
/// -> Set the mouse look to use LookY. (You want the camera to tilt up and down like a head. The character already turns.)
[AddComponentMenu("Camera-Control/Mouse Look")]
public class MouseLook : MonoBehaviour {
public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
public RotationAxes axes = RotationAxes.MouseXAndY;
public float sensitivityX = 15F;
public float sensitivityY = 15F;
public float minimumX = -360F;
public float maximumX = 360F;
public float minimumY = -60F;
public float maximumY = 60F;
bool wasShooting = false;
public GameObject camera;
float oldRotation;
float time = 0;
float rotationY = 0F;
void Update ()
{
if(!wasShooting)
{
oldRotation = rotationY;
}
if(Input.GetKey(KeyCode.Mouse0))
{
wasShooting = true;
rotationY += 10.0f * Time.deltaTime;
}
else
if(!Input.GetKey(KeyCode.Mouse0) && wasShooting)
{
rotationY = Mathf.Lerp(rotationY, oldRotation, 20.0f * Time.deltaTime); //here it doesn't work
wasShooting = false;
}
if(Input.GetKey(KeyCode.Mouse1))
{
sensitivityX = 5.0f;
sensitivityY = 5.0f;
}
else
{
sensitivityX = 15f;
sensitivityY = 15f;
}
if (axes == RotationAxes.MouseXAndY)
{
float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
else if (axes == RotationAxes.MouseX)
{
transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);
}
else
{
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0);
}
}
void Start ()
{
// Make the rigid body not change rotation
if (GetComponent<Rigidbody>())
GetComponent<Rigidbody>().freezeRotation = true;
}
}
That’s not how you use Lerp. The last argument is supposed to be between 0 and 1 and represents the “percentage” between each of the first 2 values to use. It doesn’t work because you’re using 20 * deltaTime which will always be a small number and therefore always be close to whatever your first argument is.
You can either reset rotationY to be the current rotation or add 20 * deltaTime to a new variable each frame as your third argument.
using UnityEngine;
using System.Collections;
/// MouseLook rotates the transform based on the mouse delta.
/// Minimum and Maximum values can be used to constrain the possible rotation
/// To make an FPS style character:
/// - Create a capsule.
/// - Add the MouseLook script to the capsule.
/// -> Set the mouse look to use LookX. (You want to only turn character but not tilt it)
/// - Add FPSInputController script to the capsule
/// -> A CharacterMotor and a CharacterController component will be automatically added.
/// - Create a camera. Make the camera a child of the capsule. Reset it's transform.
/// - Add a MouseLook script to the camera.
/// -> Set the mouse look to use LookY. (You want the camera to tilt up and down like a head. The character already turns.)
[AddComponentMenu("Camera-Control/Mouse Look")]
public class MouseLook : MonoBehaviour {
public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
public RotationAxes axes = RotationAxes.MouseXAndY;
public float sensitivityX = 15F;
public float sensitivityY = 15F;
public float minimumX = -360F;
public float maximumX = 360F;
public float minimumY = -60F;
public float maximumY = 60F;
bool wasShooting = false;
public GameObject camera;
float oldRotation;
float time = 0;
float rotationY = 0F;
void Update ()
{
if(!wasShooting)
{
oldRotation = rotationY;
}
if(Input.GetKey(KeyCode.Mouse0))
{
wasShooting = true;
rotationY += 10.0f * Time.deltaTime;
}
else
if(!Input.GetKey(KeyCode.Mouse0) && wasShooting)
{
rotationY = Mathf.Lerp(rotationY, oldRotation, Time.deltaTime * 5.0f); //here it doesn't work
}
if(Input.GetKey(KeyCode.Mouse1))
{
sensitivityX = 5.0f;
sensitivityY = 5.0f;
}
else
{
sensitivityX = 15f;
sensitivityY = 15f;
}
if (axes == RotationAxes.MouseXAndY)
{
float rotationX = transform.localEulerAngles.y + Input.GetAxis("Mouse X") * sensitivityX;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
else if (axes == RotationAxes.MouseX)
{
transform.Rotate(0, Input.GetAxis("Mouse X") * sensitivityX, 0);
}
else
{
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0);
}
}
void Start ()
{
// Make the rigid body not change rotation
if (GetComponent<Rigidbody>())
GetComponent<Rigidbody>().freezeRotation = true;
}
}
you also might want to spend some time cleaning it up, its quite hard to read
It works now but due to wasShooting being always true after the mouse button is pressed when I move the camera it goes back to its rotation even if I stopped shooting.