[{"data":1,"prerenderedAt":1828},["ShallowReactive",2],{"blog-page-1":3,"blog-count":1827},[4,237,1408,1627,1746],{"id":5,"title":6,"body":7,"date":221,"description":13,"extension":222,"meta":223,"navigation":229,"path":230,"seo":231,"stem":232,"tags":233,"__hash__":236},"blogs\u002F_legacy\u002F2026\u002F2026-03-22-wan2.2-dasiwa-comfyui-note.md","ComfyUI中安装DaSiWa Wan2.2记录",{"type":8,"value":9,"toc":211},"minimark",[10,14,17,36,39,43,46,53,56,62,67,72,75,78,89,98,102,105,128,131,134,142,145,148,151,168,171,174,183,186,189,195,198,204,207],[11,12,13],"p",{},"Wan2.2 Dasiwa这个之前看到有人说8G显存也能跑，所以试着安装了下。",[11,15,16],{},"使用工具版本：",[18,19,20,24,27,30,33],"ul",{},[21,22,23],"li",{},"ComfyUI 0.12.0",[21,25,26],{},"ComfyUI_frontend v1.37.11",[21,28,29],{},"rgthree-comfy v1.0.2512112053",[21,31,32],{},"EasyUse v1.3.6",[21,34,35],{},"ComfyUI-Manager V3.39.2",[11,37,38],{},"与当前的版本可能有点差距了，因为这篇文章其实是之前在本地的草稿，后面我忘记更新了……",[40,41,42],"h2",{"id":42},"使用效果",[11,44,45],{},"8G内存确实能跑GGUF的版本，但是效果差强人意，如果已经习惯了商用模型的话可能无法适应。其实HuggingFace上能够查到GGUF模型的兼容性",[11,47,48],{},[49,50],"img",{"alt":51,"src":52},"Wan2.2在4060Ti8G上的可用性","\u002Fimages\u002F2026\u002Fwan2.2-gguf-40608g-comp.png",[11,54,55],{},"使用Q2模型的时间消耗",[57,58,59],"blockquote",{},[11,60,61],{},"I2V, 5s, 768x768\nPrompt executed in 479.62 seconds",[57,63,64],{},[11,65,66],{},"I2V, 5s, 432x576\nPrompt executed in 152.66 seconds",[57,68,69],{},[11,70,71],{},"FLF2V, 1s, 672x384\nPrompt executed in 32.20 seconds",[11,73,74],{},"很慢了，而且由于是Q2的模型，其实质量也不是很好。",[40,76,77],{"id":77},"安装过程",[11,79,80,81,88],{},"其实官方有使用说明的，可能一下子找不到，基本按照",[82,83,87],"a",{"href":84,"rel":85},"https:\u002F\u002Fcivitai.com\u002Farticles\u002F26508",[86],"nofollow","官方说明","安装就可以了。",[11,90,91,92,97],{},"官方还提供了",[82,93,96],{"href":94,"rel":95},"https:\u002F\u002Fcivitai.com\u002Farticles\u002F20293\u002Fdarksidewalkers-wan-22-14b-i2v-usage-guide-definitive-edition",[86],"概念解释","。",[99,100,101],"h3",{"id":101},"模型下载",[11,103,104],{},"如果显存不高可以用GGUF版本，",[18,106,107,114,121],{},[21,108,109],{},[82,110,113],{"href":111,"rel":112},"https:\u002F\u002Fcivitai.com\u002Fmodels\u002F1981116?modelVersionId=2555652",[86],"Safetensor版本",[21,115,116],{},[82,117,120],{"href":118,"rel":119},"https:\u002F\u002Fcivitai.com\u002Fmodels\u002F2269796\u002Fdasiwa-wan-22-i2v-14b-synthseduction-v9-or-lightspeed-or-gguf",[86],"GGUF版本-civitai",[21,122,123],{},[82,124,127],{"href":125,"rel":126},"https:\u002F\u002Fhuggingface.co\u002FBedovyy\u002FdasiwaWAN22I2V14B-GGUF",[86],"GGUF版本-huggingface",[11,129,130],{},"Huggingface上的版本不确定是不是作者本人发的，看说明应该版本没有civitai新，有条件的话还是用civitai比较好。",[99,132,133],{"id":133},"快速安装",[11,135,136,137,97],{},"节点相关最快的是，使用官方提供的",[82,138,141],{"href":139,"rel":140},"https:\u002F\u002Fcivitai.com\u002Fmodels\u002F1823089?modelVersionId=2712329",[86],"WorkFlow",[11,143,144],{},"然后ComfyUI在有安装管理器的情况下，会提示缺失的节点并安装。",[11,146,147],{},"以下是遇到的问题",[11,149,150],{},"问题一：No module named 'sageattention'",[152,153,158],"pre",{"className":154,"code":155,"language":156,"meta":157,"style":157},"language-shell shiki shiki-themes github-light-high-contrast github-dark monokai","python -m pip install -U sageattention\n","shell","",[159,160,161],"code",{"__ignoreMap":157},[162,163,166],"span",{"class":164,"line":165},"line",1,[162,167,155],{},[11,169,170],{},"问题二：No module named 'triton'",[11,172,173],{},"似乎triton对windows的兼容性有问题，如果安装失败，可以用社区的windows版本",[152,175,177],{"className":154,"code":176,"language":156,"meta":157,"style":157},"python -m pip install triton-windows\n",[159,178,179],{"__ignoreMap":157},[162,180,181],{"class":164,"line":165},[162,182,176],{},[99,184,185],{"id":185},"使用",[11,187,188],{},"GGUF模型需要将左上角的配置改为使用GGUF",[11,190,191],{},[49,192],{"alt":193,"src":194},"开启GGUF开关","\u002Fimages\u002F2026\u002Fwan2.2-dasiwa-workflow-gguf.png",[11,196,197],{},"以及针对GGUF模型进行配置",[11,199,200],{},[49,201],{"alt":202,"src":203},"配置GGUF模型","\u002Fimages\u002F2026\u002Fwan2.2-gguf-config.png",[11,205,206],{},"测试的时候可以把时间长度和分辨率先降下来，不然可能会卡半天。",[208,209,210],"style",{},"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":157,"searchDepth":212,"depth":213,"links":214},2,3,[215,216],{"id":42,"depth":212,"text":42},{"id":77,"depth":212,"text":77,"children":217},[218,219,220],{"id":101,"depth":213,"text":101},{"id":133,"depth":213,"text":133},{"id":185,"depth":213,"text":185},"2026-03-22","md",{"layout":224,"excerpt":225},"post",{"type":8,"value":226},[227],[11,228,13],{},true,"\u002F2026-03-22-wan2.2-dasiwa-comfyui-note",{"title":6,"description":13},"_legacy\u002F2026\u002F2026-03-22-wan2.2-dasiwa-comfyui-note",[234,235],"ComfyUI","Wan2.2","ji2rvwwNsiBu0XwUih7V2AiaB-W-pZBvRJaZmeDvG9c",{"id":238,"title":239,"body":240,"date":1395,"description":244,"extension":222,"meta":1396,"navigation":229,"path":1401,"seo":1402,"stem":1403,"tags":1404,"__hash__":1407},"blogs\u002F_legacy\u002F2026\u002F2026-02-06-send-to-unreal-texture-fix.md","Send to unreal贴图丢失问题",{"type":8,"value":241,"toc":1390},[242,245,254,265,268,271,276,279,282,285,288,393,399,402,409,412,1011,1022,1031,1034,1384,1387],[11,243,244],{},"在使用Send to Unreal的过程中，发现对于部分模型，会出现贴图导入错误的问题。",[11,246,247,248,253],{},"目前使用的其实是第三方维护的",[82,249,252],{"href":250,"rel":251},"https:\u002F\u002Fgithub.com\u002Fpoly-hammer\u002FBlenderTools",[86],"Send to Unreal","，因为官方的已经很久没有更新了。使用的工具的版本信息：",[18,255,256,259,262],{},[21,257,258],{},"UE5.7",[21,260,261],{},"Send to Unreal 2.6.7",[21,263,264],{},"Blender4.2",[40,266,267],{"id":267},"贴图丢失",[11,269,270],{},"在进行模型导入后，部分贴图会进入一种错误的状态，当保存时会报错并提示：",[57,272,273],{},[11,274,275],{},"Filename '_11' resolves to 'None' and cannot be used",[11,277,278],{},"且在编辑器中无法看到贴图资产。材质和Mesh表现正常，但是重启后由于这些贴图没有保存，就会变成没有贴图的状态。",[11,280,281],{},"这个问题可以手动解决，只要在材质中打开使用的贴图，然后另存为一下就可以了。但是由于有的模型材质比较多，手动处理会非常麻烦，介于手动处理的步骤只是在使用编辑器功能，所以肯定是能自动处理的。",[40,283,284],{"id":284},"查找未保存的资产",[11,286,287],{},"引擎是有提供接口的，毕竟当点击关闭的时候编辑器会提示需要保存的资产，用这个窗口的文本直接搜索就能找到对应的代码了。",[152,289,293],{"className":290,"code":291,"language":292,"meta":157,"style":157},"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",[159,294,295,301,320,328,334,351,357,363,371,376,388],{"__ignoreMap":157},[162,296,297],{"class":164,"line":165},[162,298,300],{"class":299},"sZdD5","\u002F\u002F A list of all packages that need to be saved\n",[162,302,303,307,311,314,317],{"class":164,"line":212},[162,304,306],{"class":305},"s0idv","TArray",[162,308,310],{"class":309},"sLXdl","\u003C",[162,312,313],{"class":305},"UPackage",[162,315,316],{"class":309},"*>",[162,318,319],{"class":305}," PackagesToSave;\n",[162,321,322,325],{"class":164,"line":213},[162,323,324],{"class":309},"if",[162,326,327],{"class":305}," (bSaveMapPackages)\n",[162,329,331],{"class":164,"line":330},4,[162,332,333],{"class":305},"{\n",[162,335,337,341,344,348],{"class":164,"line":336},5,[162,338,340],{"class":339},"sfUV7","    FEditorFileUtils",[162,342,343],{"class":305},"::",[162,345,347],{"class":346},"scAT4","GetDirtyWorldPackages",[162,349,350],{"class":305},"(PackagesToSave, ShouldIgnorePackageFunction);\n",[162,352,354],{"class":164,"line":353},6,[162,355,356],{"class":305},"}\n",[162,358,360],{"class":164,"line":359},7,[162,361,362],{"class":299},"\u002F\u002F Don't iterate through content packages if we don't plan on saving them\n",[162,364,366,368],{"class":164,"line":365},8,[162,367,324],{"class":309},[162,369,370],{"class":305}," (bSaveContentPackages)\n",[162,372,374],{"class":164,"line":373},9,[162,375,333],{"class":305},[162,377,379,381,383,386],{"class":164,"line":378},10,[162,380,340],{"class":339},[162,382,343],{"class":305},[162,384,385],{"class":346},"GetDirtyContentPackages",[162,387,350],{"class":305},[162,389,391],{"class":164,"line":390},11,[162,392,356],{"class":305},[11,394,395,396,398],{},"由于只关注贴图保存问题，所以使用",[159,397,385],{},"就可以了。",[40,400,401],{"id":401},"资产重新保存",[11,403,404,405,408],{},"一开始是想用",[159,406,407],{},"UEditorAssetLibrary::RenameLoadedAsset","来解决的，但是发现无论怎么修改调用方式都会出现错误。",[11,410,411],{},"与ChatGpt沟通了半天，终于找到了解决方案：",[152,413,417],{"className":414,"code":415,"language":416,"meta":157,"style":157},"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",[159,418,419,441,445,459,464,485,497,502,507,529,544,557,562,568,582,587,593,620,625,650,655,660,669,683,688,694,716,728,737,742,748,760,769,775,787,792,798,808,818,823,832,840,845,851,859,867,873,882,887,918,923,929,945,961,966,972,980,986,992,997,1006],{"__ignoreMap":157},[162,420,421,425,428,431,434,438],{"class":164,"line":165},[162,422,424],{"class":423},"sGZGq","bool",[162,426,427],{"class":346}," FixInvalidTexture",[162,429,430],{"class":305},"(UTexture2D",[162,432,433],{"class":309},"*",[162,435,437],{"class":436},"sbfHu"," Texture",[162,439,440],{"class":305},")\n",[162,442,443],{"class":164,"line":212},[162,444,333],{"class":305},[162,446,447,450,453,456],{"class":164,"line":213},[162,448,449],{"class":309},"    if",[162,451,452],{"class":305}," (",[162,454,455],{"class":309},"!",[162,457,458],{"class":305},"Texture)\n",[162,460,461],{"class":164,"line":330},[162,462,463],{"class":305},"    {\n",[162,465,466,469,472,475,478,482],{"class":164,"line":336},[162,467,468],{"class":346},"        UE_LOG",[162,470,471],{"class":305},"(LogTemp, Warning, ",[162,473,474],{"class":346},"TEXT",[162,476,477],{"class":305},"(",[162,479,481],{"class":480},"sZnmU","\"FixInvalidTexture: Bad texture\"",[162,483,484],{"class":305},"));\n",[162,486,487,490,494],{"class":164,"line":353},[162,488,489],{"class":309},"        return",[162,491,493],{"class":492},"stP0Q"," false",[162,495,496],{"class":305},";\n",[162,498,499],{"class":164,"line":359},[162,500,501],{"class":305},"    }\n",[162,503,504],{"class":164,"line":365},[162,505,506],{"emptyLinePlaceholder":229},"\n",[162,508,509,512,514,517,520,523,526],{"class":164,"line":373},[162,510,511],{"class":305},"    UPackage",[162,513,433],{"class":309},[162,515,516],{"class":305}," OldPackage ",[162,518,519],{"class":309},"=",[162,521,522],{"class":305}," Texture->",[162,524,525],{"class":346},"GetOutermost",[162,527,528],{"class":305},"();\n",[162,530,531,534,536,539,542],{"class":164,"line":378},[162,532,533],{"class":305},"    FString OldPackageName ",[162,535,519],{"class":309},[162,537,538],{"class":305}," OldPackage->",[162,540,541],{"class":346},"GetName",[162,543,528],{"class":305},[162,545,546,549,551,554],{"class":164,"line":390},[162,547,548],{"class":305},"    FString OldTexturePath ",[162,550,519],{"class":309},[162,552,553],{"class":346}," GetPathNameSafe",[162,555,556],{"class":305},"(Texture);\n",[162,558,560],{"class":164,"line":559},12,[162,561,506],{"emptyLinePlaceholder":229},[162,563,565],{"class":164,"line":564},13,[162,566,567],{"class":299},"    \u002F\u002F ---------- 1. 生成合法新路径 ----------\n",[162,569,571,574,576,579],{"class":164,"line":570},14,[162,572,573],{"class":305},"    FString AssetName ",[162,575,519],{"class":309},[162,577,578],{"class":346}," FPackageName::GetShortName",[162,580,581],{"class":305},"(OldPackageName);\n",[162,583,585],{"class":164,"line":584},15,[162,586,506],{"emptyLinePlaceholder":229},[162,588,590],{"class":164,"line":589},16,[162,591,592],{"class":299},"    \u002F\u002F 以数字或 _ 开头 → 修复\n",[162,594,596,598,600,602,605,607,611,614,617],{"class":164,"line":595},17,[162,597,449],{"class":309},[162,599,452],{"class":305},[162,601,455],{"class":309},[162,603,604],{"class":346},"FChar::IsAlpha",[162,606,477],{"class":305},[162,608,610],{"class":609},"sQA8F","AssetName",[162,612,613],{"class":305},"[",[162,615,616],{"class":492},"0",[162,618,619],{"class":305},"]))\n",[162,621,623],{"class":164,"line":622},18,[162,624,463],{"class":305},[162,626,628,631,633,636,638,641,644,647],{"class":164,"line":627},19,[162,629,630],{"class":305},"        AssetName ",[162,632,519],{"class":309},[162,634,635],{"class":346}," TEXT",[162,637,477],{"class":305},[162,639,640],{"class":480},"\"T\"",[162,642,643],{"class":305},") ",[162,645,646],{"class":309},"+",[162,648,649],{"class":305}," AssetName;\n",[162,651,653],{"class":164,"line":652},20,[162,654,501],{"class":305},[162,656,658],{"class":164,"line":657},21,[162,659,506],{"emptyLinePlaceholder":229},[162,661,663,666],{"class":164,"line":662},22,[162,664,665],{"class":305},"    FString NewPackagePath ",[162,667,668],{"class":309},"=\n",[162,670,672,675,678,681],{"class":164,"line":671},23,[162,673,674],{"class":346},"        FPackageName::GetLongPackagePath",[162,676,677],{"class":305},"(OldPackageName) ",[162,679,680],{"class":309},"\u002F",[162,682,649],{"class":305},[162,684,686],{"class":164,"line":685},24,[162,687,506],{"emptyLinePlaceholder":229},[162,689,691],{"class":164,"line":690},25,[162,692,693],{"class":299},"    \u002F\u002F ---------- 2. 创建新 Package ----------\n",[162,695,697,699,701,704,706,709,711,713],{"class":164,"line":696},26,[162,698,511],{"class":305},[162,700,433],{"class":309},[162,702,703],{"class":305}," NewPackage ",[162,705,519],{"class":309},[162,707,708],{"class":346}," CreatePackage",[162,710,477],{"class":305},[162,712,433],{"class":309},[162,714,715],{"class":305},"NewPackagePath);\n",[162,717,719,721,723,725],{"class":164,"line":718},27,[162,720,449],{"class":309},[162,722,452],{"class":305},[162,724,455],{"class":309},[162,726,727],{"class":305},"NewPackage)\n",[162,729,731,733,735],{"class":164,"line":730},28,[162,732,489],{"class":309},[162,734,493],{"class":492},[162,736,496],{"class":305},[162,738,740],{"class":164,"line":739},29,[162,741,506],{"emptyLinePlaceholder":229},[162,743,745],{"class":164,"line":744},30,[162,746,747],{"class":299},"    \u002F\u002F ---------- 3. 重命名 UObject 到新 Package ----------\n",[162,749,751,754,757],{"class":164,"line":750},31,[162,752,753],{"class":305},"    Texture->",[162,755,756],{"class":346},"Rename",[162,758,759],{"class":305},"(\n",[162,761,763,766],{"class":164,"line":762},32,[162,764,765],{"class":309},"        *",[162,767,768],{"class":305},"AssetName,\n",[162,770,772],{"class":164,"line":771},33,[162,773,774],{"class":305},"        NewPackage,\n",[162,776,778,781,784],{"class":164,"line":777},34,[162,779,780],{"class":305},"        REN_DontCreateRedirectors ",[162,782,783],{"class":309},"|",[162,785,786],{"class":305}," REN_NonTransactional);\n",[162,788,790],{"class":164,"line":789},35,[162,791,506],{"emptyLinePlaceholder":229},[162,793,795],{"class":164,"line":794},36,[162,796,797],{"class":299},"    \u002F\u002F ---------- 4. 标记 & 注册 Asset ----------\n",[162,799,801,803,806],{"class":164,"line":800},37,[162,802,753],{"class":305},[162,804,805],{"class":346},"MarkPackageDirty",[162,807,528],{"class":305},[162,809,811,813,816],{"class":164,"line":810},38,[162,812,753],{"class":305},[162,814,815],{"class":346},"PostEditChange",[162,817,528],{"class":305},[162,819,821],{"class":164,"line":820},39,[162,822,506],{"emptyLinePlaceholder":229},[162,824,826,829],{"class":164,"line":825},40,[162,827,828],{"class":346},"    FAssetRegistryModule::AssetRenamed",[162,830,831],{"class":305},"(Texture, OldTexturePath);\n",[162,833,835,838],{"class":164,"line":834},41,[162,836,837],{"class":346},"    FAssetRegistryModule::AssetCreated",[162,839,556],{"class":305},[162,841,843],{"class":164,"line":842},42,[162,844,506],{"emptyLinePlaceholder":229},[162,846,848],{"class":164,"line":847},43,[162,849,850],{"class":299},"    \u002F\u002F ---------- 5. 保存 ----------\n",[162,852,854,857],{"class":164,"line":853},44,[162,855,856],{"class":305},"    FString Filename ",[162,858,668],{"class":309},[162,860,862,865],{"class":164,"line":861},45,[162,863,864],{"class":346},"        FPackageName::LongPackageNameToFilename",[162,866,759],{"class":305},[162,868,870],{"class":164,"line":869},46,[162,871,872],{"class":305},"            NewPackagePath,\n",[162,874,876,879],{"class":164,"line":875},47,[162,877,878],{"class":346},"            FPackageName::GetAssetPackageExtension",[162,880,881],{"class":305},"());\n",[162,883,885],{"class":164,"line":884},48,[162,886,506],{"emptyLinePlaceholder":229},[162,888,890,893,896,898,900,903,907,910,913,915],{"class":164,"line":889},49,[162,891,892],{"class":346},"    UE_LOG",[162,894,895],{"class":305},"(LogTemp, Log, ",[162,897,474],{"class":346},[162,899,477],{"class":305},[162,901,902],{"class":480},"\"FileName=",[162,904,906],{"class":905},"sAO_F","%s",[162,908,909],{"class":480},"\"",[162,911,912],{"class":305},"), ",[162,914,433],{"class":309},[162,916,917],{"class":305},"Filename);\n",[162,919,921],{"class":164,"line":920},50,[162,922,506],{"emptyLinePlaceholder":229},[162,924,926],{"class":164,"line":925},51,[162,927,928],{"class":305},"    FSavePackageArgs TsArgs;\n",[162,930,932,935,937,940,942],{"class":164,"line":931},52,[162,933,934],{"class":305},"    TsArgs.TopLevelFlags ",[162,936,519],{"class":309},[162,938,939],{"class":305}," EObjectFlags::RF_Public ",[162,941,783],{"class":309},[162,943,944],{"class":305}," EObjectFlags::RF_Standalone;\n",[162,946,948,951,954,956,959],{"class":164,"line":947},53,[162,949,950],{"class":423},"    bool",[162,952,953],{"class":305}," bSaveSuccess ",[162,955,519],{"class":309},[162,957,958],{"class":346}," UPackage::SavePackage",[162,960,759],{"class":305},[162,962,964],{"class":164,"line":963},54,[162,965,774],{"class":305},[162,967,969],{"class":164,"line":968},55,[162,970,971],{"class":305},"        Texture,\n",[162,973,975,977],{"class":164,"line":974},56,[162,976,765],{"class":309},[162,978,979],{"class":305},"Filename,\n",[162,981,983],{"class":164,"line":982},57,[162,984,985],{"class":305},"        TsArgs\n",[162,987,989],{"class":164,"line":988},58,[162,990,991],{"class":305},"    );\n",[162,993,995],{"class":164,"line":994},59,[162,996,506],{"emptyLinePlaceholder":229},[162,998,1000,1003],{"class":164,"line":999},60,[162,1001,1002],{"class":309},"    return",[162,1004,1005],{"class":305}," bSaveSuccess;\n",[162,1007,1009],{"class":164,"line":1008},61,[162,1010,356],{"class":305},[11,1012,1013,1014,1017,1018,1021],{},"这里传入的是贴图，执行成功时会自动将",[159,1015,1016],{},"_","开头的贴图名称添加",[159,1019,1020],{},"T","前缀进行保存。",[57,1023,1024],{},[11,1025,1026,1027,1030],{},"如果要修复的贴图不是这个规则的，可以在",[159,1028,1029],{},"以数字或 _ 开头 → 修复","处修改名称逻辑",[11,1032,1033],{},"结合上面的寻找未保存资产的接口使用即可：",[152,1035,1037],{"className":290,"code":1036,"language":292,"meta":157,"style":157},"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",[159,1038,1039,1051,1056,1068,1087,1091,1096,1110,1114,1125,1129,1136,1140,1144,1178,1183,1198,1216,1234,1248,1252,1257,1280,1291,1296,1328,1335,1340,1369,1376,1380],{"__ignoreMap":157},[162,1040,1041,1043,1045,1047,1049],{"class":164,"line":165},[162,1042,306],{"class":305},[162,1044,310],{"class":309},[162,1046,313],{"class":305},[162,1048,316],{"class":309},[162,1050,319],{"class":305},[162,1052,1053],{"class":164,"line":212},[162,1054,1055],{"class":299},"\u002F\u002FFEditorFileUtils::GetDirtyWorldPackages(PackagesToSave);\n",[162,1057,1058,1061,1063,1065],{"class":164,"line":213},[162,1059,1060],{"class":339},"FEditorFileUtils",[162,1062,343],{"class":305},[162,1064,385],{"class":346},[162,1066,1067],{"class":305},"(PackagesToSave);\n",[162,1069,1070,1073,1075,1078,1081,1084],{"class":164,"line":330},[162,1071,1072],{"class":339},"UEditorLoadingAndSavingUtils",[162,1074,343],{"class":305},[162,1076,1077],{"class":346},"SavePackages",[162,1079,1080],{"class":305},"(PackagesToSave, ",[162,1082,1083],{"class":492},"false",[162,1085,1086],{"class":305},");\n",[162,1088,1089],{"class":164,"line":336},[162,1090,506],{"emptyLinePlaceholder":229},[162,1092,1093],{"class":164,"line":353},[162,1094,1095],{"class":299},"\u002F\u002F 理论上这里其实不需要两层遍历，不过为了日志清晰，还是按照Package为单位来处理\n",[162,1097,1098,1101,1103,1105,1107],{"class":164,"line":359},[162,1099,1100],{"class":309},"for",[162,1102,452],{"class":305},[162,1104,313],{"class":339},[162,1106,433],{"class":309},[162,1108,1109],{"class":305}," IterPkg : PackagesToSave)\n",[162,1111,1112],{"class":164,"line":365},[162,1113,333],{"class":305},[162,1115,1116,1118,1120,1122],{"class":164,"line":373},[162,1117,449],{"class":309},[162,1119,452],{"class":305},[162,1121,455],{"class":309},[162,1123,1124],{"class":305},"IterPkg)\n",[162,1126,1127],{"class":164,"line":378},[162,1128,463],{"class":305},[162,1130,1131,1134],{"class":164,"line":390},[162,1132,1133],{"class":309},"        continue",[162,1135,496],{"class":305},[162,1137,1138],{"class":164,"line":559},[162,1139,501],{"class":305},[162,1141,1142],{"class":164,"line":564},[162,1143,506],{"emptyLinePlaceholder":229},[162,1145,1146,1148,1150,1152,1154,1157,1160,1163,1165,1167,1170,1172,1175],{"class":164,"line":570},[162,1147,892],{"class":346},[162,1149,895],{"class":305},[162,1151,474],{"class":346},[162,1153,477],{"class":305},[162,1155,1156],{"class":480},"\"UCommonAssetEditFuncLib::SaveBadTextures: Inspecting Package=(",[162,1158,1159],{"class":905},"%p",[162,1161,1162],{"class":480},")",[162,1164,906],{"class":905},[162,1166,909],{"class":480},[162,1168,1169],{"class":305},"), IterPkg, ",[162,1171,433],{"class":309},[162,1173,1174],{"class":346},"GetFullNameSafe",[162,1176,1177],{"class":305},"(IterPkg));\n",[162,1179,1180],{"class":164,"line":584},[162,1181,1182],{"class":299},"    \u002F\u002F 获取包内主资源（贴图）\n",[162,1184,1185,1188,1190,1193,1195],{"class":164,"line":589},[162,1186,1187],{"class":339},"    TArray",[162,1189,310],{"class":305},[162,1191,1192],{"class":339},"UObject",[162,1194,433],{"class":309},[162,1196,1197],{"class":305},"> PkgObjects;\n",[162,1199,1200,1202,1204,1206,1208,1211,1213],{"class":164,"line":595},[162,1201,1187],{"class":339},[162,1203,310],{"class":305},[162,1205,313],{"class":339},[162,1207,433],{"class":309},[162,1209,1210],{"class":305},"> PackagesTmp ",[162,1212,519],{"class":309},[162,1214,1215],{"class":305}," { IterPkg };\n",[162,1217,1218,1221,1223,1226,1228,1231],{"class":164,"line":622},[162,1219,1220],{"class":339},"    UPackageTools",[162,1222,343],{"class":305},[162,1224,1225],{"class":346},"GetObjectsInPackages",[162,1227,477],{"class":305},[162,1229,1230],{"class":309},"&",[162,1232,1233],{"class":305},"PackagesTmp, PkgObjects);\n",[162,1235,1236,1239,1241,1243,1245],{"class":164,"line":627},[162,1237,1238],{"class":309},"    for",[162,1240,452],{"class":305},[162,1242,1192],{"class":339},[162,1244,433],{"class":309},[162,1246,1247],{"class":305}," IterObj : PkgObjects)\n",[162,1249,1250],{"class":164,"line":652},[162,1251,463],{"class":305},[162,1253,1254],{"class":164,"line":657},[162,1255,1256],{"class":299},"        \u002F\u002F 仅处理贴图\n",[162,1258,1259,1262,1264,1267,1269,1272,1274,1277],{"class":164,"line":662},[162,1260,1261],{"class":339},"        UTexture2D",[162,1263,433],{"class":309},[162,1265,1266],{"class":305}," Texture ",[162,1268,519],{"class":309},[162,1270,1271],{"class":346}," Cast",[162,1273,310],{"class":305},[162,1275,1276],{"class":339},"UTexture2D",[162,1278,1279],{"class":305},">(IterObj);\n",[162,1281,1282,1285,1287,1289],{"class":164,"line":671},[162,1283,1284],{"class":309},"        if",[162,1286,452],{"class":305},[162,1288,455],{"class":309},[162,1290,458],{"class":305},[162,1292,1293],{"class":164,"line":685},[162,1294,1295],{"class":305},"        {\n",[162,1297,1298,1301,1303,1305,1307,1310,1312,1314,1316,1318,1321,1323,1325],{"class":164,"line":690},[162,1299,1300],{"class":346},"            UE_LOG",[162,1302,895],{"class":305},[162,1304,474],{"class":346},[162,1306,477],{"class":305},[162,1308,1309],{"class":480},"\"UCommonAssetEditFuncLib::SaveBadTextures: Object no texture=(",[162,1311,1159],{"class":905},[162,1313,1162],{"class":480},[162,1315,906],{"class":905},[162,1317,909],{"class":480},[162,1319,1320],{"class":305},"), IterObj, ",[162,1322,433],{"class":309},[162,1324,1174],{"class":346},[162,1326,1327],{"class":305},"(IterObj));\n",[162,1329,1330,1333],{"class":164,"line":696},[162,1331,1332],{"class":309},"            continue",[162,1334,496],{"class":305},[162,1336,1337],{"class":164,"line":718},[162,1338,1339],{"class":305},"        }\n",[162,1341,1342,1344,1346,1348,1350,1353,1355,1357,1359,1361,1363,1365,1367],{"class":164,"line":730},[162,1343,468],{"class":346},[162,1345,895],{"class":305},[162,1347,474],{"class":346},[162,1349,477],{"class":305},[162,1351,1352],{"class":480},"\"UCommonAssetEditFuncLib::SaveBadTextures: Object=(",[162,1354,1159],{"class":905},[162,1356,1162],{"class":480},[162,1358,906],{"class":905},[162,1360,909],{"class":480},[162,1362,1320],{"class":305},[162,1364,433],{"class":309},[162,1366,1174],{"class":346},[162,1368,1327],{"class":305},[162,1370,1371,1374],{"class":164,"line":739},[162,1372,1373],{"class":346},"        FixInvalidTexture",[162,1375,556],{"class":305},[162,1377,1378],{"class":164,"line":744},[162,1379,501],{"class":305},[162,1381,1382],{"class":164,"line":750},[162,1383,356],{"class":305},[11,1385,1386],{},"这样处理其实还是有问题的，需要在编辑器中选中材质所在文件夹然后点击右键全部重新保存一次。目测是相关的引用没有正确的更新，但是一时半会也找不到自动关联到这些材质或者触发保存的方式，所幸只是手动点击一下鼠标，就不继续投入时间了。",[208,1388,1389],{},"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":157,"searchDepth":212,"depth":213,"links":1391},[1392,1393,1394],{"id":267,"depth":212,"text":267},{"id":284,"depth":212,"text":284},{"id":401,"depth":212,"text":401},"2026-02-06",{"layout":224,"excerpt":1397},{"type":8,"value":1398},[1399],[11,1400,244],{},"\u002F2026-02-06-send-to-unreal-texture-fix",{"title":239,"description":244},"_legacy\u002F2026\u002F2026-02-06-send-to-unreal-texture-fix",[1405,1406],"UE5","Blender","OyC8nTZpLwnhpQh5SWX0QCKQZ3XzQItDOM9CDyTs94Q",{"id":1409,"title":1410,"body":1411,"date":1615,"description":1415,"extension":222,"meta":1616,"navigation":229,"path":1621,"seo":1622,"stem":1623,"tags":1624,"__hash__":1626},"blogs\u002F_legacy\u002F2026\u002F2026-02-04-qwen-tts-comfyui-note.md","ComfyUI中使用Qwen3-tts记录",{"type":8,"value":1412,"toc":1605},[1413,1416,1419,1422,1434,1437,1446,1450,1457,1466,1469,1478,1481,1486,1489,1498,1501,1508,1512,1519,1523,1526,1535,1538,1541,1546,1549,1552,1561,1564,1575,1578,1587,1590,1592,1600,1603],[11,1414,1415],{},"Qwen3-tts这个模型，据说效果不错，于是试着安装了下。",[11,1417,1418],{},"使用设备4060Ti，8GB显存。",[11,1420,1421],{},"版本信息:",[18,1423,1424,1426],{},[21,1425,23],{},[21,1427,1428,1429],{},"flybirdxx\u002FComfyUI-Qwen-TTS ",[82,1430,1433],{"href":1431,"rel":1432},"https:\u002F\u002Fgithub.com\u002Fflybirdxx\u002FComfyUI-Qwen-TTS\u002Fcommit\u002Fbebdd5bdd8345aaafc35c96dab47a6db22514fe3",[86],"Commits on Jan 29, 2026",[40,1435,234],{"id":1436},"comfyui",[11,1438,1439,1440,1445],{},"ComfyUI使用的是官方的ComfyUI_windows_portable版本，在",[82,1441,1444],{"href":1442,"rel":1443},"https:\u002F\u002Fgithub.com\u002FComfy-Org\u002FComfyUI",[86],"ComfyUI官方库","的Release中可以找到。这个版本的依赖库是装好的，可以减少很多麻烦。用Desktop Application版本应该也是可以的，但是之前不知道点了什么功能，不小心把环境搞坏了，就换了portable的版本手动操作了。",[99,1447,1449],{"id":1448},"custom-node安装","Custom node安装",[11,1451,1452,1453,1456],{},"Portable版本可以很方便自己手动安装，在安装前在powershell中先调整python环境，让python.exe指向portable中嵌入的版本即可。例如，我是解包在",[159,1454,1455],{},"F:\\ComfyUI_windows_portable\\","，那么先执行以下指令，临时修改env便可：",[152,1458,1460],{"className":154,"code":1459,"language":156,"meta":157,"style":157},"$env:PATH = \"F:\\ComfyUI_windows_portable\\python_embeded;\" + $env:PATH\n",[159,1461,1462],{"__ignoreMap":157},[162,1463,1464],{"class":164,"line":165},[162,1465,1459],{},[11,1467,1468],{},"修改后执行",[152,1470,1472],{"className":154,"code":1471,"language":156,"meta":157,"style":157},"python -m pip --version\n",[159,1473,1474],{"__ignoreMap":157},[162,1475,1476],{"class":164,"line":165},[162,1477,1471],{},[11,1479,1480],{},"查看输出以确保当前powershell环境正确设置：",[57,1482,1483],{},[11,1484,1485],{},"pip 26.0 from F:\\ComfyUI_windows_portable\\python_embeded\\Lib\\site-packages\\pip (python 3.12)",[11,1487,1488],{},"不过需要留意，这样执行之后pip不会直接修改，需要使用",[152,1490,1492],{"className":154,"code":1491,"language":156,"meta":157,"style":157},"python.exe -m pip install -r .\\requirements.txt\n",[159,1493,1494],{"__ignoreMap":157},[162,1495,1496],{"class":164,"line":165},[162,1497,1491],{},[11,1499,1500],{},"来安装python包，而不是直接执行pip。",[11,1502,1503,1504,1507],{},"之后",[159,1505,1506],{},"cd .\\ComfyUI\\custom_nodes\\","切换到目录执行各个自定义节点提供的安装步骤即可。",[40,1509,1511],{"id":1510},"comfyui-qwen-tts","ComfyUI-Qwen-TTS",[11,1513,1514,1515],{},"这个在节点管理器里面有好几个，目前用的是这个版本：",[82,1516,1511],{"href":1517,"rel":1518},"https:\u002F\u002Fgithub.com\u002Fflybirdxx\u002FComfyUI-Qwen-TTS",[86],[99,1520,1522],{"id":1521},"huggingface镜像设置","Huggingface镜像设置",[11,1524,1525],{},"使用这个插件的节点会自动下载模型，由于是huggingface的地址，如果有访问问题可以在执行ComfyUI前设置镜像地址",[152,1527,1529],{"className":154,"code":1528,"language":156,"meta":157,"style":157},"$env:HF_ENDPOINT = \"https:\u002F\u002Fhf-mirror.com\"\n",[159,1530,1531],{"__ignoreMap":157},[162,1532,1533],{"class":164,"line":165},[162,1534,1528],{},[99,1536,1537],{"id":1537},"pad_token_id问题",[11,1539,1540],{},"执行节点时报错",[57,1542,1543],{},[11,1544,1545],{},"'Qwen3TTSTalkerConfig' object has no attribute 'pad_token_id'",[11,1547,1548],{},"这个问题在Github上有，最终解决方案是降级transformers",[11,1550,1551],{},"可以先检查当前版本",[152,1553,1555],{"className":154,"code":1554,"language":156,"meta":157,"style":157},"python -m pip show transformers\n",[159,1556,1557],{"__ignoreMap":157},[162,1558,1559],{"class":164,"line":165},[162,1560,1554],{},[11,1562,1563],{},"我这边修改前的版本是",[57,1565,1566,1569,1572],{},[11,1567,1568],{},"Name: transformers",[11,1570,1571],{},"Version: 5.0.0",[11,1573,1574],{},"Summary: Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, > audio, and multimodal models, for both inference and training.",[11,1576,1577],{},"执行以下指令安装目标版本",[152,1579,1581],{"className":154,"code":1580,"language":156,"meta":157,"style":157},"python -m pip install transformers==4.57.3\n",[159,1582,1583],{"__ignoreMap":157},[162,1584,1585],{"class":164,"line":165},[162,1586,1580],{},[11,1588,1589],{},"即可正常执行节点",[99,1591,42],{"id":42},[11,1593,1594,1595,97],{},"文档中有提供各个节点的功能，对于Qwen3-tts本身的能力范畴，可以参考",[82,1596,1599],{"href":1597,"rel":1598},"https:\u002F\u002Fqwen.ai\u002Fblog?id=qwen3tts-0115",[86],"Qwen3-tts官方说明",[11,1601,1602],{},"这边测试的Qwen3-TTS CustomVoice，使用预设的几个声音进行生成，1.7B和0.6B模型都能执行，且生成速度在可接受范围内。",[208,1604,210],{},{"title":157,"searchDepth":212,"depth":213,"links":1606},[1607,1610],{"id":1436,"depth":212,"text":234,"children":1608},[1609],{"id":1448,"depth":213,"text":1449},{"id":1510,"depth":212,"text":1511,"children":1611},[1612,1613,1614],{"id":1521,"depth":213,"text":1522},{"id":1537,"depth":213,"text":1537},{"id":42,"depth":213,"text":42},"2026-02-04",{"layout":224,"excerpt":1617},{"type":8,"value":1618},[1619],[11,1620,1415],{},"\u002F2026-02-04-qwen-tts-comfyui-note",{"title":1410,"description":1415},"_legacy\u002F2026\u002F2026-02-04-qwen-tts-comfyui-note",[234,1625],"Qwen3-tts","trzWv2bGeWame7j8FrpOztXJah97fASk7S8NZV1csHs",{"id":1628,"title":1629,"body":1630,"date":1734,"description":1634,"extension":222,"meta":1735,"navigation":229,"path":1740,"seo":1741,"stem":1742,"tags":1743,"__hash__":1745},"blogs\u002F_legacy\u002F2026\u002F2026-01-29-ue5-gameplay-cue-migrate.md","UE5中GamePlayCue问题排查记录",{"type":8,"value":1631,"toc":1729},[1632,1635,1640,1643,1650,1656,1659,1662,1677,1680,1683,1690,1693,1699,1702,1720,1723,1726],[11,1633,1634],{},"GameplayCue模块在写好后没有动，迁移到新项目却发现无法触发Cue。",[57,1636,1637],{},[11,1638,1639],{},"当前虚幻版本UE5.7。",[40,1641,1642],{"id":1642},"检查配置",[11,1644,1645,1646,1649],{},"对于使用了自定义管理器的情况，首先需要检查配置",[159,1647,1648],{},"GlobalGameplayCueManagerClass","是否指向了自己的管理器(如果有定义的话)。\n同时需要检查自己定义的Cue路径是否已经添加到了配置中。",[11,1651,1652],{},[49,1653],{"alt":1654,"src":1655},"配置项截图","\u002Fimages\u002F2026\u002Fgame-play-cue-config.png",[40,1657,1658],{"id":1658},"创建资产",[11,1660,1661],{},"GameplayCue的资产并不在资产列表，需要通过创建蓝图的流程创建，可以从以下两种类型中选择",[152,1663,1665],{"className":290,"code":1664,"language":292,"meta":157,"style":157},"AGameplayCueNotify_Actor\nUGameplayCueNotify_Static\n",[159,1666,1667,1672],{"__ignoreMap":157},[162,1668,1669],{"class":164,"line":165},[162,1670,1671],{"class":305},"AGameplayCueNotify_Actor\n",[162,1673,1674],{"class":164,"line":212},[162,1675,1676],{"class":305},"UGameplayCueNotify_Static\n",[11,1678,1679],{},"两个类型之间的差别比较直观，只是好久没有用的时候会下意识的以为要从列表里面创建导致怎么都找不到。",[40,1681,1682],{"id":1682},"打包问题",[11,1684,1685,1686,1689],{},"如果GamePlayCue在打包版本中失效，可以检查下对应的资产是否在",[159,1687,1688],{},"DirectoriesToAlwaysCook","中。",[11,1691,1692],{},"另外，最好不要在GamePlayCue和GamePlayEffect的C++定义中进行Tag操作，目前遇到两个问题，都是移除相关代码后就解决了",[11,1694,1695,1696,97],{},"第一种，在GamePlayCue的构造函数中直接设置",[159,1697,1698],{},"GameplayCueTag",[11,1700,1701],{},"第二种，在GamePlayEffect的PostInitProperties中，调用:",[152,1703,1705],{"className":290,"code":1704,"language":292,"meta":157,"style":157},"FindOrAddComponent\u003CUTargetTagRequirementsGameplayEffectComponent>()\n",[159,1706,1707],{"__ignoreMap":157},[162,1708,1709,1712,1714,1717],{"class":164,"line":165},[162,1710,1711],{"class":346},"FindOrAddComponent",[162,1713,310],{"class":305},[162,1715,1716],{"class":339},"UTargetTagRequirementsGameplayEffectComponent",[162,1718,1719],{"class":305},">()\n",[11,1721,1722],{},"并设置OnGoing标签。",[11,1724,1725],{},"由于手头上是发行版本的UE，不知为何没有Gas相关的调试符号，就不进一步寻找原因了。",[208,1727,1728],{},"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":157,"searchDepth":212,"depth":213,"links":1730},[1731,1732,1733],{"id":1642,"depth":212,"text":1642},{"id":1658,"depth":212,"text":1658},{"id":1682,"depth":212,"text":1682},"2026-01-29",{"layout":224,"excerpt":1736},{"type":8,"value":1737},[1738],[11,1739,1634],{},"\u002F2026-01-29-ue5-gameplay-cue-migrate",{"title":1629,"description":1634},"_legacy\u002F2026\u002F2026-01-29-ue5-gameplay-cue-migrate",[1405,1744],"GAS","Df64Tl-ValOYd1eYrv2zRJPx7qbHukOQv4UYAnN7u2Q",{"id":1747,"title":1748,"body":1749,"date":1815,"description":1753,"extension":222,"meta":1816,"navigation":229,"path":1821,"seo":1822,"stem":1823,"tags":1824,"__hash__":1826},"blogs\u002F_legacy\u002F2024\u002F2024-02-29-a-simple-way-to-hide-wordpress-login-url.md","一个简单的隐藏Wordpress登录地址的方式",{"type":8,"value":1750,"toc":1810},[1751,1754,1757,1760,1763,1770,1773,1783,1786,1792,1795,1798,1801],[11,1752,1753],{},"Wordpress的登陆地址总是会遇到很多自动化扫描，虽然加个Recaptcha或者2FA就能解决，但是总是会想要阻挡下，说不定什么时候哪里就爆出漏洞导致自动登陆了。",[40,1755,1756],{"id":1756},"访问过滤",[11,1758,1759],{},"看了下Wordpress的官方文档，以及稍微做了下搜索。",[11,1761,1762],{},"发现要通过插件来阻止登陆其实还是挺简单的。",[11,1764,1765,1766,1769],{},"只要hook到",[159,1767,1768],{},"init","上，就可以对所有的访问进行一次过滤了。",[11,1771,1772],{},"由于不想搞得太复杂，最后决定采用Session来存储用户的访问信息。",[11,1774,1775,1776,1779,1780,1782],{},"当用户访问",[159,1777,1778],{},"wp-login.php","时，如果携带了符合要求的参数对，就会给用户加一个许可的Session。如果用户在访问",[159,1781,1778],{},"的时候没有提供正确的参数对，就会被自动重定向到主页。",[40,1784,1785],{"id":1785},"登陆控制",[11,1787,1788,1789,1791],{},"由于不是很清楚Wordpress的流程，无法确定",[159,1790,1768],{},"的action是否能够阻止直接post登陆的情况。",[11,1793,1794],{},"因此额外的hook了登陆流程。只有在用户具有正确的Session的情况下，才能完成登陆的校验流程。",[11,1796,1797],{},"这样就可以防止某些可能存在的未知登陆的情况了。",[40,1799,1800],{"id":1800},"插件代码",[11,1802,1803,1804,1809],{},"直接放到了",[82,1805,1808],{"href":1806,"rel":1807},"https:\u002F\u002Fgithub.com\u002FArisego\u002FWpLockLogin",[86],"GitHub","上，不过如果要用的话需要注意风险。必须保证能在不用重新登陆的情况下删除这个插件，不然万一出问题可能就一直登不进去了。",{"title":157,"searchDepth":212,"depth":213,"links":1811},[1812,1813,1814],{"id":1756,"depth":212,"text":1756},{"id":1785,"depth":212,"text":1785},{"id":1800,"depth":212,"text":1800},"2024-02-29",{"layout":224,"excerpt":1817},{"type":8,"value":1818},[1819],[11,1820,1753],{},"\u002F2024-02-29-a-simple-way-to-hide-wordpress-login-url",{"title":1748,"description":1753},"_legacy\u002F2024\u002F2024-02-29-a-simple-way-to-hide-wordpress-login-url",[1825],"Wordpress","qox_b8OKgNhvBDsetI8Ne-zAzIGWT2l9L1-7ZnwOkYc",222,1788763176370]