- Home /
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;
[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);
}
}
By the way, know this isn't the normal mouse look, it's another version of it.
Answer by aldonaletto · Aug 30, 2011 at 04:47 AM
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);
}
I'm using this for a Space Sim, so the space ship will be following the mouse. Well I tried it and it didn't work. It didn't make it better or worse, just stayed the same.
I haven't approached this question in a while, but right now, I'm using a java version of the mouselook. Here it is without the variables:
function Start (){
if (rigidbody) rigidbody.freezeRotation = true;
originalRotation = transform.localRotation;
}
function Update()
{
rotationX += Input.GetAxis("$$anonymous$$ouse X") * sensitivityX;
rotationY += Input.GetAxis("$$anonymous$$ouse Y") * sensitivityY;
if ((rotationX >= -360) && (rotationX <= 360)){
rotationX = $$anonymous$$athf.Clamp (rotationX, $$anonymous$$imumX, maximumX);
}else if (rotationX < -360){
rotationX = $$anonymous$$athf.Clamp (rotationX+360, $$anonymous$$imumX, maximumX);
}else{
rotationX = $$anonymous$$athf.Clamp (rotationX-360, $$anonymous$$imumX, maximumX);
}
if ((rotationY >= -360) && (rotationY <= 360)){
rotationY = $$anonymous$$athf.Clamp (rotationY, $$anonymous$$imumY, maximumY);
}else if (rotationY < -360){
rotationY = $$anonymous$$athf.Clamp (rotationY+360, $$anonymous$$imumY, maximumY);
}else{
rotationY = $$anonymous$$athf.Clamp (rotationY-360, $$anonymous$$imumY, maximumY);
}
xQuaternion = Quaternion.AngleAxis (rotationX, Vector3.up);
yQuaternion = Quaternion.AngleAxis (rotationY, Vector3.left);
transform.localRotation = originalRotation * xQuaternion * yQuaternion;
How is your game? 2D? If so, is the camera pointing the Z axis or -Y? Is it top-down? Post a screenshot in your question.
I posted the screenshots in the bottom of the question. To answer your question, it's 3D space sim, and so the camera is pointing at no specific axis.
Your answer
Follow this Question
Related Questions
Rotate to mouse cursor error 1 Answer
Huh click and go script working 50% 0 Answers
Cursor/Mouse movement to controller 0 Answers
'Camera' does not contain a definition for 'ScreenPointToRay' 1 Answer
Rotate and Move towards Mouse Point 0 Answers