Bugs are inevitable in game development. Debugging is finding and fixing these errors. Unity provides several tools to help you track down issues like from simple console logs to visual debugging in the Scene view.
Debug.Log()
The simplest and most used debugging tool. Print messages to the Console to see what your code is doing. Example:
using UnityEngine;
public class Player : MonoBehaviour
{
private int health = 100;
void Start()
{
Debug.Log("Game started!");
}
}
Output:

Click on any log message in the Console. Unity opens the script at that exact line. Use Debug.Log() for info, Debug.LogWarning() for potential problems, and Debug.LogError() for actual errors.
Debug.DrawLine() - Visual Debugging
Sometimes numbers aren't enough. Draw lines in Scene view to see what your code is doing. Example:
using UnityEngine;
public class Player : MonoBehaviour
{
public Transform player;
void Update()
{
// Draw line from enemy to player
Debug.DrawLine(transform.position, player.position, Color.red);
// Draw ray forward from enemy
Debug.DrawRay(transform.position, transform.forward * 5, Color.green);
}
}
Output:

These lines appear only in the Scene view (not Game view). Perfect for checking if raycasts are firing correctly, seeing enemy vision range, or visualizing patrol paths.
Breakpoints in Visual Studio
The most powerful debugging tool. Pause your game at a specific line of code and inspect everything.
How to use:
- Open your script in Visual Studio.
- Click the left margin next to a line number - a red dot appears.
- Press Play in Unity.
- Game automatically pauses when that line runs.
When paused, you can:
- Hover over any variable to see its current value.
- Check the call stack (how you got here).
- Step through code line by line using F10 or F11.
Debug.Break() - Conditional Pausing
Pause the game automatically when a specific condition happens. Example:
void Update()
{
if (playerHealth <= 0 && !gameOverTriggered)
{
Debug.Break(); // Game pauses right here
Debug.LogError("Player died! Checking why...");
}
if (score > 10000)
{
Debug.Break(); // Pause when score crosses 10000
Debug.Log("Score exceeded 10000 at frame: " + Time.frameCount);
}
}
After the game pauses, you can inspect any GameObject in the Scene view. Useful for catching rare bugs that are hard to reproduce.