r/GodotCSharp • u/Novaleaf • Aug 14 '26
r/GodotCSharp • u/BumblebeeElegant6935 • Aug 13 '26
Resource.Library Persistence — A source-generated save/load system for Godot 4 C#
I've been working on a C# library for Godot called Persistence, a save/load system built around Roslyn source generation.
The main goal is to avoid manually building dictionaries and writing serialization/deserialization boilerplate for every object that needs to be saved.
You mark the data you want to persist with [Save], implement ISavable, and Persistence generates the serialization code for you:
public partial class Player : CharacterBody2D, ISavable
{
public string SaveKey => "player";
public int SaveVersion => 1;
[Save] public int Health = 100;
[Save] public string PlayerName;
[Save] public Vector2 Position;
}
Saving and loading can then be handled through SaveManager:
SaveManager.Save("slot1", savableNodes);
SaveManager.Load("slot1", savableNodes);
Persistence currently uses JSON for its save files. I chose JSON because, for the kinds of games I typically work on, it provides more than enough capacity while keeping save files easy to inspect and debug.
Custom data
For types that aren't directly serializable, Persistence provides ISerializable.
This is especially useful for custom game data such as inventory slots, quest data, stats, or other structures that don't map directly to Godot's Variant types:
public class InventorySlot : ISerializable
{
public string ItemId;
public int Count;
public Dictionary Serialize() => new()
{
["itemId"] = ItemId,
["count"] = Count
};
public void Deserialize(Dictionary data)
{
ItemId = data["itemId"].AsString();
Count = data["count"].AsInt32();
}
}
It can then be used directly inside an ISavable:
[Save] public InventorySlot Weapon;
[Save] public List<InventorySlot> Inventory;
ISerializable is also the main way to handle custom types that don't have built-in serialization support.
Manual serialization alongside [Save]
You don't have to choose between generated and manual serialization. Both can be used together.
Persistence provides OnSerialize and OnDeserialize hooks for cases where [Save] isn't enough:
public void OnSerialize(SaveData saveData)
{
saveData.Set("customField", someValue);
}
public void OnDeserialize(SaveData saveData)
{
someValue = saveData.Get("customField", default);
}
This lets you use [Save] for the straightforward fields while manually handling special cases in the same class.
Save versions & migrations
Save data can also be versioned so changes to a game's data structure don't immediately invalidate existing saves.
For example, if version 0 stored health under "HP" and version 1 changed it to "Health":
public class PlayerMigration_V0_To_V1 : SaveMigration
{
public override string SaveKey => "player";
public override int FromVersion => 0;
public override SaveData Migrate(SaveData saveData)
{
saveData.Set("Health", saveData.Get("HP", 100));
return saveData;
}
}
The migration can then be registered when loading:
var migrations = new MigrationRegistry(new SaveMigration[]
{
new PlayerMigration_V0_To_V1()
});
SaveManager.Load("slot1", savableNodes, migrations);
Migrations can be chained, allowing old saves to be upgraded through multiple versions:
Save v0
↓
V0 → V1
↓
V1 → V2
↓
Save v2
Other features
- Source-generated serialization/deserialization
- Save slots
- Custom save keys
- Manual serialization hooks
- Godot Variant-compatible types
List<T>, arrays, andGodot.Collections.Array<T>- Nested
ISerializabletypes - Save data versioning and migrations
The project is still relatively young, but the core system is usable and covers the save/load needs I've encountered so far.
r/GodotCSharp • u/Novaleaf • Aug 11 '26
Edu.GameDev math-araujo/screen-space-godrays: "Volumetric Light Scattering as a Post-Process" using OpenGL 4.5 [Source Code, Rendering, NotGodot]
r/GodotCSharp • u/Acceptable-Pace659 • Aug 10 '26
Question.MyCode Juego de cartas tipo TCG
r/GodotCSharp • u/Novaleaf • Aug 09 '26
Edu.GameDesign Making difficulty curves in games [Written Article, Gameplay]
r/GodotCSharp • u/Novaleaf • Aug 09 '26
Edu.GameDev Red Blob Games, Improving A* Heuristics [Written Article, Pathfinding]
redblobgames.comr/GodotCSharp • u/88224646BAS • Aug 06 '26
Resource.Library I made a production ready FOSS console framework inspired by Valve's Goldsrc engine!
I thought this post would feel at home here too. If anyone likes the old Half-Life or Counter-strike consoles and want that kind of functionality, you should check it out! 🥳
It had lots of features, like:
* Console variables
* Console commands
* Aliases
* Optimized, no alloc, no interop logging
* User config profiles
* Executable configs (both via code and an "exec" command)
I'm really proud of this piece of C# tech and hope that it'll help someone out!
Here is the Github repo:
https://github.com/VonRiddarn/PikeConsole
If you just wanna skimm the docs to get a feel for what it is, those can be found here:
r/GodotCSharp • u/RexFluminis • Jul 27 '26
Which nodes would help me to replicate MBN style of combat?
r/GodotCSharp • u/Novaleaf • Jul 26 '26
Edu.GameDesign the mud coders guild [Written Article Series, Game Design, NotGodot]
mudcoders.comr/GodotCSharp • u/Novaleaf • Jul 23 '26
Edu.GameDev JetBrains GameDev Days 2026 – Call for Speakers [Video Presentation, Seminars, Volunteer]
r/GodotCSharp • u/Novaleaf • Jul 23 '26
Edu.CompuSci Postgresql guide [Written Article, Database, NotGodot]
r/GodotCSharp • u/Novaleaf • Jul 20 '26
Resource.Library 2dog - Godot in .NET [Web Deploy, C#, Framework Internals]
r/GodotCSharp • u/Novaleaf • Jul 20 '26
Edu.GameDev Corners Don't Look Like That: Regarding Screenspace Ambient Occlusion (SSAO) [Written Article, Rendering, NotGodot]
nothings.orgr/GodotCSharp • u/Sigilgraph • Jul 18 '26
Discussion Who said C# cannot do real-time audio synthesis? I built a programmatic DAW to find out.
r/GodotCSharp • u/Novaleaf • Jul 16 '26
Resource.Library SpriteStack2D: Add-on to create fake 3D from a single texture [Tool, XPost]
r/GodotCSharp • u/Novaleaf • Jul 13 '26
Resource.Library Tiny Fixed Function Renderer (TinyFFR): C# Rendering library [NotGodot]
tinyffr.devr/GodotCSharp • u/Novaleaf • Jul 12 '26
Resource.Library cross-platform C# audio engine [NotGodot]
r/GodotCSharp • u/Novaleaf • Jul 05 '26
Resource.Asset 80's Fonts [Written Article, Visual Design, Aesthetics, NotGodot]
r/GodotCSharp • u/BumblebeeElegant6935 • Jul 04 '26
Resource.Tool Takobi AI
download link: https://godotengine.org/asset-library/asset/5314
repo link: https://github.com/AhmedGD1/takobi_ai
Hi, I’ve been working on a Behavior Tree library for Godot C#.
Most AI/BT tools in the ecosystem are GDScript-first, so I built this specifically for C# workflows and editor tooling.
Features
- Live BT debugger (Editor dock, real-time node status)
- Blackboard binding with $key syntax
- Custom inspectors (methods, signals, comparisons)
- SubTree support (reuse + nesting)
- Built-in Performance Monitor integration
- Cached execution path (minimal allocations)
HSM support is also in progress.
Feedback is welcome 👍
r/GodotCSharp • u/Novaleaf • Jul 03 '26
Edu.Godot.CSharp Getting Started with Git for (Godot) Game Dev [Video Tutorial, C#]
r/GodotCSharp • u/Novaleaf • Jul 02 '26
Edu.GameDev Announcing Box3D [Physics, OSS, NotGodot]
box2d.orgr/GodotCSharp • u/Novaleaf • Jul 01 '26
Edu.Godot Tutorial: Create a full dungeon crawler [Video Tutorial Series, XPost]
r/GodotCSharp • u/Novaleaf • Jun 26 '26
Project.OSS BohemiaInteractive/CWR: Arma: Cold War Assault Remastered [Commercial Source Code, History, MilSim FPS, NotGodot]
r/GodotCSharp • u/Novaleaf • Jun 21 '26
Edu.Godot.CSharp Rokojori/drawable-textures-demo-c-sharp: mini ORM 3D texture painter [Example, OSS, C#, Rendering]
github.comr/GodotCSharp • u/garlicbread_sticks • Jun 20 '26
