From bd17aa46ee1cf49d07acbaefedcd721cf85c2eb7 Mon Sep 17 00:00:00 2001 From: ayuan9957 <107920784+ayuan9957@users.noreply.github.com> Date: Mon, 18 May 2026 14:24:35 +0800 Subject: [PATCH] feat(editor): Stage 1.1 fully completed - Implement SubAssets metadata generation, JSON disk writing and registry scanning --- ...910-71a4e7ddd13e_08b298c97945ab53.mccooked | Bin 0 -> 7699 bytes ...0f2-0e286fd34df4_4aace3861e64b31f.mccooked | Bin 0 -> 7699 bytes .../Library/Cooked/Windows/CookManifest.bin | Bin 18625 -> 20245 bytes ...b99-09f3414902c4_9bccbdef12905449.mccooked | Bin 0 -> 7699 bytes ...4ae-dcd844a54b2f_bf6a12aaf0c383a9.mccooked | Bin 0 -> 7699 bytes ...024-a54a7ed60abb_9b39a8d3606d9c03.mccooked | Bin 0 -> 7699 bytes .../MetaCoreBuiltinCoreServicesModule.cpp | 77 ++++++++++++++++++ .../MetaCoreEditor/MetaCoreEditorAssetTypes.h | 20 +++++ .../Private/MetaCoreAssetRegistry.cpp | 13 +++ 9 files changed, 110 insertions(+) create mode 100644 SandboxProject/Library/Cooked/Windows/42011f8d-0404-4168-9910-71a4e7ddd13e_08b298c97945ab53.mccooked create mode 100644 SandboxProject/Library/Cooked/Windows/4a2a315a-ef41-4931-b0f2-0e286fd34df4_4aace3861e64b31f.mccooked create mode 100644 SandboxProject/Library/Cooked/Windows/a2f792dc-75c8-433b-9b99-09f3414902c4_9bccbdef12905449.mccooked create mode 100644 SandboxProject/Library/Cooked/Windows/c177bd3d-c557-4266-a4ae-dcd844a54b2f_bf6a12aaf0c383a9.mccooked create mode 100644 SandboxProject/Library/Cooked/Windows/c59719c9-705f-43e9-9024-a54a7ed60abb_9b39a8d3606d9c03.mccooked diff --git a/SandboxProject/Library/Cooked/Windows/42011f8d-0404-4168-9910-71a4e7ddd13e_08b298c97945ab53.mccooked b/SandboxProject/Library/Cooked/Windows/42011f8d-0404-4168-9910-71a4e7ddd13e_08b298c97945ab53.mccooked new file mode 100644 index 0000000000000000000000000000000000000000..9a6ed48e3c109970820f2394a01103758bba0bfa GIT binary patch literal 7699 zcmeHM&2Jk;6yFpmP|8;uDk>1lrAR%{3d#kf#9#TqQk__F2;zWXygO?TUGG{m>kuO$ zg&PugpgC}Z8(dHi+zKZSj>L&S0f|fDUL-nicYeE0ybkL)5+BV+@iD_tXZ8)&;v4-gA10qM zK={)3gu=f$MEGyU@+Zx6k$1W8 zaNq7vVEt#tCt0q6_2-O&N>7DB$Ao4A9be|qfl1U^-wT-2;C84}S>=oG*M}(RT#T*9 zWR``;hvR?#g_us+L)Y2(p=(X}S30(`bxJ;iZ#-m`K=KBCTny}9hx?(SMdd*6C=29j zN$E_Sx^~u@?`xM(-p?9^S%xD0sm`koro8*!?5)C^^;;NWd|cJZvJD>00-1_93{}cI z#*<*h6U7NS{ZDC&lp>>{8sEsfP_?4z@$}Tk&&EPA4-!QdA~@-spcMAknbfgJ>9L&s zMw~Yvp_q)At7z?#Ay^xd`O4MZ^drNI$s~FLB`7m7A!6GboGn_`&qYLLJqQ``EcHAt z7kNu^u2TN)4@Pv-JR3Ii5)WC{P60RE5Zkz8#?6pT5COYX8})mI_&ZJvEsjHDfbrlJLtc(Y*YHMihIGf8%@hJN@_;%QnJU0x(Ry?0KFEzaa z@H}C!2fbFC*2~ihMw42l6}&gCG$7nkM<^w>__XqnZ>3;bNywsu5y^_)-#I&LOr{^R z7{|CMi*;o7Sxl(d#h|D6BMsqj2fcd+X^E^EE@gDKB$HBN+L%jTx6P;mQexU8B4VW% z2Ch3qF2HK!z=7_Mj7~RGNk~$NC>CbFT`A0;c`HGIs0^vxqE#dG{iQFAYV?}amPY7U zV{8f~w1*PspvxZ9N&zOp=Xp>Eu7W9>%-iA!%*2qRmw~sncmHw7`O~-}2joyPAc5~g z$U&}<8|XR#m*Hca*eB`VF`e_sn2PE<0hefPa-V?9?#;IguKVl4-r)KI>g`_-E&vEL zj6C21Tm&#}F#pCh*izJ$czoD$?b>$*-20Ci0MO}4m_~K%^G~oP?T6-V%ytH;0)FKB z$;Jg98GfE%%f1a@78Zkmhg55MQ zrsOf%nJaT<2mX;UCa%Z1B0Ztt@T2T_1pNg-9>yZtmW^s8<(*c{n2D zbTeJ*k2#UX*ar9Fv*R5zS2B(cIC0((GjJ#V0i)`S9G{`@m-G)>TjqC;(Vr>yi_^ay Llzh7#$Wg|7VDv>0 literal 0 HcmV?d00001 diff --git a/SandboxProject/Library/Cooked/Windows/4a2a315a-ef41-4931-b0f2-0e286fd34df4_4aace3861e64b31f.mccooked b/SandboxProject/Library/Cooked/Windows/4a2a315a-ef41-4931-b0f2-0e286fd34df4_4aace3861e64b31f.mccooked new file mode 100644 index 0000000000000000000000000000000000000000..9a6ed48e3c109970820f2394a01103758bba0bfa GIT binary patch literal 7699 zcmeHM&2Jk;6yFpmP|8;uDk>1lrAR%{3d#kf#9#TqQk__F2;zWXygO?TUGG{m>kuO$ zg&PugpgC}Z8(dHi+zKZSj>L&S0f|fDUL-nicYeE0ybkL)5+BV+@iD_tXZ8)&;v4-gA10qM zK={)3gu=f$MEGyU@+Zx6k$1W8 zaNq7vVEt#tCt0q6_2-O&N>7DB$Ao4A9be|qfl1U^-wT-2;C84}S>=oG*M}(RT#T*9 zWR``;hvR?#g_us+L)Y2(p=(X}S30(`bxJ;iZ#-m`K=KBCTny}9hx?(SMdd*6C=29j zN$E_Sx^~u@?`xM(-p?9^S%xD0sm`koro8*!?5)C^^;;NWd|cJZvJD>00-1_93{}cI z#*<*h6U7NS{ZDC&lp>>{8sEsfP_?4z@$}Tk&&EPA4-!QdA~@-spcMAknbfgJ>9L&s zMw~Yvp_q)At7z?#Ay^xd`O4MZ^drNI$s~FLB`7m7A!6GboGn_`&qYLLJqQ``EcHAt z7kNu^u2TN)4@Pv-JR3Ii5)WC{P60RE5Zkz8#?6pT5COYX8})mI_&ZJvEsjHDfbrlJLtc(Y*YHMihIGf8%@hJN@_;%QnJU0x(Ry?0KFEzaa z@H}C!2fbFC*2~ihMw42l6}&gCG$7nkM<^w>__XqnZ>3;bNywsu5y^_)-#I&LOr{^R z7{|CMi*;o7Sxl(d#h|D6BMsqj2fcd+X^E^EE@gDKB$HBN+L%jTx6P;mQexU8B4VW% z2Ch3qF2HK!z=7_Mj7~RGNk~$NC>CbFT`A0;c`HGIs0^vxqE#dG{iQFAYV?}amPY7U zV{8f~w1*PspvxZ9N&zOp=Xp>Eu7W9>%-iA!%*2qRmw~sncmHw7`O~-}2joyPAc5~g z$U&}<8|XR#m*Hca*eB`VF`e_sn2PE<0hefPa-V?9?#;IguKVl4-r)KI>g`_-E&vEL zj6C21Tm&#}F#pCh*izJ$czoD$?b>$*-20Ci0MO}4m_~K%^G~oP?T6-V%ytH;0)FKB z$;Jg98GfE%%f1a@78Zkmhg55MQ zrsOf%nJaT<2mX;UCa%Z1B0Ztt@T2T_1pNg-9>yZtmW^s8<(*c{n2D zbTeJ*k2#UX*ar9Fv*R5zS2B(cIC0((GjJ#V0i)`S9G{`@m-G)>TjqC;(Vr>yi_^ay Llzh7#$Wg|7VDv>0 literal 0 HcmV?d00001 diff --git a/SandboxProject/Library/Cooked/Windows/CookManifest.bin b/SandboxProject/Library/Cooked/Windows/CookManifest.bin index 9d5a3d08a69385cd14f42949151247ceb92b2d99..7b9477c79564e05baf3f32783ddbc6cb1f554637 100644 GIT binary patch delta 477 zcmXBQxoebB6vkmkQ%o#OCXLt_3kwkr-sRlo5FD5+;EZUaAlQ7~6%oW(Bw`a3!A=mvxwW)VwBXhI;zgz9CZ_BSVjUpQoF@RCQ0!rzDJP|O;5;+nR0SodW_?R*m z#1tZxmj}k{?c?2{^~Lvd72Vm-Pp-Gx{MoM^`_8Q%`BQ$tX>`I#t{kL{9FQaj&$0lP zgw;7pj2R1bE+lC+Pa3`CxuS<(#@$!HJ?T{R(uKu?%O^(j{L{71;|qrmltp7o1#XOw zGD1+w01Bz;dI)LJt5=zy=in diff --git a/SandboxProject/Library/Cooked/Windows/a2f792dc-75c8-433b-9b99-09f3414902c4_9bccbdef12905449.mccooked b/SandboxProject/Library/Cooked/Windows/a2f792dc-75c8-433b-9b99-09f3414902c4_9bccbdef12905449.mccooked new file mode 100644 index 0000000000000000000000000000000000000000..9a6ed48e3c109970820f2394a01103758bba0bfa GIT binary patch literal 7699 zcmeHM&2Jk;6yFpmP|8;uDk>1lrAR%{3d#kf#9#TqQk__F2;zWXygO?TUGG{m>kuO$ zg&PugpgC}Z8(dHi+zKZSj>L&S0f|fDUL-nicYeE0ybkL)5+BV+@iD_tXZ8)&;v4-gA10qM zK={)3gu=f$MEGyU@+Zx6k$1W8 zaNq7vVEt#tCt0q6_2-O&N>7DB$Ao4A9be|qfl1U^-wT-2;C84}S>=oG*M}(RT#T*9 zWR``;hvR?#g_us+L)Y2(p=(X}S30(`bxJ;iZ#-m`K=KBCTny}9hx?(SMdd*6C=29j zN$E_Sx^~u@?`xM(-p?9^S%xD0sm`koro8*!?5)C^^;;NWd|cJZvJD>00-1_93{}cI z#*<*h6U7NS{ZDC&lp>>{8sEsfP_?4z@$}Tk&&EPA4-!QdA~@-spcMAknbfgJ>9L&s zMw~Yvp_q)At7z?#Ay^xd`O4MZ^drNI$s~FLB`7m7A!6GboGn_`&qYLLJqQ``EcHAt z7kNu^u2TN)4@Pv-JR3Ii5)WC{P60RE5Zkz8#?6pT5COYX8})mI_&ZJvEsjHDfbrlJLtc(Y*YHMihIGf8%@hJN@_;%QnJU0x(Ry?0KFEzaa z@H}C!2fbFC*2~ihMw42l6}&gCG$7nkM<^w>__XqnZ>3;bNywsu5y^_)-#I&LOr{^R z7{|CMi*;o7Sxl(d#h|D6BMsqj2fcd+X^E^EE@gDKB$HBN+L%jTx6P;mQexU8B4VW% z2Ch3qF2HK!z=7_Mj7~RGNk~$NC>CbFT`A0;c`HGIs0^vxqE#dG{iQFAYV?}amPY7U zV{8f~w1*PspvxZ9N&zOp=Xp>Eu7W9>%-iA!%*2qRmw~sncmHw7`O~-}2joyPAc5~g z$U&}<8|XR#m*Hca*eB`VF`e_sn2PE<0hefPa-V?9?#;IguKVl4-r)KI>g`_-E&vEL zj6C21Tm&#}F#pCh*izJ$czoD$?b>$*-20Ci0MO}4m_~K%^G~oP?T6-V%ytH;0)FKB z$;Jg98GfE%%f1a@78Zkmhg55MQ zrsOf%nJaT<2mX;UCa%Z1B0Ztt@T2T_1pNg-9>yZtmW^s8<(*c{n2D zbTeJ*k2#UX*ar9Fv*R5zS2B(cIC0((GjJ#V0i)`S9G{`@m-G)>TjqC;(Vr>yi_^ay Llzh7#$Wg|7VDv>0 literal 0 HcmV?d00001 diff --git a/SandboxProject/Library/Cooked/Windows/c177bd3d-c557-4266-a4ae-dcd844a54b2f_bf6a12aaf0c383a9.mccooked b/SandboxProject/Library/Cooked/Windows/c177bd3d-c557-4266-a4ae-dcd844a54b2f_bf6a12aaf0c383a9.mccooked new file mode 100644 index 0000000000000000000000000000000000000000..9a6ed48e3c109970820f2394a01103758bba0bfa GIT binary patch literal 7699 zcmeHM&2Jk;6yFpmP|8;uDk>1lrAR%{3d#kf#9#TqQk__F2;zWXygO?TUGG{m>kuO$ zg&PugpgC}Z8(dHi+zKZSj>L&S0f|fDUL-nicYeE0ybkL)5+BV+@iD_tXZ8)&;v4-gA10qM zK={)3gu=f$MEGyU@+Zx6k$1W8 zaNq7vVEt#tCt0q6_2-O&N>7DB$Ao4A9be|qfl1U^-wT-2;C84}S>=oG*M}(RT#T*9 zWR``;hvR?#g_us+L)Y2(p=(X}S30(`bxJ;iZ#-m`K=KBCTny}9hx?(SMdd*6C=29j zN$E_Sx^~u@?`xM(-p?9^S%xD0sm`koro8*!?5)C^^;;NWd|cJZvJD>00-1_93{}cI z#*<*h6U7NS{ZDC&lp>>{8sEsfP_?4z@$}Tk&&EPA4-!QdA~@-spcMAknbfgJ>9L&s zMw~Yvp_q)At7z?#Ay^xd`O4MZ^drNI$s~FLB`7m7A!6GboGn_`&qYLLJqQ``EcHAt z7kNu^u2TN)4@Pv-JR3Ii5)WC{P60RE5Zkz8#?6pT5COYX8})mI_&ZJvEsjHDfbrlJLtc(Y*YHMihIGf8%@hJN@_;%QnJU0x(Ry?0KFEzaa z@H}C!2fbFC*2~ihMw42l6}&gCG$7nkM<^w>__XqnZ>3;bNywsu5y^_)-#I&LOr{^R z7{|CMi*;o7Sxl(d#h|D6BMsqj2fcd+X^E^EE@gDKB$HBN+L%jTx6P;mQexU8B4VW% z2Ch3qF2HK!z=7_Mj7~RGNk~$NC>CbFT`A0;c`HGIs0^vxqE#dG{iQFAYV?}amPY7U zV{8f~w1*PspvxZ9N&zOp=Xp>Eu7W9>%-iA!%*2qRmw~sncmHw7`O~-}2joyPAc5~g z$U&}<8|XR#m*Hca*eB`VF`e_sn2PE<0hefPa-V?9?#;IguKVl4-r)KI>g`_-E&vEL zj6C21Tm&#}F#pCh*izJ$czoD$?b>$*-20Ci0MO}4m_~K%^G~oP?T6-V%ytH;0)FKB z$;Jg98GfE%%f1a@78Zkmhg55MQ zrsOf%nJaT<2mX;UCa%Z1B0Ztt@T2T_1pNg-9>yZtmW^s8<(*c{n2D zbTeJ*k2#UX*ar9Fv*R5zS2B(cIC0((GjJ#V0i)`S9G{`@m-G)>TjqC;(Vr>yi_^ay Llzh7#$Wg|7VDv>0 literal 0 HcmV?d00001 diff --git a/SandboxProject/Library/Cooked/Windows/c59719c9-705f-43e9-9024-a54a7ed60abb_9b39a8d3606d9c03.mccooked b/SandboxProject/Library/Cooked/Windows/c59719c9-705f-43e9-9024-a54a7ed60abb_9b39a8d3606d9c03.mccooked new file mode 100644 index 0000000000000000000000000000000000000000..9a6ed48e3c109970820f2394a01103758bba0bfa GIT binary patch literal 7699 zcmeHM&2Jk;6yFpmP|8;uDk>1lrAR%{3d#kf#9#TqQk__F2;zWXygO?TUGG{m>kuO$ zg&PugpgC}Z8(dHi+zKZSj>L&S0f|fDUL-nicYeE0ybkL)5+BV+@iD_tXZ8)&;v4-gA10qM zK={)3gu=f$MEGyU@+Zx6k$1W8 zaNq7vVEt#tCt0q6_2-O&N>7DB$Ao4A9be|qfl1U^-wT-2;C84}S>=oG*M}(RT#T*9 zWR``;hvR?#g_us+L)Y2(p=(X}S30(`bxJ;iZ#-m`K=KBCTny}9hx?(SMdd*6C=29j zN$E_Sx^~u@?`xM(-p?9^S%xD0sm`koro8*!?5)C^^;;NWd|cJZvJD>00-1_93{}cI z#*<*h6U7NS{ZDC&lp>>{8sEsfP_?4z@$}Tk&&EPA4-!QdA~@-spcMAknbfgJ>9L&s zMw~Yvp_q)At7z?#Ay^xd`O4MZ^drNI$s~FLB`7m7A!6GboGn_`&qYLLJqQ``EcHAt z7kNu^u2TN)4@Pv-JR3Ii5)WC{P60RE5Zkz8#?6pT5COYX8})mI_&ZJvEsjHDfbrlJLtc(Y*YHMihIGf8%@hJN@_;%QnJU0x(Ry?0KFEzaa z@H}C!2fbFC*2~ihMw42l6}&gCG$7nkM<^w>__XqnZ>3;bNywsu5y^_)-#I&LOr{^R z7{|CMi*;o7Sxl(d#h|D6BMsqj2fcd+X^E^EE@gDKB$HBN+L%jTx6P;mQexU8B4VW% z2Ch3qF2HK!z=7_Mj7~RGNk~$NC>CbFT`A0;c`HGIs0^vxqE#dG{iQFAYV?}amPY7U zV{8f~w1*PspvxZ9N&zOp=Xp>Eu7W9>%-iA!%*2qRmw~sncmHw7`O~-}2joyPAc5~g z$U&}<8|XR#m*Hca*eB`VF`e_sn2PE<0hefPa-V?9?#;IguKVl4-r)KI>g`_-E&vEL zj6C21Tm&#}F#pCh*izJ$czoD$?b>$*-20Ci0MO}4m_~K%^G~oP?T6-V%ytH;0)FKB z$;Jg98GfE%%f1a@78Zkmhg55MQ zrsOf%nJaT<2mX;UCa%Z1B0Ztt@T2T_1pNg-9>yZtmW^s8<(*c{n2D zbTeJ*k2#UX*ar9Fv*R5zS2B(cIC0((GjJ#V0i)`S9G{`@m-G)>TjqC;(Vr>yi_^ay Llzh7#$Wg|7VDv>0 literal 0 HcmV?d00001 diff --git a/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp b/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp index e305259..268d53f 100644 --- a/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp +++ b/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp @@ -59,6 +59,20 @@ bool MetaCoreWriteMetaJson( json["package_path"] = metadata.PackagePath.generic_string(); json["source_hash"] = metadata.SourceHash; + // 序列化子资产列表 + if (!metadata.SubAssets.empty()) { + auto subAssetsJson = nlohmann::json::array(); + for (const auto& subAsset : metadata.SubAssets) { + nlohmann::json subAssetJson; + subAssetJson["guid"] = subAsset.Guid.ToString(); + subAssetJson["type"] = subAsset.Type; + subAssetJson["name"] = subAsset.Name; + subAssetJson["index"] = subAsset.Index; + subAssetsJson.push_back(subAssetJson); + } + json["sub_assets"] = subAssetsJson; + } + // 将 JSON 漂亮格式化并写入文件 std::ofstream output(absoluteMetaPath); if (!output.is_open()) { @@ -102,6 +116,32 @@ bool MetaCoreReadMetaJson( if (json.contains("source_hash") && json["source_hash"].is_number_integer()) { outMetadata.SourceHash = json["source_hash"].get(); } + + // 解析子资产列表 + outMetadata.SubAssets.clear(); + if (json.contains("sub_assets") && json["sub_assets"].is_array()) { + for (const auto& subAssetJson : json["sub_assets"]) { + MetaCoreSubAssetMetadata subAsset; + if (subAssetJson.contains("guid") && subAssetJson["guid"].is_string()) { + auto parsed = MetaCoreAssetGuid::Parse(subAssetJson["guid"].get()); + if (parsed.has_value()) { + subAsset.Guid = *parsed; + } + } + if (subAssetJson.contains("type") && subAssetJson["type"].is_string()) { + subAsset.Type = subAssetJson["type"].get(); + } + if (subAssetJson.contains("name") && subAssetJson["name"].is_string()) { + subAsset.Name = subAssetJson["name"].get(); + } + if (subAssetJson.contains("index") && subAssetJson["index"].is_number_integer()) { + subAsset.Index = subAssetJson["index"].get(); + } + if (subAsset.Guid.IsValid()) { + outMetadata.SubAssets.push_back(subAsset); + } + } + } return true; } catch (...) { return false; @@ -4097,6 +4137,43 @@ bool MetaCoreBuiltinImportPipelineService::ImportSourceFile(const std::filesyste meshPayloads, existingModelImportSettings ); + + // 收集生成的子资产信息到元数据中,以便落盘和注册表在下次启动时扫描解析 + metadata.SubAssets.clear(); + for (std::size_t index = 0; index < importedAsset.GeneratedMeshAssets.size(); ++index) { + const auto& mesh = importedAsset.GeneratedMeshAssets[index]; + if (mesh.AssetGuid.IsValid()) { + MetaCoreSubAssetMetadata sub; + sub.Guid = mesh.AssetGuid; + sub.Type = "mesh"; + sub.Name = mesh.Name; + sub.Index = static_cast(index); + metadata.SubAssets.push_back(sub); + } + } + for (std::size_t index = 0; index < importedAsset.GeneratedMaterialAssets.size(); ++index) { + const auto& mat = importedAsset.GeneratedMaterialAssets[index]; + if (mat.AssetGuid.IsValid()) { + MetaCoreSubAssetMetadata sub; + sub.Guid = mat.AssetGuid; + sub.Type = "material"; + sub.Name = mat.Name; + sub.Index = static_cast(index); + metadata.SubAssets.push_back(sub); + } + } + for (std::size_t index = 0; index < importedAsset.GeneratedTextureAssets.size(); ++index) { + const auto& tex = importedAsset.GeneratedTextureAssets[index]; + if (tex.AssetGuid.IsValid()) { + MetaCoreSubAssetMetadata sub; + sub.Guid = tex.AssetGuid; + sub.Type = "texture"; + sub.Name = tex.Name; + sub.Index = static_cast(index); + metadata.SubAssets.push_back(sub); + } + } + importedAssetBytes = MetaCoreSerializeToBytes(importedAsset, registry); importedAssetTypeName = "MetaCoreModelAssetDocument"; diff --git a/Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorAssetTypes.h b/Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorAssetTypes.h index 32e3d58..e57755a 100644 --- a/Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorAssetTypes.h +++ b/Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorAssetTypes.h @@ -40,6 +40,23 @@ enum class MetaCoreUiVerticalAlignment { Stretch }; +MC_STRUCT() +struct MetaCoreSubAssetMetadata { + MC_GENERATED_BODY() + + MC_PROPERTY() + MetaCoreAssetGuid Guid{}; + + MC_PROPERTY() + std::string Type{}; + + MC_PROPERTY() + std::string Name{}; + + MC_PROPERTY() + std::int32_t Index = 0; +}; + MC_STRUCT() struct MetaCoreAssetMetadataDocument { MC_GENERATED_BODY() @@ -61,6 +78,9 @@ struct MetaCoreAssetMetadataDocument { MC_PROPERTY() std::uint64_t SourceHash = 0; + + MC_PROPERTY() + std::vector SubAssets{}; }; MC_STRUCT() diff --git a/Source/MetaCoreFoundation/Private/MetaCoreAssetRegistry.cpp b/Source/MetaCoreFoundation/Private/MetaCoreAssetRegistry.cpp index 5823d4c..3587740 100644 --- a/Source/MetaCoreFoundation/Private/MetaCoreAssetRegistry.cpp +++ b/Source/MetaCoreFoundation/Private/MetaCoreAssetRegistry.cpp @@ -42,6 +42,19 @@ void MetaCoreAssetRegistry::ScanDirectory(const std::filesystem::path& rootPath) // 规格化路径,确保斜杠在跨平台的一致性 std::filesystem::path portablePath(sourcePathStr); RegisterAsset(*parsedGuid, portablePath); + + // 顺便注册该主模型派生的所有子资产(如 mesh, material 等) + if (json.contains("sub_assets") && json["sub_assets"].is_array()) { + for (const auto& subAssetJson : json["sub_assets"]) { + if (subAssetJson.contains("guid") && subAssetJson["guid"].is_string()) { + const std::string subGuidStr = subAssetJson["guid"].get(); + auto parsedSubGuid = MetaCoreAssetGuid::Parse(subGuidStr); + if (parsedSubGuid.has_value()) { + RegisterAsset(*parsedSubGuid, portablePath); + } + } + } + } } } } catch (...) {