- Home /
Smooth mouse look
Ok, in the Standard Assets, you can find a prefab - First Person Controller - This prefab has a standard script attached to it, called Mouse Look (Script). I am looking for some way to change it, or make a new one, where the camera will smoothly look around when the mouse is moved I am new with unity and scripting, so any advice will be helpful, and pls explain clearly thankyou in advance!
what do you mean by smooth and what are your exact goals/problems? You can for starters duplicate the original script, rename it and open it up in $$anonymous$$ono or a text editor to see what the script is doing.
The original script is rigid, and follows the mouse exactly, i want a script, that will drag the camera , and "smoothen" its movements, to make it look more realistic. when i say smooth, i mean that if the mouse is moved, then the camera will begin to move slowly, gain speed, then slow down and stop The normal script simply makes the camera move at the same uniform speed as the mouse was moved.
Answer by aweirdthing · Oct 08, 2011 at 06:22 PM
hey, iv solved the problem: i attached this script to the character, and set the target to the head bone :
var target : Transform; var distance = -2.0;
var xSpeed = 750.0; var ySpeed = 120.0;
var yMinLimit = -40; var yMaxLimit = 80;
private var x = 0.0; private var y = 0.0;
var smoothTime = 0.3;
private var xSmooth = 0.0; private var ySmooth = 0.0; private var xVelocity = 0.0; private var yVelocity = 0.0;
private var posSmooth = Vector3.zero; private var posVelocity = Vector3.zero;
@script AddComponentMenu("Camera-Control/Mouse Orbit smoothed")
function Start () { var angles = transform.eulerAngles; x = angles.y; y = angles.x;
// Make the rigid body not change rotation
if (rigidbody)
rigidbody.freezeRotation = true;
}
function LateUpdate () { if (target) { x += Input.GetAxis("Mouse X") xSpeed 0.02; y -= Input.GetAxis("Mouse Y") ySpeed 0.02;
xSmooth = Mathf.SmoothDamp(xSmooth, x, xVelocity, smoothTime);
ySmooth = Mathf.SmoothDamp(ySmooth, y, yVelocity, smoothTime);
ySmooth = ClampAngle(ySmooth, yMinLimit, yMaxLimit);
var rotation = Quaternion.Euler(ySmooth, xSmooth, 0);
// posSmooth = Vector3.SmoothDamp(posSmooth,target.position,posVelocity,smoothTime);
posSmooth = target.position; // no follow smoothing
transform.rotation = rotation;
transform.position = rotation * Vector3(0.0, 0.0, -distance) + posSmooth;
}
}
static function ClampAngle (angle : float, min : float, max : float) { if (angle < -360) angle += 360; if (angle > 360) angle -= 360; return Mathf.Clamp (angle, min, max); }
Incase u are wondering, i got this script from this question:
http://answers.unity3d.com/questions/64873/smooth-mouse-orbit.html
All i did, was change the settings around, so that it could be used for a First Person Controller
Answer by Martijn Hendriks · Oct 01, 2011 at 08:00 PM
I haven't tested this myself, but you could try to adjust the angular drag of the Rigidbody attached to the CharacterController.
controller.attachedRigidbody.angularDrag = 10;
where should i put this? The character controller isnt a script
Answer by aweirdthing · Oct 08, 2011 at 03:46 PM
Thankyou guys for the answers, but i do not know what to do with the scripts u have given me (like i said, i am a complete novicec at this) Right now i am using the simple MouseLook script, and i do not know how to incorporate the scripts you have given me. could u help? maybe give some script that i could just attach to the camera?
Answer by MountDoomTeam · Oct 15, 2012 at 11:41 AM
if you look on Unity Wiki there is a SmoothMouseLook copy of the MouseLook.cs from unity.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[AddComponentMenu("Camera-Control/Smooth Mouse Look")]
public class SmoothMouseLook : 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;
float rotationX = 0F;
float rotationY = 0F;
private List<float> rotArrayX = new List<float>();
float rotAverageX = 0F;
private List<float> rotArrayY = new List<float>();
float rotAverageY = 0F;
public float frameCounter = 20;
Quaternion originalRotation;
void Update ()
{
if (axes == RotationAxes.MouseXAndY)
{
rotAverageY = 0f;
rotAverageX = 0f;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationX += Input.GetAxis("Mouse X") * sensitivityX;
rotArrayY.Add(rotationY);
rotArrayX.Add(rotationX);
if (rotArrayY.Count >= frameCounter) {
rotArrayY.RemoveAt(0);
}
if (rotArrayX.Count >= frameCounter) {
rotArrayX.RemoveAt(0);
}
for(int j = 0; j < rotArrayY.Count; j++) {
rotAverageY += rotArrayY[j];
}
for(int i = 0; i < rotArrayX.Count; i++) {
rotAverageX += rotArrayX[i];
}
rotAverageY /= rotArrayY.Count;
rotAverageX /= rotArrayX.Count;
rotAverageY = ClampAngle (rotAverageY, minimumY, maximumY);
rotAverageX = ClampAngle (rotAverageX, minimumX, maximumX);
Quaternion yQuaternion = Quaternion.AngleAxis (rotAverageY, Vector3.left);
Quaternion xQuaternion = Quaternion.AngleAxis (rotAverageX, Vector3.up);
transform.localRotation = originalRotation * xQuaternion * yQuaternion;
}
else if (axes == RotationAxes.MouseX)
{
rotAverageX = 0f;
rotationX += Input.GetAxis("Mouse X") * sensitivityX;
rotArrayX.Add(rotationX);
if (rotArrayX.Count >= frameCounter) {
rotArrayX.RemoveAt(0);
}
for(int i = 0; i < rotArrayX.Count; i++) {
rotAverageX += rotArrayX[i];
}
rotAverageX /= rotArrayX.Count;
rotAverageX = ClampAngle (rotAverageX, minimumX, maximumX);
Quaternion xQuaternion = Quaternion.AngleAxis (rotAverageX, Vector3.up);
transform.localRotation = originalRotation * xQuaternion;
}
else
{
rotAverageY = 0f;
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotArrayY.Add(rotationY);
if (rotArrayY.Count >= frameCounter) {
rotArrayY.RemoveAt(0);
}
for(int j = 0; j < rotArrayY.Count; j++) {
rotAverageY += rotArrayY[j];
}
rotAverageY /= rotArrayY.Count;
rotAverageY = ClampAngle (rotAverageY, minimumY, maximumY);
Quaternion yQuaternion = Quaternion.AngleAxis (rotAverageY, Vector3.left);
transform.localRotation = originalRotation * yQuaternion;
}
}
void Start ()
{
if (rigidbody)
rigidbody.freezeRotation = true;
originalRotation = transform.localRotation;
}
public static float ClampAngle (float angle, float min, float max)
{
angle = angle % 360;
if ((angle >= -360F) && (angle <= 360F)) {
if (angle < -360F) {
angle += 360F;
}
if (angle > 360F) {
angle -= 360F;
}
}
return Mathf.Clamp (angle, min, max);
}
}
That $$anonymous$$ouse Script sucks! The motion is extremely laggy and keeps moving even after you stopped moving the mouse, completely unusable.