# Flight Sim Mouselook

I’m making a space sim. The problem is, the player uses the left and right arrow keys to change the ship rotation. When the player rotates, let’s say 180 degrees to the left so it’s upside down, if I move the mouse cursor up, the ship moves down. That’s because the mouselook script is translating the mouselook script so when the player moves cursor up on the screen, the player will move up on the y-axis. Same type of problem for the x-axis. So if the player is at a wierd angle, moving would be really hard. How should I fix this? (I’m a UnityScript guy and the mouselook is in C# so I can’t fix it myself):

Smooth Mouselook

``````using UnityEngine;
using System.Collections;
using System.Collections.Generic;

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;

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*;*
``````

}

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;

if (rotArrayX.Count >= frameCounter) {
rotArrayX.RemoveAt(0);
}
for(int i = 0; i < rotArrayX.Count; i++) {
rotAverageX += rotArrayX*;*
}
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;

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);
}
}
By the way, know this isn’t the normal mouse look, it’s another version of it.
[Here Are Some Screenshots][1]

For what are you using this MouseLook? It’s intended to control a first person camera, so it modifies the local rotation to keep the camera in the same character perspective. If you don’t want this, replace all localRotation with rotation. Depending on what you’re trying to do, it may solve your problems - or make them even worse, thus save a copy of your script before doing such a modification.

NOTE: Save it outside the Assets folder, or Unity will complain that are two scripts with the same name.

EDITED: I’m not sure if this is what you want, but this script rolls with left/right arrows, points up or down (local direction) with Mouse Y and turns left or right with Mouse X (local direction). Maybe the sensitivity should be adjusted in some axes (it’s 30 in all of them in this code).

```function Update(){

var pitch = Input.GetAxis("Mouse Y")*30*Time.deltaTime;
var roll = -Input.GetAxis("Horizontal")*30*Time.deltaTime;
var yaw = Input.GetAxis("Mouse X")*30*Time.deltaTime;
transform.Rotate(pitch, yaw, roll);
}
```