Rotate to 0

Hi,

I have a spaceship that rotates on the z axis with a max of 30 degrees when the Horizontal axis is held down to give the effect of roll like an airplane. How can I make my object rotate back to 0 degrees when the Horizontal axis is released? So the object only rotates while the left/right keys are held and then it slowly rotates back to 0 when these keys are let go?

Cheers.

1 Answer

1

How about this- instead of using the Horizontal axis directly, have the Horizontal axis define a “target roll”- this determines how far you want the spaceship to bank. Then in your Update function interpolate between your current roll and the target roll using a function like Mathf.Lerp or Vector3.Lerp. Or, better still, you could weight it so that the interpolation amount changes depending on how much of the axis is pressed- so that if the axis is at full lock it interpolates fast, and if the axis is at zero it interpolates slowly, something like this-

// This is the maximum angle that your ship will rotate to (assign it in editor)
public float maxAngle = 30;
// This is the stored angle that your ship is at
float currentAngle = 0;

void Update()
{

    // This makes your angle somewhere between -30 and 30 degrees
    float targetAngle = Input.GetAxis("Horizontal") * maxAngle;
    // This makes the interpolation faster when the input is pressed down,
    // making sure that the value is always positive.
    float interpolationSpeed = 1 + (Mathf.Abs(Input.GetAxis("Horizontal") * 10));

    // This smoothly sets the current angle based on the input
    currentAngle = Mathf.Lerp(currentAngle, targetAngle, interpolationSpeed);

   // replace this with however you implement the final value
   transform.rotation = Quaternion.Euler(0, 0, currentAngle);
}

Input.GetAxis("whatever") should return a value between 1 and -1. Have a look at how your axis is set up, and see if there's anything limiting its rotation!

@stuthemoo: Use comments if you need further information. The Answer button is dedicated for actual Answers to the question. If you have another question you should ask a new seperate question. If you need more help with this question use comments or edit your question to improve it.

Put Debug.Log lines inbetween every line of code- this way you can find out exactly what is happening everywhere! I don't know why it isn't working properly- unless I had the code right in front of me, I can't work out what the problem is. How are you implementing the final value?

I just realised what the problem was, and it's entirely my fault. I've updated my post with the correct code, and I apologise for not getting this right 4 days ago! To elaborate, the problem was in the InterpolationSpeed variable- I was accidentally making it negative if the player moved to the left! This would result in the player moving in the exact wrong direction!

Thanks! This is exactly what I was looking for!