Let’s explore how you can detect when an object is inside the players camera view by using the camera’s frustum and axis-aligned bounding boxes (AABB). This takes advantage of Unity’s built in GeometryUtility
class that provides some helper functions to make this easier.
The first thing to do is define a set of planes we can use to describe the view of our camera. This is called a frustum and is the white box-like gizmo you see in Unity’s scene editor when you select a Camera
. The frustum defines your cameras view and we can take advantage of this to test if objects are inside or outside of the bounds we calculate.
In order to calculate the frustum planes we’ll want to run GeometryUtility.CalculateFrustumPlanes(...)
and pass in the camera we want to calculate the Frustum of. In our quick example we’ll use Camera.main
to grab the main camera in our scene.
Once we’ve calculated the camera frustum planes we can provide those to the GeometryUtility.TestPlanesAABB(...)
method to test if the bounding box we provide is inside or outside of the planes we calculated earlier. This method returns true if the bounding box provided overlaps with or is inside of the Plane[]
boundaries. In this case we’re testing if a bounding box overlaps or is inside of the camera’s viewport.
To get the bounds of an object you can use the Collider.bounds
field. This calculates a world space axis-aligned bounding box for the collider and returns it to you so you can reference it in your object. The bounds are always a box aligned to the XYZ planes but are supported on all types of Collider
in Unity.
Once you’ve passed your bounds into the test function you can use that to perform your behavior for objects in or out of view. This can be used to freeze objects when they come into view (like the Doctor Who Angels) or to move/delete an object when it gets out of sight (like some gibs you only want to be cleaned up when the player looks away). There’s a lot of different uses for functions like this!
The code I’m using in this example has an Update
that looks like this:
|
|
You can learn more about dot product here: https://youtu.be/8cZo-c-f1yc
Join the World of Zero Discord Server: https://discord.gg/hU5Kq2u