I am currently using Unity for two weeks and I have started to implement logic and graphical tweaks into mechanics. It happened that I needed a little math to correct some calculation failures based on user mouse or touch input. A simple check was needed – is a given 3D point contained within a box?

I was pretty disappointed that Unity does not have such functions already made. And even more disappointed I couldn’t find ready solution for Unity-specific library code. Actually many folks use Physics.Raycast() instead which is ugly. The sad fact is that many creators do not have **any idea** what they are doing by using Raycast.

Below you can see the code for such point-box check. If you need it, figure it out yourself how it works.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
public class IsPointInBoxTest : MonoBehaviour { Transform _box; Transform _point; void Start () { _box = GameObject.CreatePrimitive(PrimitiveType.Cube).transform; _point = GameObject.CreatePrimitive(PrimitiveType.Sphere).transform; _point.localScale = new Vector3(0.1f, 0.1f, 0.1f); testPointInBox(new Vector3(0, 10, 0), new Vector3(1,1,1), Quaternion.AngleAxis(30, Vector3.up), new Vector3(0, 9.56f, 0)); testPointInBox(new Vector3(0, 10, 0), new Vector3(1,1,1), Quaternion.AngleAxis(30, Vector3.up), new Vector3(0.49f, 10, 0.49f)); testPointInBox(new Vector3(0, 10, 0), new Vector3(1,1,1), Quaternion.AngleAxis(0, Vector3.up), new Vector3(0.49f, 10, 0.49f)); } private void testPointInBox(Vector3 boxPosition, Vector3 boxSize, Quaternion boxRotation, Vector3 testPoint) { _box.position = boxPosition; _box.rotation = boxRotation; _box.localScale = boxSize; _point.position = testPoint; Debug.Log(IsPointInBox(boxPosition, boxSize, boxRotation, testPoint).ToString()); } public static bool IsPointInBox(Vector3 boxPosition, Vector3 boxSize, Quaternion boxRotation, Vector3 testPoint) { var localPoint = testPoint - boxPosition; var rotatedPoint = Quaternion.Inverse(boxRotation) * localPoint; return IsPointInBox(boxSize, rotatedPoint); } public static bool IsPointInBox(Vector3 boxPosition, Vector3 boxSize, Vector3 testPoint) { var localPoint = testPoint - boxPosition; return IsPointInBox(boxSize, localPoint); } public static bool IsPointInBox(Vector3 boxSize, Vector3 testPoint) { return Mathf.Abs(testPoint.x) < boxSize.x/2 && Mathf.Abs(testPoint.y) < boxSize.y/2 && Mathf.Abs(testPoint.z) < boxSize.z/2; } } |