Undo/Redo and property change callbacks in-game?

Unreal has ways to respond to property changes with PostEditChangeProperty, and ways to handle Undo/Redo with FTransaction, but both of these functionalities are limited for use in the Unreal editor, from what I understand, and they do not work in-game.

Does anyone know of an existing library or plugin that implements Unreal property change and undo/redo for in-game functionality? How do others implement these features?

I am trying to design a system that allows a user to create an environment, modifying various properties of each object, with the ability to undo/redo or save/load the environment and its objects. I have been using the SaveGame object along with UProperty(SaveGame) archiving using FObjectAndNameAsStringProxyArchive and this generally works great for saving my environment. But when I reload my objects, I first spawn them, then reload their UProperties after spawn. The issues with this is I additionally have to manually refresh the state of some of my objects after the UProperties have been reloaded since my UProperty data sometimes informs other non-UProperty data in my objects (for example, in one object I have a Color UProperty which is used to set the color of multiple internal meshes). In this instance, it would be really nice to be able to override something like PostEditChangeProperty so no matter how my properties are changed (whether from a load, or from an undo/redo event) I can always properly refresh my object’s state.

It surprises me this kind of functionality does not already exist for in-game use, especially since the serialization functionality of save/load holds part of the functionality needed for an in-game undo-redo system.

Is there any straightforward way to get this general serialization + undo/redo functionality from Unreal, or should I roll my own system?

Anybody out there?

I have found a way to better manage property changes by Blueprints.
There is a UFUNCTION macro keyword (in ObjectMacros.h) called BlueprintSetter with a corresponding macro for UPROPERTY. This allows you to override the default setter function for a certain UPROPERTY in your class. In this setter function, you can run extra logic when a given property is set via Blueprints. Essentially this is a way to receive property change callbacks on a per-property basis in-game, but only when Properties are set via Blueprint code.

For example, you could have a UPROPERTY called NumSegments which is the number of segments that make up some procedural mesh. Then you could write a UFUNCTION called SetSegments() which is marked as BlueprintSetter. You would also need to make sure the NumSegments property is marked to point at this function with BlueprintSetter=SetSegments. Now in your implementation of SetSegments() you can update the NumSegments and additionally recalculate the vertices in your procedural mesh. Now when any Blueprint code access the property and calls the set method, it will both update the property and recalculate the mesh. This basically prevents you from needing to make an extra method call in Blueprints to recalculate the mesh that is associated with the property.

See: https://www.reddit.com/r/unrealengine/comments/hepm94/does_anyone_know_if_you_can_use/

Although this is helpful from a Blueprints perspective, it would be more helpful to have a method like PostEditChangeProperty to use in-game. Then you have a single callback where all property updates are made known to you. I would love to see something like the ValueTree class from the JUCE C++ framework which provides any easy way to receive updates on any specific property or many properties simultaneously in a tree of data:
https://docs.juce.com/master/tutorial_value_tree.html

This ValueTree structure is built to handle things like Undo/Redo and Serialization by default.