Записываю значение в словарь, и даже при моментальной проверке там оказывается Null:
_attacks.Add(TestAttack.Name, new TestAttack());
GD.Print(_attacks[TestAttack.Name]);
_attacks - Dictionary<string, Attack>
TestAttack наследуется от Attack
В словаре все нормально. У Вас есть какие-то неинициализированные поля в свежесозданном экземпляре TestAttack.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей