[{"data":1,"prerenderedAt":2239},["ShallowReactive",2],{"page-ue5-1":3,"page-count-ue5":136},[4,1195,1316,1596,1843],{"id":5,"title":6,"body":7,"date":1180,"description":13,"extension":1181,"meta":1182,"navigation":289,"path":1188,"seo":1189,"stem":1190,"tags":1191,"__hash__":1194},"blogs\u002F_legacy\u002F2026\u002F2026-02-06-send-to-unreal-texture-fix.md","Send to unreal贴图丢失问题",{"type":8,"value":9,"toc":1175},"minimark",[10,14,25,38,42,45,51,54,57,60,63,176,182,185,192,195,795,806,815,818,1168,1171],[11,12,13],"p",{},"在使用Send to Unreal的过程中，发现对于部分模型，会出现贴图导入错误的问题。",[11,15,16,17,24],{},"目前使用的其实是第三方维护的",[18,19,23],"a",{"href":20,"rel":21},"https:\u002F\u002Fgithub.com\u002Fpoly-hammer\u002FBlenderTools",[22],"nofollow","Send to Unreal","，因为官方的已经很久没有更新了。使用的工具的版本信息：",[26,27,28,32,35],"ul",{},[29,30,31],"li",{},"UE5.7",[29,33,34],{},"Send to Unreal 2.6.7",[29,36,37],{},"Blender4.2",[39,40,41],"h2",{"id":41},"贴图丢失",[11,43,44],{},"在进行模型导入后，部分贴图会进入一种错误的状态，当保存时会报错并提示：",[46,47,48],"blockquote",{},[11,49,50],{},"Filename '_11' resolves to 'None' and cannot be used",[11,52,53],{},"且在编辑器中无法看到贴图资产。材质和Mesh表现正常，但是重启后由于这些贴图没有保存，就会变成没有贴图的状态。",[11,55,56],{},"这个问题可以手动解决，只要在材质中打开使用的贴图，然后另存为一下就可以了。但是由于有的模型材质比较多，手动处理会非常麻烦，介于手动处理的步骤只是在使用编辑器功能，所以肯定是能自动处理的。",[39,58,59],{"id":59},"查找未保存的资产",[11,61,62],{},"引擎是有提供接口的，毕竟当点击关闭的时候编辑器会提示需要保存的资产，用这个窗口的文本直接搜索就能找到对应的代码了。",[64,65,70],"pre",{"className":66,"code":67,"language":68,"meta":69,"style":69},"language-cpp shiki shiki-themes github-light-high-contrast github-dark monokai","\u002F\u002F A list of all packages that need to be saved\nTArray\u003CUPackage*> PackagesToSave;\nif (bSaveMapPackages)\n{\n    FEditorFileUtils::GetDirtyWorldPackages(PackagesToSave, ShouldIgnorePackageFunction);\n}\n\u002F\u002F Don't iterate through content packages if we don't plan on saving them\nif (bSaveContentPackages)\n{\n    FEditorFileUtils::GetDirtyContentPackages(PackagesToSave, ShouldIgnorePackageFunction);\n}\n","cpp","",[71,72,73,82,102,111,117,134,140,146,154,159,171],"code",{"__ignoreMap":69},[74,75,78],"span",{"class":76,"line":77},"line",1,[74,79,81],{"class":80},"sZdD5","\u002F\u002F A list of all packages that need to be saved\n",[74,83,85,89,93,96,99],{"class":76,"line":84},2,[74,86,88],{"class":87},"s0idv","TArray",[74,90,92],{"class":91},"sLXdl","\u003C",[74,94,95],{"class":87},"UPackage",[74,97,98],{"class":91},"*>",[74,100,101],{"class":87}," PackagesToSave;\n",[74,103,105,108],{"class":76,"line":104},3,[74,106,107],{"class":91},"if",[74,109,110],{"class":87}," (bSaveMapPackages)\n",[74,112,114],{"class":76,"line":113},4,[74,115,116],{"class":87},"{\n",[74,118,120,124,127,131],{"class":76,"line":119},5,[74,121,123],{"class":122},"sfUV7","    FEditorFileUtils",[74,125,126],{"class":87},"::",[74,128,130],{"class":129},"scAT4","GetDirtyWorldPackages",[74,132,133],{"class":87},"(PackagesToSave, ShouldIgnorePackageFunction);\n",[74,135,137],{"class":76,"line":136},6,[74,138,139],{"class":87},"}\n",[74,141,143],{"class":76,"line":142},7,[74,144,145],{"class":80},"\u002F\u002F Don't iterate through content packages if we don't plan on saving them\n",[74,147,149,151],{"class":76,"line":148},8,[74,150,107],{"class":91},[74,152,153],{"class":87}," (bSaveContentPackages)\n",[74,155,157],{"class":76,"line":156},9,[74,158,116],{"class":87},[74,160,162,164,166,169],{"class":76,"line":161},10,[74,163,123],{"class":122},[74,165,126],{"class":87},[74,167,168],{"class":129},"GetDirtyContentPackages",[74,170,133],{"class":87},[74,172,174],{"class":76,"line":173},11,[74,175,139],{"class":87},[11,177,178,179,181],{},"由于只关注贴图保存问题，所以使用",[71,180,168],{},"就可以了。",[39,183,184],{"id":184},"资产重新保存",[11,186,187,188,191],{},"一开始是想用",[71,189,190],{},"UEditorAssetLibrary::RenameLoadedAsset","来解决的，但是发现无论怎么修改调用方式都会出现错误。",[11,193,194],{},"与ChatGpt沟通了半天，终于找到了解决方案：",[64,196,200],{"className":197,"code":198,"language":199,"meta":69,"style":69},"language-c shiki shiki-themes github-light-high-contrast github-dark monokai","bool FixInvalidTexture(UTexture2D* Texture)\n{\n    if (!Texture)\n    {\n        UE_LOG(LogTemp, Warning, TEXT(\"FixInvalidTexture: Bad texture\"));\n        return false;\n    }\n\n    UPackage* OldPackage = Texture->GetOutermost();\n    FString OldPackageName = OldPackage->GetName();\n    FString OldTexturePath = GetPathNameSafe(Texture);\n\n    \u002F\u002F ---------- 1. 生成合法新路径 ----------\n    FString AssetName = FPackageName::GetShortName(OldPackageName);\n\n    \u002F\u002F 以数字或 _ 开头 → 修复\n    if (!FChar::IsAlpha(AssetName[0]))\n    {\n        AssetName = TEXT(\"T\") + AssetName;\n    }\n\n    FString NewPackagePath =\n        FPackageName::GetLongPackagePath(OldPackageName) \u002F AssetName;\n\n    \u002F\u002F ---------- 2. 创建新 Package ----------\n    UPackage* NewPackage = CreatePackage(*NewPackagePath);\n    if (!NewPackage)\n        return false;\n\n    \u002F\u002F ---------- 3. 重命名 UObject 到新 Package ----------\n    Texture->Rename(\n        *AssetName,\n        NewPackage,\n        REN_DontCreateRedirectors | REN_NonTransactional);\n\n    \u002F\u002F ---------- 4. 标记 & 注册 Asset ----------\n    Texture->MarkPackageDirty();\n    Texture->PostEditChange();\n\n    FAssetRegistryModule::AssetRenamed(Texture, OldTexturePath);\n    FAssetRegistryModule::AssetCreated(Texture);\n\n    \u002F\u002F ---------- 5. 保存 ----------\n    FString Filename =\n        FPackageName::LongPackageNameToFilename(\n            NewPackagePath,\n            FPackageName::GetAssetPackageExtension());\n\n    UE_LOG(LogTemp, Log, TEXT(\"FileName=%s\"), *Filename);\n\n    FSavePackageArgs TsArgs;\n    TsArgs.TopLevelFlags = EObjectFlags::RF_Public | EObjectFlags::RF_Standalone;\n    bool bSaveSuccess = UPackage::SavePackage(\n        NewPackage,\n        Texture,\n        *Filename,\n        TsArgs\n    );\n\n    return bSaveSuccess;\n}\n","c",[71,201,202,224,228,242,247,268,280,285,291,313,328,341,346,352,366,371,377,404,409,434,439,444,453,467,472,478,500,512,521,526,532,544,553,559,571,576,582,592,602,607,616,624,629,635,643,651,657,666,671,702,707,713,729,745,750,756,764,770,776,781,790],{"__ignoreMap":69},[74,203,204,208,211,214,217,221],{"class":76,"line":77},[74,205,207],{"class":206},"sGZGq","bool",[74,209,210],{"class":129}," FixInvalidTexture",[74,212,213],{"class":87},"(UTexture2D",[74,215,216],{"class":91},"*",[74,218,220],{"class":219},"sbfHu"," Texture",[74,222,223],{"class":87},")\n",[74,225,226],{"class":76,"line":84},[74,227,116],{"class":87},[74,229,230,233,236,239],{"class":76,"line":104},[74,231,232],{"class":91},"    if",[74,234,235],{"class":87}," (",[74,237,238],{"class":91},"!",[74,240,241],{"class":87},"Texture)\n",[74,243,244],{"class":76,"line":113},[74,245,246],{"class":87},"    {\n",[74,248,249,252,255,258,261,265],{"class":76,"line":119},[74,250,251],{"class":129},"        UE_LOG",[74,253,254],{"class":87},"(LogTemp, Warning, ",[74,256,257],{"class":129},"TEXT",[74,259,260],{"class":87},"(",[74,262,264],{"class":263},"sZnmU","\"FixInvalidTexture: Bad texture\"",[74,266,267],{"class":87},"));\n",[74,269,270,273,277],{"class":76,"line":136},[74,271,272],{"class":91},"        return",[74,274,276],{"class":275},"stP0Q"," false",[74,278,279],{"class":87},";\n",[74,281,282],{"class":76,"line":142},[74,283,284],{"class":87},"    }\n",[74,286,287],{"class":76,"line":148},[74,288,290],{"emptyLinePlaceholder":289},true,"\n",[74,292,293,296,298,301,304,307,310],{"class":76,"line":156},[74,294,295],{"class":87},"    UPackage",[74,297,216],{"class":91},[74,299,300],{"class":87}," OldPackage ",[74,302,303],{"class":91},"=",[74,305,306],{"class":87}," Texture->",[74,308,309],{"class":129},"GetOutermost",[74,311,312],{"class":87},"();\n",[74,314,315,318,320,323,326],{"class":76,"line":161},[74,316,317],{"class":87},"    FString OldPackageName ",[74,319,303],{"class":91},[74,321,322],{"class":87}," OldPackage->",[74,324,325],{"class":129},"GetName",[74,327,312],{"class":87},[74,329,330,333,335,338],{"class":76,"line":173},[74,331,332],{"class":87},"    FString OldTexturePath ",[74,334,303],{"class":91},[74,336,337],{"class":129}," GetPathNameSafe",[74,339,340],{"class":87},"(Texture);\n",[74,342,344],{"class":76,"line":343},12,[74,345,290],{"emptyLinePlaceholder":289},[74,347,349],{"class":76,"line":348},13,[74,350,351],{"class":80},"    \u002F\u002F ---------- 1. 生成合法新路径 ----------\n",[74,353,355,358,360,363],{"class":76,"line":354},14,[74,356,357],{"class":87},"    FString AssetName ",[74,359,303],{"class":91},[74,361,362],{"class":129}," FPackageName::GetShortName",[74,364,365],{"class":87},"(OldPackageName);\n",[74,367,369],{"class":76,"line":368},15,[74,370,290],{"emptyLinePlaceholder":289},[74,372,374],{"class":76,"line":373},16,[74,375,376],{"class":80},"    \u002F\u002F 以数字或 _ 开头 → 修复\n",[74,378,380,382,384,386,389,391,395,398,401],{"class":76,"line":379},17,[74,381,232],{"class":91},[74,383,235],{"class":87},[74,385,238],{"class":91},[74,387,388],{"class":129},"FChar::IsAlpha",[74,390,260],{"class":87},[74,392,394],{"class":393},"sQA8F","AssetName",[74,396,397],{"class":87},"[",[74,399,400],{"class":275},"0",[74,402,403],{"class":87},"]))\n",[74,405,407],{"class":76,"line":406},18,[74,408,246],{"class":87},[74,410,412,415,417,420,422,425,428,431],{"class":76,"line":411},19,[74,413,414],{"class":87},"        AssetName ",[74,416,303],{"class":91},[74,418,419],{"class":129}," TEXT",[74,421,260],{"class":87},[74,423,424],{"class":263},"\"T\"",[74,426,427],{"class":87},") ",[74,429,430],{"class":91},"+",[74,432,433],{"class":87}," AssetName;\n",[74,435,437],{"class":76,"line":436},20,[74,438,284],{"class":87},[74,440,442],{"class":76,"line":441},21,[74,443,290],{"emptyLinePlaceholder":289},[74,445,447,450],{"class":76,"line":446},22,[74,448,449],{"class":87},"    FString NewPackagePath ",[74,451,452],{"class":91},"=\n",[74,454,456,459,462,465],{"class":76,"line":455},23,[74,457,458],{"class":129},"        FPackageName::GetLongPackagePath",[74,460,461],{"class":87},"(OldPackageName) ",[74,463,464],{"class":91},"\u002F",[74,466,433],{"class":87},[74,468,470],{"class":76,"line":469},24,[74,471,290],{"emptyLinePlaceholder":289},[74,473,475],{"class":76,"line":474},25,[74,476,477],{"class":80},"    \u002F\u002F ---------- 2. 创建新 Package ----------\n",[74,479,481,483,485,488,490,493,495,497],{"class":76,"line":480},26,[74,482,295],{"class":87},[74,484,216],{"class":91},[74,486,487],{"class":87}," NewPackage ",[74,489,303],{"class":91},[74,491,492],{"class":129}," CreatePackage",[74,494,260],{"class":87},[74,496,216],{"class":91},[74,498,499],{"class":87},"NewPackagePath);\n",[74,501,503,505,507,509],{"class":76,"line":502},27,[74,504,232],{"class":91},[74,506,235],{"class":87},[74,508,238],{"class":91},[74,510,511],{"class":87},"NewPackage)\n",[74,513,515,517,519],{"class":76,"line":514},28,[74,516,272],{"class":91},[74,518,276],{"class":275},[74,520,279],{"class":87},[74,522,524],{"class":76,"line":523},29,[74,525,290],{"emptyLinePlaceholder":289},[74,527,529],{"class":76,"line":528},30,[74,530,531],{"class":80},"    \u002F\u002F ---------- 3. 重命名 UObject 到新 Package ----------\n",[74,533,535,538,541],{"class":76,"line":534},31,[74,536,537],{"class":87},"    Texture->",[74,539,540],{"class":129},"Rename",[74,542,543],{"class":87},"(\n",[74,545,547,550],{"class":76,"line":546},32,[74,548,549],{"class":91},"        *",[74,551,552],{"class":87},"AssetName,\n",[74,554,556],{"class":76,"line":555},33,[74,557,558],{"class":87},"        NewPackage,\n",[74,560,562,565,568],{"class":76,"line":561},34,[74,563,564],{"class":87},"        REN_DontCreateRedirectors ",[74,566,567],{"class":91},"|",[74,569,570],{"class":87}," REN_NonTransactional);\n",[74,572,574],{"class":76,"line":573},35,[74,575,290],{"emptyLinePlaceholder":289},[74,577,579],{"class":76,"line":578},36,[74,580,581],{"class":80},"    \u002F\u002F ---------- 4. 标记 & 注册 Asset ----------\n",[74,583,585,587,590],{"class":76,"line":584},37,[74,586,537],{"class":87},[74,588,589],{"class":129},"MarkPackageDirty",[74,591,312],{"class":87},[74,593,595,597,600],{"class":76,"line":594},38,[74,596,537],{"class":87},[74,598,599],{"class":129},"PostEditChange",[74,601,312],{"class":87},[74,603,605],{"class":76,"line":604},39,[74,606,290],{"emptyLinePlaceholder":289},[74,608,610,613],{"class":76,"line":609},40,[74,611,612],{"class":129},"    FAssetRegistryModule::AssetRenamed",[74,614,615],{"class":87},"(Texture, OldTexturePath);\n",[74,617,619,622],{"class":76,"line":618},41,[74,620,621],{"class":129},"    FAssetRegistryModule::AssetCreated",[74,623,340],{"class":87},[74,625,627],{"class":76,"line":626},42,[74,628,290],{"emptyLinePlaceholder":289},[74,630,632],{"class":76,"line":631},43,[74,633,634],{"class":80},"    \u002F\u002F ---------- 5. 保存 ----------\n",[74,636,638,641],{"class":76,"line":637},44,[74,639,640],{"class":87},"    FString Filename ",[74,642,452],{"class":91},[74,644,646,649],{"class":76,"line":645},45,[74,647,648],{"class":129},"        FPackageName::LongPackageNameToFilename",[74,650,543],{"class":87},[74,652,654],{"class":76,"line":653},46,[74,655,656],{"class":87},"            NewPackagePath,\n",[74,658,660,663],{"class":76,"line":659},47,[74,661,662],{"class":129},"            FPackageName::GetAssetPackageExtension",[74,664,665],{"class":87},"());\n",[74,667,669],{"class":76,"line":668},48,[74,670,290],{"emptyLinePlaceholder":289},[74,672,674,677,680,682,684,687,691,694,697,699],{"class":76,"line":673},49,[74,675,676],{"class":129},"    UE_LOG",[74,678,679],{"class":87},"(LogTemp, Log, ",[74,681,257],{"class":129},[74,683,260],{"class":87},[74,685,686],{"class":263},"\"FileName=",[74,688,690],{"class":689},"sAO_F","%s",[74,692,693],{"class":263},"\"",[74,695,696],{"class":87},"), ",[74,698,216],{"class":91},[74,700,701],{"class":87},"Filename);\n",[74,703,705],{"class":76,"line":704},50,[74,706,290],{"emptyLinePlaceholder":289},[74,708,710],{"class":76,"line":709},51,[74,711,712],{"class":87},"    FSavePackageArgs TsArgs;\n",[74,714,716,719,721,724,726],{"class":76,"line":715},52,[74,717,718],{"class":87},"    TsArgs.TopLevelFlags ",[74,720,303],{"class":91},[74,722,723],{"class":87}," EObjectFlags::RF_Public ",[74,725,567],{"class":91},[74,727,728],{"class":87}," EObjectFlags::RF_Standalone;\n",[74,730,732,735,738,740,743],{"class":76,"line":731},53,[74,733,734],{"class":206},"    bool",[74,736,737],{"class":87}," bSaveSuccess ",[74,739,303],{"class":91},[74,741,742],{"class":129}," UPackage::SavePackage",[74,744,543],{"class":87},[74,746,748],{"class":76,"line":747},54,[74,749,558],{"class":87},[74,751,753],{"class":76,"line":752},55,[74,754,755],{"class":87},"        Texture,\n",[74,757,759,761],{"class":76,"line":758},56,[74,760,549],{"class":91},[74,762,763],{"class":87},"Filename,\n",[74,765,767],{"class":76,"line":766},57,[74,768,769],{"class":87},"        TsArgs\n",[74,771,773],{"class":76,"line":772},58,[74,774,775],{"class":87},"    );\n",[74,777,779],{"class":76,"line":778},59,[74,780,290],{"emptyLinePlaceholder":289},[74,782,784,787],{"class":76,"line":783},60,[74,785,786],{"class":91},"    return",[74,788,789],{"class":87}," bSaveSuccess;\n",[74,791,793],{"class":76,"line":792},61,[74,794,139],{"class":87},[11,796,797,798,801,802,805],{},"这里传入的是贴图，执行成功时会自动将",[71,799,800],{},"_","开头的贴图名称添加",[71,803,804],{},"T","前缀进行保存。",[46,807,808],{},[11,809,810,811,814],{},"如果要修复的贴图不是这个规则的，可以在",[71,812,813],{},"以数字或 _ 开头 → 修复","处修改名称逻辑",[11,816,817],{},"结合上面的寻找未保存资产的接口使用即可：",[64,819,821],{"className":66,"code":820,"language":68,"meta":69,"style":69},"TArray\u003CUPackage*> PackagesToSave;\n\u002F\u002FFEditorFileUtils::GetDirtyWorldPackages(PackagesToSave);\nFEditorFileUtils::GetDirtyContentPackages(PackagesToSave);\nUEditorLoadingAndSavingUtils::SavePackages(PackagesToSave, false);\n\n\u002F\u002F 理论上这里其实不需要两层遍历，不过为了日志清晰，还是按照Package为单位来处理\nfor (UPackage* IterPkg : PackagesToSave)\n{\n    if (!IterPkg)\n    {\n        continue;\n    }\n\n    UE_LOG(LogTemp, Log, TEXT(\"UCommonAssetEditFuncLib::SaveBadTextures: Inspecting Package=(%p)%s\"), IterPkg, *GetFullNameSafe(IterPkg));\n    \u002F\u002F 获取包内主资源（贴图）\n    TArray\u003CUObject*> PkgObjects;\n    TArray\u003CUPackage*> PackagesTmp = { IterPkg };\n    UPackageTools::GetObjectsInPackages(&PackagesTmp, PkgObjects);\n    for (UObject* IterObj : PkgObjects)\n    {\n        \u002F\u002F 仅处理贴图\n        UTexture2D* Texture = Cast\u003CUTexture2D>(IterObj);\n        if (!Texture)\n        {\n            UE_LOG(LogTemp, Log, TEXT(\"UCommonAssetEditFuncLib::SaveBadTextures: Object no texture=(%p)%s\"), IterObj, *GetFullNameSafe(IterObj));\n            continue;\n        }\n        UE_LOG(LogTemp, Log, TEXT(\"UCommonAssetEditFuncLib::SaveBadTextures: Object=(%p)%s\"), IterObj, *GetFullNameSafe(IterObj));\n        FixInvalidTexture(Texture);\n    }\n}\n",[71,822,823,835,840,852,871,875,880,894,898,909,913,920,924,928,962,967,982,1000,1018,1032,1036,1041,1064,1075,1080,1112,1119,1124,1153,1160,1164],{"__ignoreMap":69},[74,824,825,827,829,831,833],{"class":76,"line":77},[74,826,88],{"class":87},[74,828,92],{"class":91},[74,830,95],{"class":87},[74,832,98],{"class":91},[74,834,101],{"class":87},[74,836,837],{"class":76,"line":84},[74,838,839],{"class":80},"\u002F\u002FFEditorFileUtils::GetDirtyWorldPackages(PackagesToSave);\n",[74,841,842,845,847,849],{"class":76,"line":104},[74,843,844],{"class":122},"FEditorFileUtils",[74,846,126],{"class":87},[74,848,168],{"class":129},[74,850,851],{"class":87},"(PackagesToSave);\n",[74,853,854,857,859,862,865,868],{"class":76,"line":113},[74,855,856],{"class":122},"UEditorLoadingAndSavingUtils",[74,858,126],{"class":87},[74,860,861],{"class":129},"SavePackages",[74,863,864],{"class":87},"(PackagesToSave, ",[74,866,867],{"class":275},"false",[74,869,870],{"class":87},");\n",[74,872,873],{"class":76,"line":119},[74,874,290],{"emptyLinePlaceholder":289},[74,876,877],{"class":76,"line":136},[74,878,879],{"class":80},"\u002F\u002F 理论上这里其实不需要两层遍历，不过为了日志清晰，还是按照Package为单位来处理\n",[74,881,882,885,887,889,891],{"class":76,"line":142},[74,883,884],{"class":91},"for",[74,886,235],{"class":87},[74,888,95],{"class":122},[74,890,216],{"class":91},[74,892,893],{"class":87}," IterPkg : PackagesToSave)\n",[74,895,896],{"class":76,"line":148},[74,897,116],{"class":87},[74,899,900,902,904,906],{"class":76,"line":156},[74,901,232],{"class":91},[74,903,235],{"class":87},[74,905,238],{"class":91},[74,907,908],{"class":87},"IterPkg)\n",[74,910,911],{"class":76,"line":161},[74,912,246],{"class":87},[74,914,915,918],{"class":76,"line":173},[74,916,917],{"class":91},"        continue",[74,919,279],{"class":87},[74,921,922],{"class":76,"line":343},[74,923,284],{"class":87},[74,925,926],{"class":76,"line":348},[74,927,290],{"emptyLinePlaceholder":289},[74,929,930,932,934,936,938,941,944,947,949,951,954,956,959],{"class":76,"line":354},[74,931,676],{"class":129},[74,933,679],{"class":87},[74,935,257],{"class":129},[74,937,260],{"class":87},[74,939,940],{"class":263},"\"UCommonAssetEditFuncLib::SaveBadTextures: Inspecting Package=(",[74,942,943],{"class":689},"%p",[74,945,946],{"class":263},")",[74,948,690],{"class":689},[74,950,693],{"class":263},[74,952,953],{"class":87},"), IterPkg, ",[74,955,216],{"class":91},[74,957,958],{"class":129},"GetFullNameSafe",[74,960,961],{"class":87},"(IterPkg));\n",[74,963,964],{"class":76,"line":368},[74,965,966],{"class":80},"    \u002F\u002F 获取包内主资源（贴图）\n",[74,968,969,972,974,977,979],{"class":76,"line":373},[74,970,971],{"class":122},"    TArray",[74,973,92],{"class":87},[74,975,976],{"class":122},"UObject",[74,978,216],{"class":91},[74,980,981],{"class":87},"> PkgObjects;\n",[74,983,984,986,988,990,992,995,997],{"class":76,"line":379},[74,985,971],{"class":122},[74,987,92],{"class":87},[74,989,95],{"class":122},[74,991,216],{"class":91},[74,993,994],{"class":87},"> PackagesTmp ",[74,996,303],{"class":91},[74,998,999],{"class":87}," { IterPkg };\n",[74,1001,1002,1005,1007,1010,1012,1015],{"class":76,"line":406},[74,1003,1004],{"class":122},"    UPackageTools",[74,1006,126],{"class":87},[74,1008,1009],{"class":129},"GetObjectsInPackages",[74,1011,260],{"class":87},[74,1013,1014],{"class":91},"&",[74,1016,1017],{"class":87},"PackagesTmp, PkgObjects);\n",[74,1019,1020,1023,1025,1027,1029],{"class":76,"line":411},[74,1021,1022],{"class":91},"    for",[74,1024,235],{"class":87},[74,1026,976],{"class":122},[74,1028,216],{"class":91},[74,1030,1031],{"class":87}," IterObj : PkgObjects)\n",[74,1033,1034],{"class":76,"line":436},[74,1035,246],{"class":87},[74,1037,1038],{"class":76,"line":441},[74,1039,1040],{"class":80},"        \u002F\u002F 仅处理贴图\n",[74,1042,1043,1046,1048,1051,1053,1056,1058,1061],{"class":76,"line":446},[74,1044,1045],{"class":122},"        UTexture2D",[74,1047,216],{"class":91},[74,1049,1050],{"class":87}," Texture ",[74,1052,303],{"class":91},[74,1054,1055],{"class":129}," Cast",[74,1057,92],{"class":87},[74,1059,1060],{"class":122},"UTexture2D",[74,1062,1063],{"class":87},">(IterObj);\n",[74,1065,1066,1069,1071,1073],{"class":76,"line":455},[74,1067,1068],{"class":91},"        if",[74,1070,235],{"class":87},[74,1072,238],{"class":91},[74,1074,241],{"class":87},[74,1076,1077],{"class":76,"line":469},[74,1078,1079],{"class":87},"        {\n",[74,1081,1082,1085,1087,1089,1091,1094,1096,1098,1100,1102,1105,1107,1109],{"class":76,"line":474},[74,1083,1084],{"class":129},"            UE_LOG",[74,1086,679],{"class":87},[74,1088,257],{"class":129},[74,1090,260],{"class":87},[74,1092,1093],{"class":263},"\"UCommonAssetEditFuncLib::SaveBadTextures: Object no texture=(",[74,1095,943],{"class":689},[74,1097,946],{"class":263},[74,1099,690],{"class":689},[74,1101,693],{"class":263},[74,1103,1104],{"class":87},"), IterObj, ",[74,1106,216],{"class":91},[74,1108,958],{"class":129},[74,1110,1111],{"class":87},"(IterObj));\n",[74,1113,1114,1117],{"class":76,"line":480},[74,1115,1116],{"class":91},"            continue",[74,1118,279],{"class":87},[74,1120,1121],{"class":76,"line":502},[74,1122,1123],{"class":87},"        }\n",[74,1125,1126,1128,1130,1132,1134,1137,1139,1141,1143,1145,1147,1149,1151],{"class":76,"line":514},[74,1127,251],{"class":129},[74,1129,679],{"class":87},[74,1131,257],{"class":129},[74,1133,260],{"class":87},[74,1135,1136],{"class":263},"\"UCommonAssetEditFuncLib::SaveBadTextures: Object=(",[74,1138,943],{"class":689},[74,1140,946],{"class":263},[74,1142,690],{"class":689},[74,1144,693],{"class":263},[74,1146,1104],{"class":87},[74,1148,216],{"class":91},[74,1150,958],{"class":129},[74,1152,1111],{"class":87},[74,1154,1155,1158],{"class":76,"line":523},[74,1156,1157],{"class":129},"        FixInvalidTexture",[74,1159,340],{"class":87},[74,1161,1162],{"class":76,"line":528},[74,1163,284],{"class":87},[74,1165,1166],{"class":76,"line":534},[74,1167,139],{"class":87},[11,1169,1170],{},"这样处理其实还是有问题的，需要在编辑器中选中材质所在文件夹然后点击右键全部重新保存一次。目测是相关的引用没有正确的更新，但是一时半会也找不到自动关联到这些材质或者触发保存的方式，所幸只是手动点击一下鼠标，就不继续投入时间了。",[1172,1173,1174],"style",{},"html pre.shiki code .sZdD5, html code.shiki .sZdD5{--shiki-default:#66707B;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .s0idv, html code.shiki .s0idv{--shiki-default:#0E1116;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sLXdl, html code.shiki .sLXdl{--shiki-default:#A0111F;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sfUV7, html code.shiki .sfUV7{--shiki-default:#702C00;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .scAT4, html code.shiki .scAT4{--shiki-default:#622CBC;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sGZGq, html code.shiki .sGZGq{--shiki-default:#A0111F;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sbfHu, html code.shiki .sbfHu{--shiki-default:#702C00;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .sZnmU, html code.shiki .sZnmU{--shiki-default:#032563;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .stP0Q, html code.shiki .stP0Q{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sQA8F, html code.shiki .sQA8F{--shiki-default:#702C00;--shiki-dark:#FFAB70;--shiki-sepia:#F8F8F2}html pre.shiki code .sAO_F, html code.shiki .sAO_F{--shiki-default:#A0111F;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}",{"title":69,"searchDepth":84,"depth":104,"links":1176},[1177,1178,1179],{"id":41,"depth":84,"text":41},{"id":59,"depth":84,"text":59},{"id":184,"depth":84,"text":184},"2026-02-06","md",{"layout":1183,"excerpt":1184},"post",{"type":8,"value":1185},[1186],[11,1187,13],{},"\u002F2026-02-06-send-to-unreal-texture-fix",{"title":6,"description":13},"_legacy\u002F2026\u002F2026-02-06-send-to-unreal-texture-fix",[1192,1193],"UE5","Blender","OyC8nTZpLwnhpQh5SWX0QCKQZ3XzQItDOM9CDyTs94Q",{"id":1196,"title":1197,"body":1198,"date":1304,"description":1202,"extension":1181,"meta":1305,"navigation":289,"path":1310,"seo":1311,"stem":1312,"tags":1313,"__hash__":1315},"blogs\u002F_legacy\u002F2026\u002F2026-01-29-ue5-gameplay-cue-migrate.md","UE5中GamePlayCue问题排查记录",{"type":8,"value":1199,"toc":1299},[1200,1203,1208,1211,1218,1225,1228,1231,1246,1249,1252,1259,1262,1269,1272,1290,1293,1296],[11,1201,1202],{},"GameplayCue模块在写好后没有动，迁移到新项目却发现无法触发Cue。",[46,1204,1205],{},[11,1206,1207],{},"当前虚幻版本UE5.7。",[39,1209,1210],{"id":1210},"检查配置",[11,1212,1213,1214,1217],{},"对于使用了自定义管理器的情况，首先需要检查配置",[71,1215,1216],{},"GlobalGameplayCueManagerClass","是否指向了自己的管理器(如果有定义的话)。\n同时需要检查自己定义的Cue路径是否已经添加到了配置中。",[11,1219,1220],{},[1221,1222],"img",{"alt":1223,"src":1224},"配置项截图","\u002Fimages\u002F2026\u002Fgame-play-cue-config.png",[39,1226,1227],{"id":1227},"创建资产",[11,1229,1230],{},"GameplayCue的资产并不在资产列表，需要通过创建蓝图的流程创建，可以从以下两种类型中选择",[64,1232,1234],{"className":66,"code":1233,"language":68,"meta":69,"style":69},"AGameplayCueNotify_Actor\nUGameplayCueNotify_Static\n",[71,1235,1236,1241],{"__ignoreMap":69},[74,1237,1238],{"class":76,"line":77},[74,1239,1240],{"class":87},"AGameplayCueNotify_Actor\n",[74,1242,1243],{"class":76,"line":84},[74,1244,1245],{"class":87},"UGameplayCueNotify_Static\n",[11,1247,1248],{},"两个类型之间的差别比较直观，只是好久没有用的时候会下意识的以为要从列表里面创建导致怎么都找不到。",[39,1250,1251],{"id":1251},"打包问题",[11,1253,1254,1255,1258],{},"如果GamePlayCue在打包版本中失效，可以检查下对应的资产是否在",[71,1256,1257],{},"DirectoriesToAlwaysCook","中。",[11,1260,1261],{},"另外，最好不要在GamePlayCue和GamePlayEffect的C++定义中进行Tag操作，目前遇到两个问题，都是移除相关代码后就解决了",[11,1263,1264,1265,1268],{},"第一种，在GamePlayCue的构造函数中直接设置",[71,1266,1267],{},"GameplayCueTag","。",[11,1270,1271],{},"第二种，在GamePlayEffect的PostInitProperties中，调用:",[64,1273,1275],{"className":66,"code":1274,"language":68,"meta":69,"style":69},"FindOrAddComponent\u003CUTargetTagRequirementsGameplayEffectComponent>()\n",[71,1276,1277],{"__ignoreMap":69},[74,1278,1279,1282,1284,1287],{"class":76,"line":77},[74,1280,1281],{"class":129},"FindOrAddComponent",[74,1283,92],{"class":87},[74,1285,1286],{"class":122},"UTargetTagRequirementsGameplayEffectComponent",[74,1288,1289],{"class":87},">()\n",[11,1291,1292],{},"并设置OnGoing标签。",[11,1294,1295],{},"由于手头上是发行版本的UE，不知为何没有Gas相关的调试符号，就不进一步寻找原因了。",[1172,1297,1298],{},"html pre.shiki code .s0idv, html code.shiki .s0idv{--shiki-default:#0E1116;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .scAT4, html code.shiki .scAT4{--shiki-default:#622CBC;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sfUV7, html code.shiki .sfUV7{--shiki-default:#702C00;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}",{"title":69,"searchDepth":84,"depth":104,"links":1300},[1301,1302,1303],{"id":1210,"depth":84,"text":1210},{"id":1227,"depth":84,"text":1227},{"id":1251,"depth":84,"text":1251},"2026-01-29",{"layout":1183,"excerpt":1306},{"type":8,"value":1307},[1308],[11,1309,1202],{},"\u002F2026-01-29-ue5-gameplay-cue-migrate",{"title":1197,"description":1202},"_legacy\u002F2026\u002F2026-01-29-ue5-gameplay-cue-migrate",[1192,1314],"GAS","Df64Tl-ValOYd1eYrv2zRJPx7qbHukOQv4UYAnN7u2Q",{"id":1317,"title":1318,"body":1319,"date":1584,"description":1323,"extension":1181,"meta":1585,"navigation":289,"path":1590,"seo":1591,"stem":1592,"tags":1593,"__hash__":1595},"blogs\u002F_legacy\u002F2024\u002F2024-01-17-sequence-face-trace-in-code.md","如何在代码中控制Sequence设置的FadeTrack",{"type":8,"value":1320,"toc":1582},[1321,1324,1327,1330,1341,1514,1520,1523,1576,1579],[11,1322,1323],{},"有时出于表现需求，会在Sequence中添加FadeTrack用于遮蔽场景且选择KeepState，我们需要保证代码接管逻辑时其状态被清除掉。",[11,1325,1326],{},"当前使用的UE版本为UE5.3.2。",[11,1328,1329],{},"如果只是简单的使用FadeTrack是不会有问题的，但是当动态使用Sequence太多的时候，就很难控制最后一个执行的Sequence不是会保持状态的Fade。因此，干脆在代码中加一个保险。",[11,1331,1332,1333,1336,1337,1340],{},"通过名字判断，首先会找到，FadeTrack本身的定义是在",[71,1334,1335],{},"UMovieSceneFadeTrack","中的。经过一串查找，最后可以找到",[71,1338,1339],{},"FFadeUtil::ApplyFade","。而这其中我们的目标是这个：",[64,1342,1344],{"className":66,"code":1343,"language":68,"meta":69,"style":69},"    \u002F\u002F Set runtime fade\n    UObject* Context = Player.GetPlaybackContext();\n    UWorld* World = Context ? Context->GetWorld() : nullptr;\n    if( World && ( World->WorldType == EWorldType::Game || World->WorldType == EWorldType::PIE ) )\n    {\n        APlayerController* PlayerController = World->GetGameInstance()->GetFirstLocalPlayerController();\n        if( PlayerController != nullptr && IsValid(PlayerController->PlayerCameraManager) )\n        {\n            PlayerController->PlayerCameraManager->SetManualCameraFade( FadeValue, FadeColor, bFadeAudio );\n        }\n    }\n",[71,1345,1346,1351,1371,1405,1440,1444,1470,1491,1495,1506,1510],{"__ignoreMap":69},[74,1347,1348],{"class":76,"line":77},[74,1349,1350],{"class":80},"    \u002F\u002F Set runtime fade\n",[74,1352,1353,1356,1358,1361,1363,1366,1369],{"class":76,"line":84},[74,1354,1355],{"class":87},"    UObject",[74,1357,216],{"class":91},[74,1359,1360],{"class":87}," Context ",[74,1362,303],{"class":91},[74,1364,1365],{"class":87}," Player.",[74,1367,1368],{"class":129},"GetPlaybackContext",[74,1370,312],{"class":87},[74,1372,1373,1376,1378,1381,1383,1385,1388,1391,1394,1397,1400,1403],{"class":76,"line":104},[74,1374,1375],{"class":87},"    UWorld",[74,1377,216],{"class":91},[74,1379,1380],{"class":87}," World ",[74,1382,303],{"class":91},[74,1384,1360],{"class":87},[74,1386,1387],{"class":91},"?",[74,1389,1390],{"class":87}," Context->",[74,1392,1393],{"class":129},"GetWorld",[74,1395,1396],{"class":87},"() ",[74,1398,1399],{"class":91},":",[74,1401,1402],{"class":275}," nullptr",[74,1404,279],{"class":87},[74,1406,1407,1409,1412,1415,1418,1421,1424,1427,1430,1433,1435,1437],{"class":76,"line":113},[74,1408,232],{"class":91},[74,1410,1411],{"class":87},"( World ",[74,1413,1414],{"class":91},"&&",[74,1416,1417],{"class":87}," ( World->WorldType ",[74,1419,1420],{"class":91},"==",[74,1422,1423],{"class":122}," EWorldType",[74,1425,1426],{"class":87},"::Game ",[74,1428,1429],{"class":91},"||",[74,1431,1432],{"class":87}," World->WorldType ",[74,1434,1420],{"class":91},[74,1436,1423],{"class":122},[74,1438,1439],{"class":87},"::PIE ) )\n",[74,1441,1442],{"class":76,"line":119},[74,1443,246],{"class":87},[74,1445,1446,1449,1451,1454,1456,1459,1462,1465,1468],{"class":76,"line":136},[74,1447,1448],{"class":122},"        APlayerController",[74,1450,216],{"class":91},[74,1452,1453],{"class":87}," PlayerController ",[74,1455,303],{"class":91},[74,1457,1458],{"class":87}," World->",[74,1460,1461],{"class":129},"GetGameInstance",[74,1463,1464],{"class":87},"()->",[74,1466,1467],{"class":129},"GetFirstLocalPlayerController",[74,1469,312],{"class":87},[74,1471,1472,1474,1477,1480,1482,1485,1488],{"class":76,"line":142},[74,1473,1068],{"class":91},[74,1475,1476],{"class":87},"( PlayerController ",[74,1478,1479],{"class":91},"!=",[74,1481,1402],{"class":275},[74,1483,1484],{"class":91}," &&",[74,1486,1487],{"class":129}," IsValid",[74,1489,1490],{"class":87},"(PlayerController->PlayerCameraManager) )\n",[74,1492,1493],{"class":76,"line":148},[74,1494,1079],{"class":87},[74,1496,1497,1500,1503],{"class":76,"line":156},[74,1498,1499],{"class":87},"            PlayerController->PlayerCameraManager->",[74,1501,1502],{"class":129},"SetManualCameraFade",[74,1504,1505],{"class":87},"( FadeValue, FadeColor, bFadeAudio );\n",[74,1507,1508],{"class":76,"line":161},[74,1509,1123],{"class":87},[74,1511,1512],{"class":76,"line":173},[74,1513,284],{"class":87},[11,1515,1516,1517,1519],{},"也就是说，实际调用",[71,1518,1502],{},"就可以调整FadeTrack了。",[11,1521,1522],{},"于是，在场景播放的动态Sequence系统结束时，调用下",[64,1524,1526],{"className":66,"code":1525,"language":68,"meta":69,"style":69},"SetManualCameraFade(0.0f, FLinearColor(0.0f, 0.0f, 0.0f, 0.0f), false);\n",[71,1527,1528],{"__ignoreMap":69},[74,1529,1530,1532,1534,1537,1540,1543,1546,1548,1550,1552,1554,1556,1558,1560,1562,1564,1566,1568,1570,1572,1574],{"class":76,"line":77},[74,1531,1502],{"class":129},[74,1533,260],{"class":87},[74,1535,1536],{"class":275},"0.0",[74,1538,1539],{"class":91},"f",[74,1541,1542],{"class":87},", ",[74,1544,1545],{"class":129},"FLinearColor",[74,1547,260],{"class":87},[74,1549,1536],{"class":275},[74,1551,1539],{"class":91},[74,1553,1542],{"class":87},[74,1555,1536],{"class":275},[74,1557,1539],{"class":91},[74,1559,1542],{"class":87},[74,1561,1536],{"class":275},[74,1563,1539],{"class":91},[74,1565,1542],{"class":87},[74,1567,1536],{"class":275},[74,1569,1539],{"class":91},[74,1571,696],{"class":87},[74,1573,867],{"class":275},[74,1575,870],{"class":87},[11,1577,1578],{},"就可以达到预期的效果了。",[1172,1580,1581],{},"html pre.shiki code .sZdD5, html code.shiki .sZdD5{--shiki-default:#66707B;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .s0idv, html code.shiki .s0idv{--shiki-default:#0E1116;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sLXdl, html code.shiki .sLXdl{--shiki-default:#A0111F;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .scAT4, html code.shiki .scAT4{--shiki-default:#622CBC;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .stP0Q, html code.shiki .stP0Q{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sfUV7, html code.shiki .sfUV7{--shiki-default:#702C00;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":69,"searchDepth":84,"depth":104,"links":1583},[],"2024-01-17",{"layout":1183,"excerpt":1586},{"type":8,"value":1587},[1588],[11,1589,1323],{},"\u002F2024-01-17-sequence-face-trace-in-code",{"title":1318,"description":1323},"_legacy\u002F2024\u002F2024-01-17-sequence-face-trace-in-code",[1594],"ue5","39GUEjpcX3QLi8yyuTROXaoPMEd7eawb7vfU_-uyMYs",{"id":1597,"title":1598,"body":1599,"date":1832,"description":1603,"extension":1181,"meta":1833,"navigation":289,"path":1838,"seo":1839,"stem":1840,"tags":1841,"__hash__":1842},"blogs\u002F_legacy\u002F2023\u002F2023-10-19-ue5-ovrlipsync-fix.md","UE5.2中OvrLipSync无法使用的问题",{"type":8,"value":1600,"toc":1829},[1601,1604,1607,1610,1615,1618,1621,1624,1627,1630,1795,1798,1813,1820,1823,1826],[11,1602,1603],{},"OvrLipSync插件之前在UE4中使用还是比较正常的，但是在UE5.2上引入的时候发现生成的数据始终无法驱动动画。",[11,1605,1606],{},"当前使用的UE版本为UE5.2.0。",[11,1608,1609],{},"先直接上结论，输入指令：",[46,1611,1612],{},[11,1613,1614],{},"au.editor.ForceAudioNonStreaming 1",[11,1616,1617],{},"后再转化就可以了。",[39,1619,1620],{"id":1620},"原因排查",[11,1622,1623],{},"这个插件之前用的时候是直接可以用的，所以没有怎么关注过细节。",[11,1625,1626],{},"这次稍微看了下实现，发现其原理还是比较简单的。尤其是针对离线数据使用的情况，其实就是针对语音文件生成了一个Visemes的数组。之后在语音播放时，根据当前播放的时间取到对应需要的MorphTarget值，然后设置到动画上。",[11,1628,1629],{},"由于这个过程在调试的时候不是很好判定，所以直接修改了插件的代码来观察生成的数据：",[64,1631,1633],{"className":66,"code":1632,"language":68,"meta":69,"style":69},"USTRUCT()\nstruct OVRLIPSYNC_API FOVRLipSyncFrame\n{\n    GENERATED_BODY()\n\n    UPROPERTY(EditDefaultsOnly)\n    TArray\u003Cfloat> VisemeScores;\n\n    UPROPERTY(EditDefaultsOnly)\n    float LaughterScore;\n\n    FOVRLipSyncFrame(const TArray\u003Cfloat> &visemes = {}, float laughterScore = 0.0f)\n        : VisemeScores(visemes), LaughterScore(laughterScore)\n    {\n    }\n};\n",[71,1634,1635,1643,1655,1659,1666,1670,1678,1693,1697,1708,1716,1720,1765,1782,1786,1790],{"__ignoreMap":69},[74,1636,1637,1640],{"class":76,"line":77},[74,1638,1639],{"class":129},"USTRUCT",[74,1641,1642],{"class":87},"()\n",[74,1644,1645,1648,1652],{"class":76,"line":84},[74,1646,1647],{"class":206},"struct",[74,1649,1651],{"class":1650},"spBst"," OVRLIPSYNC_API",[74,1653,1654],{"class":122}," FOVRLipSyncFrame\n",[74,1656,1657],{"class":76,"line":104},[74,1658,116],{"class":87},[74,1660,1661,1664],{"class":76,"line":113},[74,1662,1663],{"class":129},"    GENERATED_BODY",[74,1665,1642],{"class":87},[74,1667,1668],{"class":76,"line":119},[74,1669,290],{"emptyLinePlaceholder":289},[74,1671,1672,1675],{"class":76,"line":136},[74,1673,1674],{"class":129},"    UPROPERTY",[74,1676,1677],{"class":87},"(EditDefaultsOnly)\n",[74,1679,1680,1682,1684,1687,1690],{"class":76,"line":142},[74,1681,971],{"class":87},[74,1683,92],{"class":91},[74,1685,1686],{"class":206},"float",[74,1688,1689],{"class":91},">",[74,1691,1692],{"class":87}," VisemeScores;\n",[74,1694,1695],{"class":76,"line":148},[74,1696,290],{"emptyLinePlaceholder":289},[74,1698,1699,1701,1703,1706],{"class":76,"line":156},[74,1700,1674],{"class":129},[74,1702,260],{"class":87},[74,1704,1705],{"class":122},"EditDefaultsOnly",[74,1707,223],{"class":87},[74,1709,1710,1713],{"class":76,"line":161},[74,1711,1712],{"class":206},"    float",[74,1714,1715],{"class":87}," LaughterScore;\n",[74,1717,1718],{"class":76,"line":173},[74,1719,290],{"emptyLinePlaceholder":289},[74,1721,1722,1725,1727,1730,1733,1735,1737,1740,1742,1745,1748,1751,1753,1756,1758,1761,1763],{"class":76,"line":343},[74,1723,1724],{"class":129},"    FOVRLipSyncFrame",[74,1726,260],{"class":87},[74,1728,1729],{"class":91},"const",[74,1731,1732],{"class":122}," TArray",[74,1734,92],{"class":87},[74,1736,1686],{"class":206},[74,1738,1739],{"class":87},"> ",[74,1741,1014],{"class":91},[74,1743,1744],{"class":219},"visemes",[74,1746,1747],{"class":91}," =",[74,1749,1750],{"class":87}," {}, ",[74,1752,1686],{"class":206},[74,1754,1755],{"class":219}," laughterScore",[74,1757,1747],{"class":91},[74,1759,1760],{"class":275}," 0.0",[74,1762,1539],{"class":91},[74,1764,223],{"class":87},[74,1766,1767,1770,1773,1776,1779],{"class":76,"line":348},[74,1768,1769],{"class":87},"        : ",[74,1771,1772],{"class":129},"VisemeScores",[74,1774,1775],{"class":87},"(visemes), ",[74,1777,1778],{"class":129},"LaughterScore",[74,1780,1781],{"class":87},"(laughterScore)\n",[74,1783,1784],{"class":76,"line":354},[74,1785,246],{"class":87},[74,1787,1788],{"class":76,"line":368},[74,1789,284],{"class":87},[74,1791,1792],{"class":76,"line":373},[74,1793,1794],{"class":87},"};\n",[11,1796,1797],{},"这样就可以在资产文件中观察生成的数据了，可以看到生成的数据全部都是0。",[11,1799,1800,1801,1804,1805,1808,1809,1812],{},"于是转到生成逻辑，发现在",[71,1802,1803],{},"DecompressSoundWave","内部调用",[71,1806,1807],{},"InitAudioResource","时，在检查",[71,1810,1811],{},"IsStreaming","的地方没通过，导致实际没有返回插件预期的数据。",[11,1814,1815,1816,1819],{},"虽然要比较正式的修改的话需要进一步的跟进流程来确定怎么调整，但是这部分代码是",[71,1817,1818],{},"OvrLipSync","官方维护的，要动起来也得花时间去看它的结构。发现有一个开关可以在编辑器内关闭这个行为后就没有跟进了。",[11,1821,1822],{},"这样可能只能在编辑器内起作用，但是由于实际使用的时候是直接调用生成的离线数据的。打包后离线数据的使用没有影响。",[11,1824,1825],{},"由于没有使用实时数据动态生成的需求，就没有继续跟进了。",[1172,1827,1828],{},"html pre.shiki code .scAT4, html code.shiki .scAT4{--shiki-default:#622CBC;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s0idv, html code.shiki .s0idv{--shiki-default:#0E1116;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sGZGq, html code.shiki .sGZGq{--shiki-default:#A0111F;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .spBst, html code.shiki .spBst{--shiki-default:#702C00;--shiki-dark:#B392F0;--shiki-sepia:#F8F8F2}html pre.shiki code .sfUV7, html code.shiki .sfUV7{--shiki-default:#702C00;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .sLXdl, html code.shiki .sLXdl{--shiki-default:#A0111F;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sbfHu, html code.shiki .sbfHu{--shiki-default:#702C00;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .stP0Q, html code.shiki .stP0Q{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":69,"searchDepth":84,"depth":104,"links":1830},[1831],{"id":1620,"depth":84,"text":1620},"2023-10-19",{"layout":1183,"excerpt":1834},{"type":8,"value":1835},[1836],[11,1837,1603],{},"\u002F2023-10-19-ue5-ovrlipsync-fix",{"title":1598,"description":1603},"_legacy\u002F2023\u002F2023-10-19-ue5-ovrlipsync-fix",[1594],"uPQYbRzu9JEhV4bvlVrSX2SFbF-KJaj9ohYCNjlTHLc",{"id":1844,"title":1845,"body":1846,"date":2228,"description":1850,"extension":1181,"meta":2229,"navigation":289,"path":2234,"seo":2235,"stem":2236,"tags":2237,"__hash__":2238},"blogs\u002F_legacy\u002F2022\u002F2022-08-15-ue5-enhanced-input.md"," UE5 Enhanced input",{"type":8,"value":1847,"toc":2220},[1848,1851,1854,1857,1871,1882,1885,1888,1891,1894,1905,1911,1914,1918,1921,1939,1942,1945,1949,1956,1959,2138,2144,2148,2151,2162,2165,2175,2180,2183,2190,2193,2198,2201,2206,2211,2214,2217],[11,1849,1850],{},"最近看Lyra的代码，发现有个新的Enhanced Input系统，稍微看了下。",[11,1852,1853],{},"当前使用的UE5版本为5.0.3。",[11,1855,1856],{},"这个系统目前还在实验性阶段，但是看起来官方似乎挺想推的。",[11,1858,1859,1864,1865,1870],{},[18,1860,1863],{"href":1861,"rel":1862},"https:\u002F\u002Fdocs.unrealengine.com\u002F4.27\u002Fen-US\u002FInteractiveExperiences\u002FInput\u002FEnhancedInput\u002F",[22],"官方文档","和社区的",[18,1866,1869],{"href":1867,"rel":1868},"https:\u002F\u002Fdev.epicgames.com\u002Fcommunity\u002Flearning\u002Ftutorials\u002FaqrD\u002Funreal-engine-enhanced-input-binding-with-gameplay-tags-c",[22],"使用教程","都有比较详尽的描述。",[11,1872,1873,1874,1877,1878,1881],{},"虽然看起来这个系统是为",[71,1875,1876],{},"GameAbilitySystem","而设计的，且教程那边也用到了",[71,1879,1880],{},"GamePlayTags","。但是实际上这个系统本身并不强制的使用这两个东西。",[39,1883,1884],{"id":1884},"简单使用",[11,1886,1887],{},"基础的配置当然还是要按照官方的来，需要打开插件，然后将输入系统配置到Enhanced Input。",[11,1889,1890],{},"其实这个系统主要就是将原本只能在项目配置中定义的输入传递给资产化了，方便动态绑定。",[11,1892,1893],{},"原本在UE4的时候我们要实现动态绑定需要自己做一层中继，现在只是官方给出了可以方便进行动态绑定的部分而已。",[11,1895,1896,1897,1900,1901,1904],{},"核心的部分是",[71,1898,1899],{},"UInputAction","与",[71,1902,1903],{},"Input Mapping Contexts","，这两个的使用可以参照上面给出的第二个链接。",[11,1906,1907,1908,1910],{},"只不过",[71,1909,1899],{},"可以直接配置，不需要硬性使用GAS那一套东西。感觉最大的好处是方便项目之间迁移，之前迁移一些逻辑后会发现输入配置对不上。有的时候要到代码和蓝图里面找逻辑中原本绑定的输入到底是什么。输入的配置资产化之后就可以连输入部分一起迁移了。",[11,1912,1913],{},"当然，有一个官方的动态输入绑定方案自然会方便很多。",[1915,1916,1917],"h3",{"id":1917},"输入类型",[11,1919,1920],{},"这里面个人在测试的时候遗漏了一个地方，就是移动方向这些输入需要修改为Axis2D",[1922,1923,1924,1927,1930,1933,1936],"ol",{},[29,1925,1926],{},"IA_Fire - ValueType(bool), Triggers(Pressed), Modifiers(None)",[29,1928,1929],{},"IA_Jump - ValueType(bool), Triggers(Pressed ), Modifiers(None) ",[29,1931,1932],{},"IA_Move - ValueType(Axis2D), Triggers(None ), Modifiers(None ) ",[29,1934,1935],{},"IA_MouseLook - ValueType(Axis2D), Triggers(None), Modifiers(Negate - Y axis) ",[29,1937,1938],{},"IA_StickLook - ValueType(Axis2D ), Triggers(None), Modifiers(None)",[11,1940,1941],{},"如果这里漏掉的话，之后做输入转换的一些2维的操作其实是会失败的。",[11,1943,1944],{},"表现上会变成只能左右移动无法上下移动，由于原文只有这里没有截图，当时跳过去了。",[1915,1946,1948],{"id":1947},"modifier自定义","Modifier自定义",[11,1950,1951,1952,1955],{},"修改器虽然可以自定义，但是其实默认的基本够用了。不过需要的时候可以尝试下，很简单的。直接参考引擎的内部实现，继承下",[71,1953,1954],{},"UInputModifier","就好了。",[11,1957,1958],{},"需要注意的是InputAction的类型是无法修改的，看引擎的这里：",[64,1960,1962],{"className":66,"code":1961,"language":68,"meta":69,"style":69},"FInputActionValue UEnhancedPlayerInput::ApplyModifiers(const TArray\u003CUInputModifier*>& Modifiers, FInputActionValue RawValue, float DeltaTime) const\n{\n    TRACE_CPUPROFILER_EVENT_SCOPE(EnhPIS_Modifiers);\n\n    FInputActionValue ModifiedValue = RawValue;\n    for (UInputModifier* Modifier : Modifiers)\n    {\n        if (Modifier)\n        {\n            \u002F\u002F Enforce that type is kept to RawValue type between modifiers.\n            ModifiedValue = FInputActionValue(RawValue.GetValueType(), Modifier->ModifyRaw(this, ModifiedValue, DeltaTime).Get\u003CFInputActionValue::Axis3D>());\n        }\n    }\n    return ModifiedValue;\n}\n",[71,1963,1964,2015,2019,2027,2031,2044,2057,2061,2068,2072,2077,2119,2123,2127,2134],{"__ignoreMap":69},[74,1965,1966,1969,1972,1974,1977,1979,1981,1983,1985,1987,1989,1991,1993,1996,1998,2000,2003,2005,2007,2010,2012],{"class":76,"line":77},[74,1967,1968],{"class":122},"FInputActionValue",[74,1970,1971],{"class":122}," UEnhancedPlayerInput",[74,1973,126],{"class":87},[74,1975,1976],{"class":129},"ApplyModifiers",[74,1978,260],{"class":87},[74,1980,1729],{"class":91},[74,1982,1732],{"class":122},[74,1984,92],{"class":87},[74,1986,1954],{"class":122},[74,1988,216],{"class":91},[74,1990,1689],{"class":87},[74,1992,1014],{"class":91},[74,1994,1995],{"class":219}," Modifiers",[74,1997,1542],{"class":87},[74,1999,1968],{"class":122},[74,2001,2002],{"class":219}," RawValue",[74,2004,1542],{"class":87},[74,2006,1686],{"class":206},[74,2008,2009],{"class":219}," DeltaTime",[74,2011,427],{"class":87},[74,2013,2014],{"class":91},"const\n",[74,2016,2017],{"class":76,"line":84},[74,2018,116],{"class":87},[74,2020,2021,2024],{"class":76,"line":104},[74,2022,2023],{"class":129},"    TRACE_CPUPROFILER_EVENT_SCOPE",[74,2025,2026],{"class":87},"(EnhPIS_Modifiers);\n",[74,2028,2029],{"class":76,"line":113},[74,2030,290],{"emptyLinePlaceholder":289},[74,2032,2033,2036,2039,2041],{"class":76,"line":119},[74,2034,2035],{"class":122},"    FInputActionValue",[74,2037,2038],{"class":87}," ModifiedValue ",[74,2040,303],{"class":91},[74,2042,2043],{"class":87}," RawValue;\n",[74,2045,2046,2048,2050,2052,2054],{"class":76,"line":136},[74,2047,1022],{"class":91},[74,2049,235],{"class":87},[74,2051,1954],{"class":122},[74,2053,216],{"class":91},[74,2055,2056],{"class":87}," Modifier : Modifiers)\n",[74,2058,2059],{"class":76,"line":142},[74,2060,246],{"class":87},[74,2062,2063,2065],{"class":76,"line":148},[74,2064,1068],{"class":91},[74,2066,2067],{"class":87}," (Modifier)\n",[74,2069,2070],{"class":76,"line":156},[74,2071,1079],{"class":87},[74,2073,2074],{"class":76,"line":161},[74,2075,2076],{"class":80},"            \u002F\u002F Enforce that type is kept to RawValue type between modifiers.\n",[74,2078,2079,2082,2084,2087,2090,2093,2096,2099,2101,2105,2108,2110,2112,2115,2117],{"class":76,"line":173},[74,2080,2081],{"class":87},"            ModifiedValue ",[74,2083,303],{"class":91},[74,2085,2086],{"class":129}," FInputActionValue",[74,2088,2089],{"class":87},"(RawValue.",[74,2091,2092],{"class":129},"GetValueType",[74,2094,2095],{"class":87},"(), Modifier->",[74,2097,2098],{"class":129},"ModifyRaw",[74,2100,260],{"class":87},[74,2102,2104],{"class":2103},"s4Wjf","this",[74,2106,2107],{"class":87},", ModifiedValue, DeltaTime).Get",[74,2109,92],{"class":91},[74,2111,1968],{"class":122},[74,2113,2114],{"class":87},"::Axis3D",[74,2116,1689],{"class":91},[74,2118,665],{"class":87},[74,2120,2121],{"class":76,"line":343},[74,2122,1123],{"class":87},[74,2124,2125],{"class":76,"line":348},[74,2126,284],{"class":87},[74,2128,2129,2131],{"class":76,"line":354},[74,2130,786],{"class":91},[74,2132,2133],{"class":87}," ModifiedValue;\n",[74,2135,2136],{"class":76,"line":368},[74,2137,139],{"class":87},[11,2139,2140,2141,1268],{},"就算在修改器里面改了，在这里也会被设置回到",[71,2142,2143],{},"RawValue.GetValueType()",[39,2145,2147],{"id":2146},"commonui问题","CommonUI问题",[11,2149,2150],{},"CommonUI这边有一个全局的Action绑定，但是配置好之后使用的过程中总是会报错。",[46,2152,2153],{},[11,2154,2155,2156,2158,2159,2161],{},"\"Cannot\nbind widget ",[74,2157,690],{}," to action ",[74,2160,690],{}," - provided tag does not map to an existing UI\ninput action. It can be added under Project Settings->UI Input.",[11,2163,2164],{},"排查了下原因，感觉是实验性阶段的BUG。主要的问题来源是：",[11,2166,2167,2170,2171,2174],{},[71,2168,2169],{},"UCommonUIInputSettings","的加载时机要早于",[71,2172,2173],{},"FGlobalUITags","的标签加载时机",[46,2176,2177],{},[11,2178,2179],{},"UGameplayTagsManager::OnLastChanceToAddNativeTags",[11,2181,2182],{},"导致在配置加载的时候没有读取到Tag，最后绑定的时候就错了。",[11,2184,2185,2186,2189],{},"倒腾了下没发现好的直接修正的方式，只能通过自己定义Tag的方式来绕过。自己定义Tag可以选择直接在项目配置里面加。如果一时之间找不到配置的位置，在项目配置里面搜索",[71,2187,2188],{},"gameplay tags","即可。",[11,2191,2192],{},"或者在代码中快速定义：",[46,2194,2195],{},[11,2196,2197],{},"UE_DEFINE_GAMEPLAY_TAG_STATIC(Tag_CUSTOM_SETTINGS_INPUT_ACTION_Cancel, \"UI.Action.Css.Cancel\");",[11,2199,2200],{},"也可以通过.h与.cpp中分别定义来方便别的类能够取到",[46,2202,2203],{},[11,2204,2205],{},"UE_DECLARE_GAMEPLAY_TAG_EXTERN(Tag_CUSTOM_SETTINGS_INPUT_ACTION_Confrim);",[46,2207,2208],{},[11,2209,2210],{},"UE_DEFINE_GAMEPLAY_TAG(Tag_CUSTOM_SETTINGS_INPUT_ACTION_Confrim, \"UI.Action.Css.Confirm\")",[39,2212,2213],{"id":2213},"总结",[11,2215,2216],{},"总体而言感觉新系统的意义不是很大，如果项目中已有完整的输入管理逻辑的话，没有必要迁移。可能对新项目可以考虑下……",[1172,2218,2219],{},"html pre.shiki code .sfUV7, html code.shiki .sfUV7{--shiki-default:#702C00;--shiki-default-text-decoration:inherit;--shiki-dark:#B392F0;--shiki-dark-text-decoration:inherit;--shiki-sepia:#A6E22E;--shiki-sepia-text-decoration:underline}html pre.shiki code .s0idv, html code.shiki .s0idv{--shiki-default:#0E1116;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .scAT4, html code.shiki .scAT4{--shiki-default:#622CBC;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sLXdl, html code.shiki .sLXdl{--shiki-default:#A0111F;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sbfHu, html code.shiki .sbfHu{--shiki-default:#702C00;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html pre.shiki code .sGZGq, html code.shiki .sGZGq{--shiki-default:#A0111F;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}html pre.shiki code .sZdD5, html code.shiki .sZdD5{--shiki-default:#66707B;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .s4Wjf, html code.shiki .s4Wjf{--shiki-default:#023B95;--shiki-dark:#79B8FF;--shiki-sepia:#FD971F}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}",{"title":69,"searchDepth":84,"depth":104,"links":2221},[2222,2226,2227],{"id":1884,"depth":84,"text":1884,"children":2223},[2224,2225],{"id":1917,"depth":104,"text":1917},{"id":1947,"depth":104,"text":1948},{"id":2146,"depth":84,"text":2147},{"id":2213,"depth":84,"text":2213},"2022-08-15",{"layout":1183,"excerpt":2230},{"type":8,"value":2231},[2232],[11,2233,1850],{},"\u002F2022-08-15-ue5-enhanced-input",{"title":1845,"description":1850},"_legacy\u002F2022\u002F2022-08-15-ue5-enhanced-input",[1192],"14nYQPYf3R6xkEirhewjHWl0UU3aYeXZM60t9GxwqAc",1788763177023]