# why won&#39;t my script do a proper rotation check

so i am making this bowling game and decided that i want to destroy de pins after they had fallen over. but to let them fall down correctly and hit other pins as well i put a timer on there for 10 seconds. but somehow the timmer won’t start. it starts when i put in there if the z or the x rotation are not equall to zero but because of the gravity do they shift position a little bit so it will start automaticly. to avoid this i’ve put in that the x or z rotation should be more than or equal to 1 or less than or equal to -1. i’ve checked by a rotation of only 1 degree they will fall over. here is my code (it is in c#):

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

public class pins_fall_over : MonoBehaviour {

public float time_passed;

// Use this for initialization
void Start () {

time_passed = 0;

}

// Update is called once per frame
void Update () {

float x_rotation = transform.rotation.x;
float z_rotation = transform.rotation.z;

if( x_rotation >= 1.0f || x_rotation <= -1.0f || z_rotation <= -1.0f || z_rotation >= 1.0f)
time_passed += Time.deltaTime;

if(time_passed >= 10)
{
Destroy (this.gameObject);
}

}
}
``````

p.s.
time_passed is public so i could see it more easely in the inspector

p.p.s
i’m sorry if my grammar is bad because english is not my original language

transform.rotation is a Quaternion, not those nice angles we see in the Inspector (they are actually transform.localEulerAngles). You could try to use transform.eulerAngles, but its values are not so reliable for this purpose - there are several XYZ combinations equivalent to any possible rotation, and you may be unlucky and get the wrong combination.

A better way to check tilting of a vertical object is to verify its transform.up vector: since it’s normalized, the Y component is numerically equal to the sin of the elevation angle - it should be 1 for a completely vertical object, and < 0.999 for an object inclined more than 2.5 degrees in any direction:

``````...
void Update () {
if (transform.up.y < 0.999f){ //
time_passed += Time.deltaTime;
}
if(time_passed >= 10){
Destroy (this.gameObject);
}
}
``````

If you want less than 2.5 degrees, the value to compare to Y may be calculated from sin(90 - maxDegrees)