Leafwing-Studios / leafwing-input-manager

A straightforward stateful input manager for the Bevy game engine.
Apache License 2.0
727 stars 115 forks source link

Inputs serialization #620

Open Shatur opened 2 months ago

Shatur commented 2 months ago

What problem does this solve?

I would like to be able to serialize inputs to a config file and deserialize it back. But there are a 2 problems:

  1. Boxes can't be serialized / deserialized without additional effort.
  2. All insertion methods on InputMap accept concrete type, not a fat pointer.

What solution would you like?

Not exactly sure how to solve this...

For 1 we can use something like https://github.com/dtolnay/erased-serde, but it require a separate crate for such a common use case is not very nice. It's also possible to use Bevy's reflection. But it requires manual ser/de implementation for user which is hard to write. For 2 we can accept Into<Box<dyn Trait>> since all methods internally do Box::new.

[Optional] What alternatives have you considered?

Maybe using traits wasn't the right call... Maybe we could have better enums? Like keep all insert, insert_axislike etc., but use enums instead of boxes.

Related work

Caused by https://github.com/Leafwing-Studios/leafwing-input-manager/pull/534.

Shatur commented 2 months ago

Looks like the crate already uses https://github.com/Gohla/serde_flexitos, we just need include an example for it.

alice-i-cecile commented 2 months ago

Adding a generic insert_boxed method to InputMap is an easy PR, and something I'm firmly in favor of.

Shatur commented 2 months ago

Another option would be consider enum dispatch. I.e. keep all the separation like Buttonlike, Axislike, but make them enums.