Using _GetPropertyList in C# Keeps Deleting Property Values on Build

Godot Version



I’m trying to create a Resource in C# that acts as a dictionary to store icons for keyboard keys (and more similar ones for mouse buttons and gamepad buttons) by enumerating the names of the Key constants and using those names to generate properties in _GetPropertyList:

public override Array<Dictionary> _GetPropertyList()
    Array<Dictionary> properties = new();
    properties.AddRange(Enum.GetNames<Key>().Select((n) => new Dictionary()
        { "name", n },
        { "type", Variant.From(Variant.Type.Object) },
        { "hint", Variant.From(PropertyHint.ResourceType) },
        { "hint_string", "Texture2D" }
    return properties;

I have the actual mapping of Key constants to Texture2Ds stored in a Dictionary<Key, Texture2D> along with another dictionary to cache Key constant names, which I use in _Get and _Set like so:

public override Variant _Get(StringName property) =>
    _names.ContainsKey(property) ? _icons[_names[property]] : default;

public override bool _Set(StringName property, Variant value)
    if (_names.ContainsKey(property))
        _icons[_names[property]] = value.As<Texture2D>();
        return true;
        return false;

This mostly works, and I’m able to create an instance of the Resource and assign textures to Key values, but whenever I press the “Build” button the texture’s I’ve assigned get deleted until I reload the project, even if I’m only making changes in other scripts. Am I doing something wrong? Is there something else I need to do so it will keep the values when the code is rebuilt?

Edit: reformat the code a bit so lines aren’t as long. The Array and Dictionary classes I’m using here are the Godot.Collections versions, so they work with the editor.

I’m also having this issue! Did you ever find a solution for it?

No, I’m afraid not. I’ve worked around it by manually adding each key that I need to map at the moment as Texture2D properties using [Export], and that doesn’t seem to have this problem, but we’ll see what happens when I eventually need to map every Key to a Texture2D.