Ok I figured out why it fails on restore. The RestoreState method (below) gives it the transform of the parent, which is overwritten by the Mover. But the “bad” guard position stays. It seems now the correct fix is to modify the AIController to implement ISaveable
public void RestoreState(object state)
{
if (state is List<KeyValuePair<string, object>> stateDict)
{
foreach (KeyValuePair<string, object> pair in stateDict)
{
DynamicCharacterConfiguration config = DynamicCharacterConfiguration.GetFromID(pair.Key);
if (config == null) continue;
var character = CreateDynamicEntity(config, transform.position, transform.eulerAngles);
if (character)
{
character.RestoreState(pair.Value);
}
}
}
}