Hi, I have a problem with rotation or most Specifically Euler Angels, I want to put an if statement that says if the X rotation is smaller than 90 then you can execute the if statement so I wrote
if (transform.localEulerAngels.x <90)
{
// orders
}
but when the game object Euler angel on the Xaxis is after 90 degree the X value Starts decreasing and the if statement orders continue and the script fails, anybody has a good idea on how to do it, and thanks.
[This is my script]
using UnityEngine;
public class Air_Plane_Script : MonoBehaviour {
public float RollSpeed;
public float PitchSpeed;
public float PlaneSpeed;
public float Gravity;
public float DesiredRotationX;
private float RollInput;
private float PitchInput;
public float YawSpeed;
private bool Change = true;
void Update()
{
ApplyPlaneControls();
ApplyPlanePhysics();
}
void ApplyPlaneControls()
{
transform.position += transform.forward * PlaneSpeed*Time.deltaTime;
RollInput = Input.GetAxisRaw("Horizontal")*RollSpeed*Time.deltaTime;
PitchInput = Input.GetAxisRaw("Vertical")*PitchSpeed*Time.deltaTime;
transform.Rotate(PitchInput,YawSpeed,RollInput);
}
void ApplyPlanePhysics()
{
PlaneSpeed = transform.forward.y * Gravity * Time.deltaTime;
if (PlaneSpeed < 10 && // Here is where i want to put the if statement that i asked the question for)
{
Change = false;
DesiredRotationX += 50f * Time.deltaTime;
transform.localEulerAngles = new Vector3(DesiredRotationX, transform.localEulerAngles.y,transform.localEulerAngles.z);
}
else
{
Change = true;
}
if (PlaneSpeed < 1)
{
PlaneSpeed = 1;
}
}
}
The problem with rotations is that are not straightforward in the 3d plane. There can be more than one euler angles representation to notate the same rotation in 3D. Thats why unity uses Quaternions to represent the angles.
What i guess is happening to you is the following: After you manually change your euler angles in transform.localEulerAngles = new Vector3(DesiredRotationX, transform.localEulerAngles.y,transform.localEulerAngles.z);
, unity recalculate them in terms of quaternions and in some cases (that are not arbitrary) your angles get flipped in some way that leads you to the same rotation but with a different eulerAngles.x
.
In the next iterarion, when you ask for the rotation in the x axis you are not guaranteed to get the same x value that u have set before.
How to solve the problem. (Note that this will work only for 1 axis rotation. I encourage you to use Quaternions instead of euler angles for 3d rotations. )
Lets say u know your default euler angles for Y and Z are: Y = 0, Z = 0.
You will notice after changing the X value that at some point the Y and Z value will become different, lets say Y=90, z=90,
your X axis will become lets say 180  desiredX
at which point the new Y and Z values will stay and the X value will be allways (to continue with the example) 180  desiredX
If your problem present the behaviour that I have explained the solution is straightforward:

before your current IF statement, initialize a bool lets call it standardYZ
if the Y and Z axis are the standard

Modify the if statment adding this in the right side of the && operator: ((standard && x > minXForRotation)  (!standard && 180  x < minXForRotation))
Take into acount that the not standard clausule may represent the change that unity is making to your x axis. Now you know if you must rotate

Change the update of angles from transform.localEulerAngles = new Vector3(DesiredRotationX, transform.localEulerAngles.y,transform.localEulerAngles.z);
to transform.localEulerAngles = new Vector3(DesiredRotationX, standardY, standardZ);
Here’s a simple demonstration to make sure that you are rotating the object on the right axis
And, here’s a very good way to check for X rotation is more than 90d
if (transform.rotation.eularAngles.x > Quaternion.Eular(90f, 0f, 0f).x)
{
// do something
}
Hope this helps.