Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
215 changes: 215 additions & 0 deletions Assets/DebugOverlay/ConfigVar.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,215 @@
using System;
using System.Collections.Generic;
using UnityEngine;

public interface IConfigVar
{
string Name { get; }
string Description { get; }
string GetStringValue();
bool TrySetValue(string input);
void ResetToDefault();
}

public struct ConfigVarFloat : IConfigVar
{
private float m_Value;
private float m_DefaultValue;
private string m_Name;
private string m_Description;

public string Name => m_Name;
public string Description => m_Description;
public float Value => m_Value;

public ConfigVarFloat(string name, float defaultValue, string description = "")
{
m_Name = name;
m_DefaultValue = defaultValue;
m_Description = description;
m_Value = defaultValue;
}

public string GetStringValue()
{
return m_Value.ToString("F3");
}

public bool TrySetValue(string input)
{
if (float.TryParse(input, out float newValue))
{
m_Value = newValue;
return true;
}
return false;
}

public void ResetToDefault()
{
m_Value = m_DefaultValue;
}
}

public struct ConfigVarInt : IConfigVar
{
private int m_Value;
private int m_DefaultValue;
private string m_Name;
private string m_Description;

public string Name => m_Name;
public string Description => m_Description;
public int Value => m_Value;

public ConfigVarInt(string name, int defaultValue, string description = "")
{
m_Name = name;
m_DefaultValue = defaultValue;
m_Description = description;
m_Value = defaultValue;
}

public string GetStringValue()
{
return m_Value.ToString();
}

public bool TrySetValue(string input)
{
if (int.TryParse(input, out int newValue))
{
m_Value = newValue;
return true;
}
return false;
}

public void ResetToDefault()
{
m_Value = m_DefaultValue;
}
}

public struct ConfigVarBool : IConfigVar
{
private bool m_Value;
private bool m_DefaultValue;
private string m_Name;
private string m_Description;

public string Name => m_Name;
public string Description => m_Description;
public bool Value => m_Value;

public ConfigVarBool(string name, bool defaultValue, string description = "")
{
m_Name = name;
m_DefaultValue = defaultValue;
m_Description = description;
m_Value = defaultValue;
}

public string GetStringValue()
{
return m_Value ? "1" : "0";
}

public bool TrySetValue(string input)
{
if (bool.TryParse(input, out bool newValue))
{
m_Value = newValue;
return true;
}
// Also accept "0", "1" for bool
if (input == "0")
{
m_Value = false;
return true;
}
if (input == "1")
{
m_Value = true;
return true;
}
return false;
}

public void ResetToDefault()
{
m_Value = m_DefaultValue;
}
}

public static class ConfigVarRegistry
{
private static Dictionary<string, IConfigVar> s_Vars = new Dictionary<string, IConfigVar>();

public static void Register<T>(ref T configVar) where T : struct, IConfigVar
{
s_Vars[configVar.Name] = configVar;
}

public static bool TryGetValue(string name, out IConfigVar configVar)
{
return s_Vars.TryGetValue(name, out configVar);
}

public static bool TrySetValue(string name, string value)
{
if (s_Vars.TryGetValue(name, out IConfigVar configVar))
{
return configVar.TrySetValue(value);
}
return false;
}

public static bool TryGetFloat(string name, out float value)
{
if (s_Vars.TryGetValue(name, out IConfigVar configVar) && configVar is ConfigVarFloat floatVar)
{
value = floatVar.Value;
return true;
}
value = 0.0f;
return false;
}

public static bool TryGetInt(string name, out int value)
{
if (s_Vars.TryGetValue(name, out IConfigVar configVar) && configVar is ConfigVarInt intVar)
{
value = intVar.Value;
return true;
}
value = 0;
return false;
}

public static bool TryGetBool(string name, out bool value)
{
if (s_Vars.TryGetValue(name, out IConfigVar configVar) && configVar is ConfigVarBool boolVar)
{
value = boolVar.Value;
return true;
}
value = false;
return false;
}

public static void ResetToDefault(string name)
{
if (s_Vars.TryGetValue(name, out IConfigVar configVar))
{
configVar.ResetToDefault();
}
}

public static Dictionary<string, IConfigVar>.Enumerator GetAllVars()
{
return s_Vars.GetEnumerator();
}

public static int Count => s_Vars.Count;
}
2 changes: 2 additions & 0 deletions Assets/DebugOverlay/ConfigVar.cs.meta

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

83 changes: 83 additions & 0 deletions Assets/DebugOverlay/Console.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ public Console()
m_InputFieldBuffer = new char[k_InputBufferSize];
AddCommand("help", CmdHelp, "Show available commands");
AddCommand("dump", CmdDumpScene, "Dump scene hierarchy in active scene");
AddCommand("cvarlist", CmdCvarList, "List all config variables");
AddCommand("cvar", CmdCvar, "Get or set config variable: cvar <name> [value]");
AddCommand("cvarreset", CmdCvarReset, "Reset config variable to default: cvarreset <name>");
AddCommand("cvartest", CmdCvarTest, "Test config variable system");
Keyboard.current.onTextInput += OnTextInput;
}

Expand Down Expand Up @@ -91,6 +95,85 @@ void CmdHelp(string[] args)
}
}

void CmdCvarList(string[] args)
{
Write("Config Variables ({0}):\n", ConfigVarRegistry.Count);
var enumerator = ConfigVarRegistry.GetAllVars();
while (enumerator.MoveNext())
{
var kvp = enumerator.Current;
Write(" {0,-20} = {1,-10} {2}\n", kvp.Key, kvp.Value.GetStringValue(), kvp.Value.Description);
}
}

void CmdCvar(string[] args)
{
if (args.Length == 0)
{
Write("Usage: cvar <name> [value]\n");
return;
}

string varName = args[0];

if (args.Length == 1)
{
// Get value
if (ConfigVarRegistry.TryGetValue(varName, out IConfigVar configVar))
{
Write("{0} = {1}\n", varName, configVar.GetStringValue());
}
else
{
Write("Config variable '{0}' not found\n", varName);
}
}
else if (args.Length == 2)
{
// Set value
string value = args[1];
if (ConfigVarRegistry.TrySetValue(varName, value))
{
Write("{0} = {1}\n", varName, value);
}
else
{
Write("Failed to set {0} = {1}\n", varName, value);
}
}
else
{
Write("Usage: cvar <name> [value]\n");
}
}

void CmdCvarReset(string[] args)
{
if (args.Length != 1)
{
Write("Usage: cvarreset <name>\n");
return;
}

string varName = args[0];
ConfigVarRegistry.ResetToDefault(varName);
Write("Reset {0} to default value\n", varName);
}

void CmdCvarTest(string[] args)
{
Write("Testing config variable system...\n");

// Test setting and getting values
ConfigVarRegistry.TrySetValue("fov", "90.0");
ConfigVarRegistry.TrySetValue("mousesensitivity", "100.0");
ConfigVarRegistry.TrySetValue("showstats", "false");

Write("Set fov=90, mousesensitivity=100, showstats=false\n");
Write("Use 'cvarlist' to see all variables\n");
Write("Use 'cvar fov' to see current value\n");
}

public void Init()
{
Init(null);
Expand Down
Loading