- Home /
VSync and Joysticks
When I choose a quality setting (e.g. simple) in which VSync is disabled, the alternate (360 pad) right thumbstick - which is otherwise recognized quite well by the stock MouseLook - suddenly becomes very sensitive, causing rapid spins. The mouse, however, still works the same. I'm assuming the extra frames are causing extra detections due to the continuous nature of thumbstick input. Below is a screenshot of my thumbstick settings (the original Mouse X and Y are still there as well). I'd certainly appreciate any input (no pun intended).
Also, is there a way to reorder the input list? It's rather inconvenient for my new interact key to be at the bottom of the input list, below the joystick bindings.
How does your code looks like that uses this axis? Do you use Time.deltaTime?
Currently, I'm using the stock $$anonymous$$ouseLook script found in the standard assets (which doesn't use Time.deltaTime). For quick reference, this is the script's contents:
using UnityEngine; using System.Collections;
/// $$anonymous$$ouseLook rotates the transform based on the mouse delta. /// $$anonymous$$inimum and $$anonymous$$aximum values can be used to constrain the possible rotation
/// To make an FPS style character: /// - Create a capsule. /// - Add the $$anonymous$$ouseLook script to the capsule. /// -> Set the mouse look to use LookX. (You want to only turn character but not tilt it) /// - Add FPSInputController script to the capsule /// -> A Character$$anonymous$$otor and a CharacterController component will be automatically added.
/// - Create a camera. $$anonymous$$ake the camera a child of the capsule. Reset it's transform. /// - Add a $$anonymous$$ouseLook script to the camera. /// -> Set the mouse look to use LookY. (You want the camera to tilt up and down like a head. The character already turns.) [AddComponent$$anonymous$$enu("Camera-Control/$$anonymous$$ouse Look")] public class $$anonymous$$ouseLook : $$anonymous$$onoBehaviour {
public enum RotationAxes { $$anonymous$$ouseXAndY = 0, $$anonymous$$ouseX = 1, $$anonymous$$ouseY = 2 }
public RotationAxes axes = RotationAxes.$$anonymous$$ouseXAndY;
public float sensitivityX = 15F;
public float sensitivityY = 15F;
public float $$anonymous$$imumX = -360F;
public float maximumX = 360F;
public float $$anonymous$$imumY = -60F;
public float maximumY = 60F;
float rotationY = 0F;
void Update ()
{
if (axes == RotationAxes.$$anonymous$$ouseXAndY)
{
float rotationX = transform.localEulerAngles.y + Input.GetAxis("$$anonymous$$ouse X") * sensitivityX;
rotationY += Input.GetAxis("$$anonymous$$ouse Y") * sensitivityY;
rotationY = $$anonymous$$athf.Clamp (rotationY, $$anonymous$$imumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, rotationX, 0);
}
else if (axes == RotationAxes.$$anonymous$$ouseX)
{
transform.Rotate(0, Input.GetAxis("$$anonymous$$ouse X") * sensitivityX, 0);
}
else
{
rotationY += Input.GetAxis("$$anonymous$$ouse Y") * sensitivityY;
rotationY = $$anonymous$$athf.Clamp (rotationY, $$anonymous$$imumY, maximumY);
transform.localEulerAngles = new Vector3(-rotationY, transform.localEulerAngles.y, 0);
}
}
void Start ()
{
// $$anonymous$$ake the rigid body not change rotation
if (rigidbody)
rigidbody.freezeRotation = true;
}
}
Answer by Bunny83 · Jul 27, 2012 at 09:54 AM
I don't have a controller to test this, but i'm pretty sure that a joystick has absolute values which a mouse is a delta-movement device. The mouse axis returns the movement that has been done in the last frame. A joystick returns a constant value which tells you how much it's tilted.
I would handle those two inputs seperately. Create another input axis, add it to the movment script and use deltaTime for the joystick.
So it would look like this:
// [...]
rotationY += Input.GetAxis("Mouse Y") * sensitivityY;
rotationY += Input.GetAxis("Joystick Y") * sensitivityY * Time.deltaTime;
rotationY = Mathf.Clamp (rotationY, minimumY, maximumY);
// [...]
You might want a seperate sensitivity value, but if you use only one input an a time, it doesn't matter (as long as the user can configure it ;) ).
Exclamation point! Before asking this question, I tried multiplying by deltaTime only to have the mouse affected; splitting the two never occurred to me for some reason. After splitting them, I added a constant *60 multiplier (to offset the slowness caused by multiplying by deltaTime), and, for the most part, everything went smoothly (I need to add some smoothing to the pad, but it's great otherwise).
Thanks for the help!