Files
scaryposadzka/Assets/SzafaKit/Runtime/Console/CVar.cs
2025-03-02 02:25:06 +01:00

105 lines
2.9 KiB
C#

using System;
using System.Globalization;
using SzafaKit.Foundation;
using UnityEngine;
namespace SzafaKit.Console {
public enum CVarKind {
Int,
Float,
Vector2,
Vector3,
Vector4,
String
}
[Serializable]
public class CVar {
[field: SerializeField]
public CVarKind Kind { get; private set; }
[field: SerializeField]
public string Name { get; private set; }
[field: SerializeField]
public string Description { get; private set; }
public int IntValue;
public float FloatValue;
public Vector2 Vector2Value;
public Vector3 Vector3Value;
public Vector4 Vector4Value;
public string StringValue;
public event Action OnChanged = delegate { };
public CVar(string name, string description) {
Kind = CVarKind.Int;
Name = name;
Description = description;
IntValue = 0;
}
public void Set(int value) {
Kind = CVarKind.Int;
IntValue = value;
OnChanged?.Invoke();
}
public void Set(float value) {
Kind = CVarKind.Float;
FloatValue = value;
OnChanged?.Invoke();
}
public void Set(Vector2 value) {
Kind = CVarKind.Vector2;
Vector2Value = value;
OnChanged?.Invoke();
}
public void Set(Vector3 value) {
Kind = CVarKind.Vector3;
Vector3Value = value;
OnChanged?.Invoke();
}
public void Set(Vector4 value) {
Kind = CVarKind.Vector4;
Vector4Value = value;
OnChanged?.Invoke();
}
public void Set(string value) {
Kind = CVarKind.String;
StringValue = value;
OnChanged?.Invoke();
}
public void ParseFromString(string str) {
if (float.TryParse(str, out float f)) {
Set(f);
} else if (int.TryParse(str, out int i)) {
Set(i);
} else {
Set(str);
}
}
public override string ToString() {
return Kind switch {
CVarKind.Int => IntValue.ToString(),
CVarKind.Float => FloatValue.ToString(CultureInfo.InvariantCulture),
CVarKind.Vector2 => Vector2Value.ToString(),
CVarKind.Vector3 => Vector3Value.ToString(),
CVarKind.Vector4 => Vector4Value.ToString(),
CVarKind.String => $"\"{StringValue}\"",
_ => throw new ArgumentOutOfRangeException()
};
}
public static CVar Create(string name, string description = "") {
return SzafaEngine.Shared.GetService<ConsoleService>().CreateCVar(name, description);
}
}
}