Draw Debug Tools gives you more than 21 functions covering shapes, 3D labels and live graphs, turning gameplay logic into something you can see and understand. One static class, no setup, and the calls disappear from your release build.
💠DrawDebugTools.DrawSphere(target, 0.5f, 16, Color.red);
That one line puts a red sphere in the world at the position your AI just chose. There is nothing to set up before it works. Every draw function is static, so you can call it from Update, from a coroutine, from an event handler, or from anywhere else in your project where you need to see something.
Most gameplay bugs are spatial. An enemy walks to the wrong position, a raycast misses a collider it should have hit, an agent takes a path that makes no sense. A log can print you the coordinates involved, but it cannot show you that the target is behind a wall, or that the ray stopped just short of the thing you aimed it at. Draw the values instead of printing them and the problem is usually obvious in a single frame.
DRAW THE SHAPES TO SEE YOUR GAMEPLAY
There are 30 draw functions covering the shapes you need while debugging: lines, points, spheres, boxes, capsules, cylinders, cones, directional arrows, circles, planes, grids, camera frustums, bounding boxes and 3D coordinate axes. Each one takes a colour, and an optional lifetime if you want the shape to stay on screen for a few seconds instead of a single frame.
Some of them do more than draw a primitive:
• DrawRaycastHit takes the RaycastHit you already have and draws the whole picture — the ray up to the impact, the point it hit, the surface normal, the distance written along the ray, the collider it found and that collider's bounds.
• DrawObjectColliders draws every collider on a GameObject and its children at their real world size and position. This is how you find the collider that is twice the size of the mesh it belongs to.
• DrawDistance measures between two points and draws the number on the line.
WATCH A VARIABLE CHANGE OVER TIME
💠DrawDebugTools.DrawFloatGraph("speed", speed);
Call that once per frame with any float and you get a graph on screen that shows you the value as it changes and rescales itself to whatever range the value turns out to use. Give each graph its own name and you can watch several of them side by side.
This is for the bugs where a value is only wrong for a few frames. Speed that spikes when the character lands, stamina that drains faster than it should, a dot product that changes sign when you did not expect it to. You see the shape of the curve and the moment it goes wrong, while the game is still running.
PUT LABELS ON THINGS IN THE WORLD
💠DrawDebugTools.DrawString3D(enemy.position, stateName, TextAnchor.MiddleCenter, Color.yellow);
This draws text at a position in the scene, turned to face the camera. You can put a state machine's current state above the enemy that is in it, a pathfinding cost above the node it belongs to, or an index above each waypoint in a list. Reading a value off the object it describes is much faster than matching object names in a console that is still scrolling.
For values that have no position in the world, there is a screen-space log:
💠DrawDebugTools.Log("phase: " + phase, 2f);
The second argument is how long the message stays up, so it does not disappear before ou have read it.
FREEZE TIME AND FLY THROUGH THE FRAME
Press F9 and the game stops. The view detaches from your game camera and you can fly anywhere in the scene while the frame stays exactly as it was.
Everything you drew is still on screen, so you can get behind it, above it or inside it and look at the geometry from an angle your game camera would never give you. A panel follows your crosshair and shows you what is under it: the hit point, the surface normal, the distance, the triangle index, the texture coordinates, the name of the object and the list of materials on its renderer. You can also slow time down, speed it up, pause and resume, to watch a fast in
Description sourced from the Unity Asset Store listing.