[{"data":1,"prerenderedAt":327},["ShallowReactive",2],{"\u002F2024-01-17-sequence-face-trace-in-code":3},{"id":4,"title":5,"body":6,"date":312,"description":12,"extension":313,"meta":314,"navigation":320,"path":321,"seo":322,"stem":323,"tags":324,"__hash__":326},"blogs\u002F_legacy\u002F2024\u002F2024-01-17-sequence-face-trace-in-code.md","如何在代码中控制Sequence设置的FadeTrack",{"type":7,"value":8,"toc":310},"minimark",[9,13,16,19,31,237,243,246,303,306],[10,11,12],"p",{},"有时出于表现需求，会在Sequence中添加FadeTrack用于遮蔽场景且选择KeepState，我们需要保证代码接管逻辑时其状态被清除掉。",[10,14,15],{},"当前使用的UE版本为UE5.3.2。",[10,17,18],{},"如果只是简单的使用FadeTrack是不会有问题的，但是当动态使用Sequence太多的时候，就很难控制最后一个执行的Sequence不是会保持状态的Fade。因此，干脆在代码中加一个保险。",[10,20,21,22,26,27,30],{},"通过名字判断，首先会找到，FadeTrack本身的定义是在",[23,24,25],"code",{},"UMovieSceneFadeTrack","中的。经过一串查找，最后可以找到",[23,28,29],{},"FFadeUtil::ApplyFade","。而这其中我们的目标是这个：",[32,33,38],"pre",{"className":34,"code":35,"language":36,"meta":37,"style":37},"language-cpp shiki shiki-themes github-light-high-contrast github-dark monokai","    \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","cpp","",[23,39,40,49,76,113,151,157,184,207,213,225,231],{"__ignoreMap":37},[41,42,45],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"sZdD5","    \u002F\u002F Set runtime fade\n",[41,50,52,56,60,63,66,69,73],{"class":43,"line":51},2,[41,53,55],{"class":54},"s0idv","    UObject",[41,57,59],{"class":58},"sLXdl","*",[41,61,62],{"class":54}," Context ",[41,64,65],{"class":58},"=",[41,67,68],{"class":54}," Player.",[41,70,72],{"class":71},"scAT4","GetPlaybackContext",[41,74,75],{"class":54},"();\n",[41,77,79,82,84,87,89,91,94,97,100,103,106,110],{"class":43,"line":78},3,[41,80,81],{"class":54},"    UWorld",[41,83,59],{"class":58},[41,85,86],{"class":54}," World ",[41,88,65],{"class":58},[41,90,62],{"class":54},[41,92,93],{"class":58},"?",[41,95,96],{"class":54}," Context->",[41,98,99],{"class":71},"GetWorld",[41,101,102],{"class":54},"() ",[41,104,105],{"class":58},":",[41,107,109],{"class":108},"stP0Q"," nullptr",[41,111,112],{"class":54},";\n",[41,114,116,119,122,125,128,131,135,138,141,144,146,148],{"class":43,"line":115},4,[41,117,118],{"class":58},"    if",[41,120,121],{"class":54},"( World ",[41,123,124],{"class":58},"&&",[41,126,127],{"class":54}," ( World->WorldType ",[41,129,130],{"class":58},"==",[41,132,134],{"class":133},"sfUV7"," EWorldType",[41,136,137],{"class":54},"::Game ",[41,139,140],{"class":58},"||",[41,142,143],{"class":54}," World->WorldType ",[41,145,130],{"class":58},[41,147,134],{"class":133},[41,149,150],{"class":54},"::PIE ) )\n",[41,152,154],{"class":43,"line":153},5,[41,155,156],{"class":54},"    {\n",[41,158,160,163,165,168,170,173,176,179,182],{"class":43,"line":159},6,[41,161,162],{"class":133},"        APlayerController",[41,164,59],{"class":58},[41,166,167],{"class":54}," PlayerController ",[41,169,65],{"class":58},[41,171,172],{"class":54}," World->",[41,174,175],{"class":71},"GetGameInstance",[41,177,178],{"class":54},"()->",[41,180,181],{"class":71},"GetFirstLocalPlayerController",[41,183,75],{"class":54},[41,185,187,190,193,196,198,201,204],{"class":43,"line":186},7,[41,188,189],{"class":58},"        if",[41,191,192],{"class":54},"( PlayerController ",[41,194,195],{"class":58},"!=",[41,197,109],{"class":108},[41,199,200],{"class":58}," &&",[41,202,203],{"class":71}," IsValid",[41,205,206],{"class":54},"(PlayerController->PlayerCameraManager) )\n",[41,208,210],{"class":43,"line":209},8,[41,211,212],{"class":54},"        {\n",[41,214,216,219,222],{"class":43,"line":215},9,[41,217,218],{"class":54},"            PlayerController->PlayerCameraManager->",[41,220,221],{"class":71},"SetManualCameraFade",[41,223,224],{"class":54},"( FadeValue, FadeColor, bFadeAudio );\n",[41,226,228],{"class":43,"line":227},10,[41,229,230],{"class":54},"        }\n",[41,232,234],{"class":43,"line":233},11,[41,235,236],{"class":54},"    }\n",[10,238,239,240,242],{},"也就是说，实际调用",[23,241,221],{},"就可以调整FadeTrack了。",[10,244,245],{},"于是，在场景播放的动态Sequence系统结束时，调用下",[32,247,249],{"className":34,"code":248,"language":36,"meta":37,"style":37},"SetManualCameraFade(0.0f, FLinearColor(0.0f, 0.0f, 0.0f, 0.0f), false);\n",[23,250,251],{"__ignoreMap":37},[41,252,253,255,258,261,264,267,270,272,274,276,278,280,282,284,286,288,290,292,294,297,300],{"class":43,"line":44},[41,254,221],{"class":71},[41,256,257],{"class":54},"(",[41,259,260],{"class":108},"0.0",[41,262,263],{"class":58},"f",[41,265,266],{"class":54},", ",[41,268,269],{"class":71},"FLinearColor",[41,271,257],{"class":54},[41,273,260],{"class":108},[41,275,263],{"class":58},[41,277,266],{"class":54},[41,279,260],{"class":108},[41,281,263],{"class":58},[41,283,266],{"class":54},[41,285,260],{"class":108},[41,287,263],{"class":58},[41,289,266],{"class":54},[41,291,260],{"class":108},[41,293,263],{"class":58},[41,295,296],{"class":54},"), ",[41,298,299],{"class":108},"false",[41,301,302],{"class":54},");\n",[10,304,305],{},"就可以达到预期的效果了。",[307,308,309],"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 .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":37,"searchDepth":51,"depth":78,"links":311},[],"2024-01-17","md",{"layout":315,"excerpt":316},"post",{"type":7,"value":317},[318],[10,319,12],{},true,"\u002F2024-01-17-sequence-face-trace-in-code",{"title":5,"description":12},"_legacy\u002F2024\u002F2024-01-17-sequence-face-trace-in-code",[325],"ue5","39GUEjpcX3QLi8yyuTROXaoPMEd7eawb7vfU_-uyMYs",1788763176977]