- Home /
transform.eulerAngles Problem
Hey everyone, got a bit of a wierd issue.
I have my player object set up so that when it hits a trigger, it will flip 180 degrees of its current angle to face in the opposite direction, The triggers are responding in the debug console to show that they have been triggered, however, it only seems to change the direction of the object if the rotation of the y angle is 0 or 270, when it is 90 or 180 it just sails straight through the trigger instead of turning around.
It's a bit strange since the colliders have the same tag which is recorded in the Debug log and the colliders are the same as the ones that are north and west of the object, so why does it not work for the east and south colliders.
Here is my code
#pragma strict
var player : GameObject;
var playerPoint : GameObject;
var pressed : boolean;
var startPosition : Vector3;
function Start () {
}
function Update ()
{
startPosition = playerPoint.transform.position;
if (pressed == true)
{
player.transform.Translate (0, 0.2, 0);
}
if (pressed == false && player.transform.position !=
startPosition) { Return(); player.transform.Translate (0, 0.2, 0); } }
function Return()
{
if (player.transform.eulerAngles.y == 0) // This works
{
player.transform.eulerAngles.y = 180;
//player.transform.Translate (0, 0.2, 0);
}
if (player.transform.eulerAngles.y == 90) // This doesn't work
{
player.transform.eulerAngles.y = 270;
//player.transform.Translate (0, 0.2, 0);
}
if (player.transform.eulerAngles.y == 180) // This doesn't work
{
player.transform.eulerAngles.y = 0;
//player.transform.Translate (0, 0.2, 0);
}
if (player.transform.eulerAngles.y == 270) //This works
{
player.transform.eulerAngles.y = 90;
//player.transform.Translate (0, 0.2, 0);
}
if (player.transform.position.x == startPosition.x && player.transform.position.z == startPosition.z)
{
player.transform.Translate (0, 0, 0);
player.transform.position = startPosition;
}
}
Any ideas as to why this is?
Cheers
Answer by danielapix · Apr 12, 2015 at 09:30 PM
"Only use this variable to read and set the angles to absolute values. Don't increment them, as it will fail when the angle exceeds 360 degrees. Use Transform.Rotate instead." http://docs.unity3d.com/ScriptReference/Transform-eulerAngles.html Try to use Transform.Rotate. It's easier to use too.
Also, if you are using a CharacterController script, remember it controls the rotation too.
Already looked at the script reference and tried setting the angles as as (90,90, 0) and (90, 270, 0)...that made things worse as nothing worked at all after doing that
Answer by Shiver · Apr 12, 2015 at 09:30 PM
There might be a few things.
First, you are doing equality comparisons with floats. That's usually a huge source of errors due to floating point numbers usually not giving exact numbers (you might be 269.99999998 rather than 270). It's usually best to do a range comparison with floats. Something like :
float epsilon = 0.000001f;
if(val < target + epsilon && value > target - epsilon)
{
//do something
}
you might want to have some form of static function in a utility class somewhere for doing this
public const float EPSILON = 0.000001f;
static public bool EqualsWithEpsilon(float val, float equalsTo)
{
return val < equalsTo + EPSILON && value > equalsTo - EPSILON;
}
If that doesn't handle the problem, my other theory is that the Euler angles are playing tricks on you. I had a problem with Euler angles myself because setting EulerAngles.x to 180 actually rotates y and z instead (same rotation effect but the values weren't what I was expecting). This caused the Euler angles to have a different value when read than the last value I had set them to (this is due to 3D rotation being a 4D operation. You need an axis (3D) and an angle (additional 1D) to compute a proper 3D rotation). You might want to save the working rotation as a float somewhere or perhaps use an enum for specifying going UP, DOWN, LEFT, RIGHT. Basically, as a rule of thumb, you should only set rotations using EulerAngles (write to). Not get from them (read from).
So perhaps setting the transformDirection Vector3.forward might be a better way of doing it?
Sounds like a 'Gimbal lock' problem: [http://answers.unity3d.com/questions/573035/avoiding-gimbal-lock.html][1]