1 // From: https://wiki.unity3d.com/index.php/SmoothMouseLook
3 // 1. Namespace to prevent conflicts.
4 // 2. Only checks Mouse X and Mouse Y inputs.
6 namespace PixelCrushers.SceneStreamer.Example
9 using System.Collections;
10 using System.Collections.Generic;
12 [AddComponentMenu("Camera-Control/Smooth Mouse Look")]
13 public class SmoothMouseLook : MonoBehaviour
16 public enum RotationAxes { MouseXAndY = 0, MouseX = 1, MouseY = 2 }
17 public RotationAxes axes = RotationAxes.MouseXAndY;
18 public float sensitivityX = 15F;
19 public float sensitivityY = 15F;
21 public float minimumX = -360F;
22 public float maximumX = 360F;
24 public float minimumY = -60F;
25 public float maximumY = 60F;
30 private List<float> rotArrayX = new List<float>();
31 float rotAverageX = 0F;
33 private List<float> rotArrayY = new List<float>();
34 float rotAverageY = 0F;
36 public float frameCounter = 20;
38 Quaternion originalRotation;
43 if (axes == RotationAxes.MouseXAndY)
48 rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
49 rotationX += Input.GetAxis("Mouse X") * sensitivityX;
51 rotArrayY.Add(rotationY);
52 rotArrayX.Add(rotationX);
54 if (rotArrayY.Count >= frameCounter)
56 rotArrayY.RemoveAt(0);
58 if (rotArrayX.Count >= frameCounter)
60 rotArrayX.RemoveAt(0);
63 for (int j = 0; j < rotArrayY.Count; j++)
65 rotAverageY += rotArrayY[j];
67 for (int i = 0; i < rotArrayX.Count; i++)
69 rotAverageX += rotArrayX[i];
72 rotAverageY /= rotArrayY.Count;
73 rotAverageX /= rotArrayX.Count;
75 rotAverageY = ClampAngle(rotAverageY, minimumY, maximumY);
76 rotAverageX = ClampAngle(rotAverageX, minimumX, maximumX);
78 Quaternion yQuaternion = Quaternion.AngleAxis(rotAverageY, Vector3.left);
79 Quaternion xQuaternion = Quaternion.AngleAxis(rotAverageX, Vector3.up);
81 transform.localRotation = originalRotation * xQuaternion * yQuaternion;
83 else if (axes == RotationAxes.MouseX)
87 rotationX += Input.GetAxis("Mouse X") * sensitivityX;
89 rotArrayX.Add(rotationX);
91 if (rotArrayX.Count >= frameCounter)
93 rotArrayX.RemoveAt(0);
95 for (int i = 0; i < rotArrayX.Count; i++)
97 rotAverageX += rotArrayX[i];
99 rotAverageX /= rotArrayX.Count;
101 rotAverageX = ClampAngle(rotAverageX, minimumX, maximumX);
103 Quaternion xQuaternion = Quaternion.AngleAxis(rotAverageX, Vector3.up);
104 transform.localRotation = originalRotation * xQuaternion;
110 rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
112 rotArrayY.Add(rotationY);
114 if (rotArrayY.Count >= frameCounter)
116 rotArrayY.RemoveAt(0);
118 for (int j = 0; j < rotArrayY.Count; j++)
120 rotAverageY += rotArrayY[j];
122 rotAverageY /= rotArrayY.Count;
124 rotAverageY = ClampAngle(rotAverageY, minimumY, maximumY);
126 Quaternion yQuaternion = Quaternion.AngleAxis(rotAverageY, Vector3.left);
127 transform.localRotation = originalRotation * yQuaternion;
133 Rigidbody rb = GetComponent<Rigidbody>();
135 rb.freezeRotation = true;
136 originalRotation = transform.localRotation;
137 Cursor.visible = false;
138 Cursor.lockState = CursorLockMode.Locked;
141 public static float ClampAngle(float angle, float min, float max)
144 if ((angle >= -360F) && (angle <= 360F))
155 return Mathf.Clamp(angle, min, max);