x


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!

more ▼

asked Oct 01 '11 at 02:44 PM

aweirdthing gravatar image

aweirdthing
1 4 4 5

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 Mono or a text editor to see what the script is doing.

Oct 01 '11 at 05:45 PM Martijn Hendriks

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.

Oct 01 '11 at 07:23 PM aweirdthing
(comments are locked)
10|3000 characters needed characters left

4 answers: sort voted first

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

more ▼

answered Oct 08 '11 at 06:22 PM

aweirdthing gravatar image

aweirdthing
1 4 4 5

(comments are locked)
10|3000 characters needed characters left

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;
more ▼

answered Oct 01 '11 at 08:00 PM

Martijn Hendriks gravatar image

Martijn Hendriks
101 3 4 9

where should i put this? The character controller isnt a script

Oct 08 '11 at 03:34 PM aweirdthing
(comments are locked)
10|3000 characters needed characters left

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?

more ▼

answered Oct 08 '11 at 03:46 PM

aweirdthing gravatar image

aweirdthing
1 4 4 5

aweirdthing, you put your comment as an answer.

Oct 15 '12 at 11:42 AM ZoomDomain
(comments are locked)
10|3000 characters needed characters left

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);
    }
}
more ▼

answered Oct 15 '12 at 11:41 AM

ZoomDomain gravatar image

ZoomDomain
890 7 22 54

(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x3316
x327
x207
x87

asked: Oct 01 '11 at 02:44 PM

Seen: 3304 times

Last Updated: Oct 15 '12 at 11:42 AM