handzlikchris/FastScriptReload

Static fields in changed code are lost upon reload

Epicguru opened this issue · 1 comments

I am not sure whether this is expected behaviour or not, but I could not find any reference in the documentation to static fields not being supported.
I am trying to reload a static class that has a static Material field that is assigned on startup via reflection.
The static class content looks like this:

private static Material material;

public static void DrawReticleCircle(in ReticleDrawArgs args)
{    
    var position = args.WorldPosition;
    // ...
    Graphics.DrawMesh(mesh, trs, material, 0);
}

static void OnScriptHotReloadNoInstance()
{
    Debug.Log($"Post-reload, asset is {material} (null={material==null})");
}

After changing the contents of DrawReticleCircle, the script is reloaded but the value of material is lost.
The debug log reads: Post-reload, asset is (null=True)

I would expect for the value to be copied over, or for the new code to reference the field in the old assembly (if this is possible?).

Is this a known limitation or a bug? If it is a limitation, I think it is worth pointing out in the documentation.
Thanks.

Hi - yes it'll be a limitation. When reload happens your new code is technically in class/new assembly with changed name.

Static values are not reinitialized.

I'll leave this one open as it's possible to reinitialize those on reload