{"id":177,"date":"2025-08-06T21:22:41","date_gmt":"2025-08-06T13:22:41","guid":{"rendered":"https:\/\/playerzhou.com\/blog\/?p=177"},"modified":"2025-10-05T20:18:28","modified_gmt":"2025-10-05T12:18:28","slug":"ue5-5%e5%90%8eworld-partition%e4%b8%8blevel-instance%e7%9a%84%e5%8a%a0%e8%bd%bd%e6%9c%ba%e5%88%b6","status":"publish","type":"post","link":"https:\/\/playerzhou.com\/blog\/?p=177","title":{"rendered":"UE5.5\u540eworld partition\u4e0blevel instance\u7684\u52a0\u8f7d\u673a\u5236"},"content":{"rendered":"<p>\u57285.5\u4e4b\u524d\uff0c\u5bf9\u4e8elevel instance\u7684\u52a0\u8f7d\u673a\u5236\u89c1https:\/\/dev.epicgames.com\/documentation\/en-us\/unreal-engine\/level-instancing-in-unreal-engine \uff0c\u5f53level instance\u4f7f\u7528\u4e86ofpa\u673a\u5236\u65f6\uff0ccook\u65f6\u4f1a\u628alevel\u91cc\u7684actor\u6253\u6563\u8fdbcell\u4e2d\uff0c\u8868\u73b0\u4e0e\u573a\u666f\u4e2d\u666e\u901aactor\u4e00\u81f4\uff0c\u82e5\u672a\u4f7f\u7528ofpa\u673a\u5236\uff0c\u5219\u662f\u4ee5\u4e00\u6574\u4e2a\u5b8c\u6574\u7684level\u4e3a\u5355\u4f4d\u8fdb\u884c\u52a0\u8f7d<\/p>\n<p>\u4f46\u57285.5\u4e4b\u540e\uff0c\u5bf9\u4e8e\u672a\u4f7f\u7528ofpa\u7684level\uff0c\u5728\u4fdd\u5b58\u524d\uff0c\u4f7f\u7528<\/p>\n<pre><code class=\"language-cpp\">void UWorld::GetExtendedAssetRegistryTagsForSave(const ITargetPlatform* TargetPlatform, TArray&lt;FAssetRegistryTag&gt;&amp; OutTags) const\n{\n    Super::GetExtendedAssetRegistryTagsForSave(TargetPlatform, OutTags);\n\n    if (!PersistentLevel-&gt;IsUsingExternalActors())\n    {\n        TArray&lt;FString&gt; ActorsMetaData;\n        for (AActor* Actor : PersistentLevel-&gt;Actors)\n        {\n            if (IsValid(Actor) &amp;&amp; Actor-&gt;SupportsExternalPackaging())\n            {\n                FWorldPartitionActorDescUtils::FActorDescInitParams ActorDescInitParams(Actor);\n                ActorsMetaData.Add(ActorDescInitParams.ToString());\n            }\n        }\n\n        if (ActorsMetaData.Num())\n        {\n            static FName NAME_ActorsMetaData(TEXT(&quot;ActorsMetaData&quot;));\n            const FString ActorsMetaDataStr = FString::Join(ActorsMetaData, TEXT(&quot;;&quot;));\n            OutTags.Add(UObject::FAssetRegistryTag(NAME_ActorsMetaData, ActorsMetaDataStr, UObject::FAssetRegistryTag::TT_Hidden));\n        }\n    }\n}<\/code><\/pre>\n<p>\u4e3alevel\u7684package\u589e\u52a0<code>ActorsMetaData<\/code>\u6570\u636e\uff0c\u5c06actor\u7684\u4fe1\u606f\u5b58\u5728package\u5185\uff0cworld partition\u6301\u6709\u7684actordesccontainer\u521d\u59cb\u5316\u65f6<\/p>\n<pre><code class=\"language-cpp\">void UActorDescContainer::Initialize(const FInitializeParams&amp; InitParams)\n{\n    \/\/ \u7701\u7565\u4e0a\u6587\n\n        \/\/ Gather external actors\n        {\n            TRACE_CPUPROFILER_EVENT_SCOPE(GetExternalAssets);\n\n            FARFilter Filter;\n            Filter.bRecursivePaths = true;\n            Filter.bIncludeOnlyOnDiskAssets = true;\n            Filter.PackagePaths.Add(*ContainerExternalActorsPath);\n\n            FExternalPackageHelper::GetSortedAssets(Filter, ExternalAssets);\n        }\n\n        \/\/ Gather non-external actors\n        {\n            TRACE_CPUPROFILER_EVENT_SCOPE(GetInternalAssets);\n\n            FARFilter Filter;\n            Filter.bIncludeOnlyOnDiskAssets = true;\n            Filter.PackageNames.Add(ContainerPackageName);\n\n            TArray&lt;FAssetData&gt; WorldAssetData;\n            AssetRegistry.GetAssets(Filter, WorldAssetData);\n\n            \/\/ Transform world assets\n            static FName NAME_ActorsMetaData(TEXT(&quot;ActorsMetaData&quot;));\n            for (const FAssetData&amp; AssetData : WorldAssetData)\n            {\n                FString ActorsMetaDataStr;\n                if (AssetData.GetTagValue(NAME_ActorsMetaData, ActorsMetaDataStr))\n                {\n                    TArray&lt;FString&gt; ActorsMetaData;\n                    if (ActorsMetaDataStr.ParseIntoArray(ActorsMetaData, TEXT(&quot;;&quot;)))\n                    {\n                        InternalAssets.Append(ActorsMetaData);\n                    }\n                }\n            }\n        }\n    }\n\n    \/\/ \u7701\u7565\u4e0b\u6587\n}<\/code><\/pre>\n<p>\u4ece<code>ActorsMetaData<\/code>\u4e2d\u63d0\u53d6actor\u6570\u636e\uff0c\u7528\u4e8e\u751f\u6210actor desc\uff0c\u4e4b\u540ecook\u65f6\u5373\u53ef\u901a\u8fc7actor desc\u5c06level\u91cc\u7684actor\u6253\u6563\u81f3cell\u4e2d<\/p>\n<p>\u81f3\u6b64\uff0c\u5bf9\u4e8e5.5\u4e4b\u540e\u7248\u672c\u521b\u5efa\u7684level\u6765\u8bf4\uff0c\u5c06\u52a0\u8f7d\u6a21\u5f0f\u7684\u914d\u7f6e\u66b4\u9732\u7ed9\u7528\u6237\u4e86\uff08\u8fd9\u91cc\u4e0e\u6587\u6863\u4e0d\u4e00\u81f4\uff09\uff0c\u65e0\u8bba\u662f\u5426\u5f00\u542fofpa\uff0c\u5f53\u5176\u4f5c\u4e3alevel instance\u5bfc\u5165world partition\u573a\u666f\u4e2d\u65f6\uff0c\u5b83\u90fd\u9ed8\u8ba4\u4f7f\u7528Embedded Mode\uff0c\u5c06level\u62c6\u6563\u3002<\/p>\n<p>\u4f46\u5bf9\u4e8e5.5\u4e4b\u524d\u521b\u5efa\u7684level\uff0c\u7531\u4e8e\u7f3a\u5c11<code>ActorsMetaData<\/code>\uff0c\u4ecd\u7136\u4f7f\u7528<code>Level Streaming Mode<\/code>\uff0c\u4ee5\u5b8c\u6574\u7684level\u4e3a\u5355\u4f4d\u8fdb\u884c\u52a0\u8f7d\uff0c\u5e76\u4e14\u53ea\u9700\u91cd\u65b0\u4fdd\u5b58\u5373\u53ef\u4e3alevel\u751f\u6210<code>ActorsMetaData<\/code>\uff0c\u4ece\u800c\u4f7f\u7528Embedded Mode<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u57285.5\u4e4b\u524d\uff0c\u5bf9\u4e8elevel instance\u7684\u52a0\u8f7d\u673a\u5236\u89c1https:\/\/dev.epicgames.com\/ [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[15,3],"tags":[],"_links":{"self":[{"href":"https:\/\/playerzhou.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/177"}],"collection":[{"href":"https:\/\/playerzhou.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/playerzhou.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/playerzhou.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/playerzhou.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=177"}],"version-history":[{"count":2,"href":"https:\/\/playerzhou.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/177\/revisions"}],"predecessor-version":[{"id":181,"href":"https:\/\/playerzhou.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/177\/revisions\/181"}],"wp:attachment":[{"href":"https:\/\/playerzhou.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=177"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/playerzhou.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=177"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/playerzhou.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=177"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}