Thanks sensei.
So far im trying something that might be stupid but its working.
Though its only for transition between Campaign Level and Battle Level.
So before I change level,
I duplicate the UObjects using:
TMap<UArmyObj*, UArmyObj*> Old_New_Army_Map;
for (int32 i = 0; i < CampaignMapManager->All_Armies.Num(); ++i) {
UArmyObj* Original = CampaignMapManager->All_Armies[i];
UArmyObj* SavedArmy = DuplicateObject<UArmyObj>(Original, GameInstance);
Old_New_Army_Map.Add(CampaignMapManager->All_Armies[i], SavedArmy);
This duplicated the UObject perfectly into the GameInstance. The DuplicateObject is very convenient because you dont need to build the whole project with all the variables.
Then I use the TMap Old_New_Army_Map, to keep track of what the new duplicate armies (backup) correspond to the armies in the Campaign (about to become invalid).
Before I launch the Battle level, I fix all the references in the duplicated UObjects. This is easy because im creatin a TMap. So In the duplicated UObjects you have references to Armies and Regions, you fix those references using the TMap.
Then when you load back the Campaign, do something similar (though some exceptions may be necessary), Spawn all the regions, armies, using again TMaps, that relate the GameInstance UObjects, with the newly respawned UObjects. And then fix them by iterating through them.
And voilá it is working. I did this a bit by intuition… so im not sure…
Is this good enough? Is there something im missing? Do you recommend I do it some other way, or maybe even use SPUD ?
Let me know before i do my whole project this way, only to shoot foot later