Zeenobit / moonshine_save

A save/load framework for Bevy game engine.
MIT License
81 stars 9 forks source link

Extract resources when saving #7

Closed keis closed 11 months ago

keis commented 11 months ago

I have a project where I want to save specific components and resources.

Components was simple enough to get working by providing my own SaveFilter starting from deny_all() (Something like #5 would make this much better!)

But I also want to save a resource which led me to create a custom save() function with these additional lines.

    builder.with_resource_filter(filter.resource);
    builder.extract_resources();

It would be great if moonshine_save could do this out of the box

Zeenobit commented 11 months ago

Thanks for raising this. I pushed a CL which lets you specify resources in SaveFilter. This should simplify things for you since you don't need to manually deal with the DynamicSceneBuilder, but you'd still need a custom save pipeline.

But it's still far from an ideal solution. The problem is that we have no way to "mark" resources like we can mark entities with Save component. On top of that, some Bevy components derive Reflect but aren't serializable, so I can't rely on types which implement Reflect either.

I'm thinking of introducing an .add_saved_resource function to flag and register saved resources in a single call, but this wouldn't be customizable per save pipeline.

I'm gonna keep the issue open until I figure out a better solution to this.

keis commented 11 months ago

Thanks for the blazing fast fix!

The deny_all() seems like only sensible default for resources to stick with the philosophy of you explicitly pick want you want to save. Although by a different mechanism. There could for sure be serialisable resources I don't care about from other parts of the system.

I quite liked the of the save pipeline builder which could then have something like a with_resource_filter(.., filter: SceneFilter)

Zeenobit commented 11 months ago

In v0.3.2, you can use save_default().include_resource::<R>().into_file("example.ron") to include resources into a save pipeline.