- 
                Notifications
    
You must be signed in to change notification settings  - Fork 10
 
In‐Game Debugging
If the videos do not load please try refreshing the page.
2024-09-10.13-40-24.mp4
2024-09-08.21-37-51.mp4
Easily debug in-game by adding the [Visualize] attribute to any of the supported members. This feature allows you to visualize and interact with various types of data directly within the game environment.
| Member Type | Supported | Example Types | Additional Notes | 
|---|---|---|---|
| Numericals | ✅ | 
int, float, double
 | 
All numerical types are supported | 
| Enums | ✅ | 
Direction, Colors
 | 
All enum types are supported | 
| Booleans | ✅ | bool | 
|
| Strings | ✅ | string | 
|
| Color | ✅ | Color | 
|
| Vectors | ✅ | 
Vector2, Vector2I, Vector3, Vector3I, Vector4, Vector4I
 | 
|
| Quaternion | ✅ | Quaternion | 
|
| NodePath | ✅ | NodePath | 
|
| StringName | ✅ | StringName | 
|
| Methods | ✅ | Method parameters support all listed types here | |
| Static Members | ✅ | This includes static methods, fields, and properties | |
| Arrays | ✅ | 
int[], string[], Vector2[]
 | 
Arrays support all listed types here | 
| Lists | ✅ | 
List<string[]>, List<Vector2>
 | 
Lists support all listed types here | 
| Dictionaries | ✅ | Dictionary<List<Color[]>, Vector2> | 
Dictionaries support all listed types here | 
| Structs | ✅ | struct | 
|
| Classes | ✅ | class | 
|
| Resources | ✅ | Resource | 
|
| Godot Classes | ❌ | 
PointLight2D, CharacterBody3D
 | 
|
| Godot Array | ❌ | Godot.Collections.Array | 
Tracking in https://github.com/ValksGodotTools/Template/issues/58 | 
| Godot Dictionary | ❌ | Godot.Collections.Dictionary | 
Tracking in https://github.com/ValksGodotTools/Template/issues/58 | 
Important
There are some annoyances when trying to visualize members from inherited classes. I will try to solve this later.
public partial class Player : CharacterBody2D
{
    // You will be able to edit this in-game
    [Visualize] private static int _totalPlayers;
    private State _currentState;
    public override void _Ready()
    {
        // Visualize.Register(this) is required for the tool to even see this script, every other parameter is optional
        // currentState and Rotation will be observed as readonly members.
        Visualize.Register(this, nameof(_currentState), nameof(Rotation));
        _currentState = new State("Idle");
    }
    // You will be able to execute this method in-game
    [Visualize]
    public void Attack(int damage)
    {
        Visualize.Log(damage); // Floating text will appear near node then disappear
    }
}Note
The in-game console can be brought up with F12
Registering new commands is easy.
public override void _Ready()
{
    GameConsole.RegisterCommand("help",  CommandHelp);
    GameConsole.RegisterCommand("quit",  CommandQuit).WithAliases("exit");
    GameConsole.RegisterCommand("debug", CommandDebug);
}
private void CommandHelp(string[] args)
{
    IEnumerable<string> cmds = GameConsole.Instance.GetCommands().Select(x => x.Name);
    Logger.Log(cmds.ToFormattedString());
}
private async void CommandQuit(string[] args)
{
    await Global.Instance.QuitAndCleanup();
}
private void CommandDebug(string[] args)
{
    if (args.Length <= 0)
    {
        Logger.Log("Specify at least one argument");
        return;
    }
    Logger.Log(args[0]);
}In Godot top left Debug > Customize Run Instances... > Main Run Args there are custom defined arguments you can use.
Window Position and Size Args
- top_left
 - top_right
 - bottom_left
 - bottom_right
 - middle_left
 - middle_right
 - middle_top
 - middle_bottom
 
These args are great when running multiple client windows when debugging multiplayer. For example Client A window could be "middle_left" and Client B window could be "middle_right".
// Metrics Overlay can be toggled in-game with F1
// You can also do MetricsOverlay.StartMonitoringPhysicsProcess and MetricsOverlay.StopMonitoringPhysicsProcess
MetricsOverlay.StartMonitoringProcess("My Variable", () => _variable);
//MetricsOverlay.StopMonitoringProcess("My Variable");// _Ready
Profiler.Start("Player Initialization");
PlayerSetup();
Profiler.Stop("Player Initialization"); // This will be printed to the console
// _Process
// You can also do Profiler.StartPhysicsProcess and Profiler.StopPhysicsProcess
Profiler.StartProcess("Player Firing Logic");
PlayerFire();
Profiler.StopProcess("Player Firing Logic"); // This will be displayed in the MetricsOverlay (F1)