| 1324 | } |
| 1325 | |
| 1326 | FFlowAssetSaveData UFlowAsset::SaveInstance(TArray<FFlowAssetSaveData>& SavedFlowInstances) |
| 1327 | { |
| 1328 | FFlowAssetSaveData AssetRecord; |
| 1329 | AssetRecord.WorldName = IsBoundToWorld() ? GetWorld()->GetName() : FString(); |
| 1330 | AssetRecord.InstanceName = GetName(); |
| 1331 | |
| 1332 | // opportunity to collect data before serializing asset |
| 1333 | OnSave(); |
| 1334 | |
| 1335 | // iterate nodes |
| 1336 | TArray<UFlowNode*> NodesInExecutionOrder; |
| 1337 | GetNodesInExecutionOrder<UFlowNode>(GetDefaultEntryNode(), NodesInExecutionOrder); |
| 1338 | for (UFlowNode* Node : NodesInExecutionOrder) |
| 1339 | { |
| 1340 | if (Node && Node->ShouldSave()) |
| 1341 | { |
| 1342 | // iterate SubGraphs |
| 1343 | if (UFlowNode_SubGraph* SubGraphNode = Cast<UFlowNode_SubGraph>(Node)) |
| 1344 | { |
| 1345 | const TWeakObjectPtr<UFlowAsset> SubFlowInstance = GetFlowInstance(SubGraphNode); |
| 1346 | if (SubFlowInstance.IsValid()) |
| 1347 | { |
| 1348 | const FFlowAssetSaveData SubAssetRecord = SubFlowInstance->SaveInstance(SavedFlowInstances); |
| 1349 | SubGraphNode->SavedAssetInstanceName = SubAssetRecord.InstanceName; |
| 1350 | } |
| 1351 | } |
| 1352 | |
| 1353 | FFlowNodeSaveData NodeRecord; |
| 1354 | Node->SaveInstance(NodeRecord); |
| 1355 | |
| 1356 | AssetRecord.NodeRecords.Emplace(NodeRecord); |
| 1357 | } |
| 1358 | } |
| 1359 | |
| 1360 | // serialize asset |
| 1361 | FMemoryWriter MemoryWriter(AssetRecord.AssetData, true); |
| 1362 | FFlowArchive Ar(MemoryWriter); |
| 1363 | Serialize(Ar); |
| 1364 | |
| 1365 | // write archive to SaveGame |
| 1366 | SavedFlowInstances.Emplace(AssetRecord); |
| 1367 | |
| 1368 | return AssetRecord; |
| 1369 | } |
| 1370 | |
| 1371 | void UFlowAsset::LoadInstance(const FFlowAssetSaveData& AssetRecord) |
| 1372 | { |
no test coverage detected