More in this category:

- Create normal maps for Unity
- How to combine meshes in Unity3D
- Converting to and from string
- RectTransform extensions
- Handy Unity3D C# functions (5. screenshots)
- Handy Unity3D C# functions (4. alter textures)
- Handy Unity3D C# functions (3. create textures)
- Handy Unity3D C# functions (2. colors)
- Handy Unity3D C# Functions (1. compass angles)
- FlexiGUI
- 3d website tools

Posted on April 27, 2014, by Richard Knol

In the next couple of weeks I will be posting some handy code snippets for use in your Unity3D projects. Nothing spectacular, but some of the functions can be quite useful.This first post is about working with angles in degrees.

As you may know, I am a sailor and when you make a boat in Unity, you need a few functions to easily deal with compass angles.

When you have an angle in degrees, that you want to convert in the range of 0-360:

`public static float To360Angle(float angle) {`

while(angle<0.0f) angle+=360.0f;

while(angle>=360.0f) angle-=360.0f;

return angle;

}

To do the same for a vector of 3 angles:

`public static Vector3 To360Angle(Vector3 angles) {`

angles.x = To360Angle(angles.x);

angles.y = To360Angle(angles.y);

angles.z = To360Angle(angles.z);

return angles;

}

If you want the angle to be between -180 and 180:

`public static float To180Angle(float angle) {`

while(angle<-180.0f) angle+=360.0f;

while(angle>=180.0f) angle-=360.0f;

return angle;

}

And for a Vector with 3 angles:

`public static Vector3 To180Angle(Vector3 angles) {`

angles.x = To180Angle(angles.x);

angles.y = To180Angle(angles.y);

angles.z = To180Angle(angles.z);

return angles;

}

Compass angles are slightly different from mathematical angles, because they start at the top (north and go clockwise, whereas mathematical angles start at the x-axis (east) and go counter-clockwise. Here's a super simple conversion function:

`public static float MathAngleToCompassAngle(float angle) {`

angle = 90.0f - angle;

return To360Angle(angle);

}

When you gradually want to steer towards a target heading, you need a Lerp function. But to slide from 350 degrees to 10 degrees should work like 350, 351, 352, ....359, 0, 1, 2, 3....10. And not the other way around going 350, 349, 348.....200...1000, 12, 11, 10. Here's a Lerp function that does just that:

`public static float CompassAngleLerp(float from, float to, float portion) {`

float dif = To180Angle(to-from);

dif *= Mathf.Clamp01(portion);

return To360Angle(from+dif);

}