[{"data":1,"prerenderedAt":1053},["ShallowReactive",2],{"blog-page-2":3,"blog-count":1052},[4,176,322,629,889],{"id":5,"title":6,"body":7,"date":162,"description":13,"extension":163,"meta":164,"navigation":170,"path":171,"seo":172,"stem":173,"tags":174,"__hash__":175},"blogs\u002F_legacy\u002F2024\u002F2024-02-19-jenkins-problems.md","Jenkins使用时的问题记录",{"type":8,"value":9,"toc":158},"minimark",[10,14,18,21,27,38,41,65,68,71,74,115,124,154],[11,12,13],"p",{},"有个Jenkins挂在服务器上好久没动过了，年后上去看了下发现居然完全挂掉了。",[15,16,17],"h2",{"id":17},"空间不足",[11,19,20],{},"还没搞清楚问题前，Jenkins就完全访问不了了，直接在命令行拉起服务，提示",[22,23,24],"blockquote",{},[11,25,26],{},"Jenkins failed to create a temporary file in \u002Ftmp: java.io.IOException: No space left on device",[11,28,29,30,37],{},"搜索了下发现是空间不足了，可以参考",[31,32,36],"a",{"href":33,"rel":34},"https:\u002F\u002Fdocs.cloudbees.com\u002Fdocs\u002Fcloudbees-ci-kb\u002Flatest\u002Fbest-practices\u002Fdeleting-old-builds-best-strategy-for-cleanup-and-disk-space-management",[35],"nofollow","这里","的操作",[11,39,40],{},"由于我这边已经连服务都拉不起来了，只能手动删除一些缓存",[42,43,48],"pre",{"className":44,"code":45,"language":46,"meta":47,"style":47},"language-shell shiki shiki-themes github-light-high-contrast github-dark monokai","cd \u002Fvar\u002Flib\u002Fjenkins\u002Fjobs\u002Fmy_awsome_job\u002F\nrm -r builds\u002F\n","shell","",[49,50,51,59],"code",{"__ignoreMap":47},[52,53,56],"span",{"class":54,"line":55},"line",1,[52,57,58],{},"cd \u002Fvar\u002Flib\u002Fjenkins\u002Fjobs\u002Fmy_awsome_job\u002F\n",[52,60,62],{"class":54,"line":61},2,[52,63,64],{},"rm -r builds\u002F\n",[11,66,67],{},"然后就可以拉起Jenkins了，按照上面的文章配置了下自动清除，后续观察下有没有问题。",[15,69,70],{"id":70},"升级失败",[11,72,73],{},"出现错误：",[42,75,79],{"className":76,"code":77,"language":78,"meta":47,"style":47},"language-log shiki shiki-themes github-light-high-contrast github-dark monokai","Err:6 https:\u002F\u002Fpkg.jenkins.io\u002Fdebian-stable binary\u002F Release.gpg\n  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 5BA31D57EF5975CA\nFetched 833 B in 1s (616 B\u002Fs)\nReading package lists... Done\nW: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https:\u002F\u002Fpkg.jenkins.io\u002Fdebian-stable binary\u002F Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 5BA31D57EF5975CA\nW: Failed to fetch http:\u002F\u002Fpkg.jenkins.io\u002Fdebian-stable\u002Fbinary\u002FRelease.gpg  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 5BA31D57EF5975CA\n","log",[49,80,81,86,91,97,103,109],{"__ignoreMap":47},[52,82,83],{"class":54,"line":55},[52,84,85],{},"Err:6 https:\u002F\u002Fpkg.jenkins.io\u002Fdebian-stable binary\u002F Release.gpg\n",[52,87,88],{"class":54,"line":61},[52,89,90],{},"  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 5BA31D57EF5975CA\n",[52,92,94],{"class":54,"line":93},3,[52,95,96],{},"Fetched 833 B in 1s (616 B\u002Fs)\n",[52,98,100],{"class":54,"line":99},4,[52,101,102],{},"Reading package lists... Done\n",[52,104,106],{"class":54,"line":105},5,[52,107,108],{},"W: An error occurred during the signature verification. The repository is not updated and the previous index files will be used. GPG error: https:\u002F\u002Fpkg.jenkins.io\u002Fdebian-stable binary\u002F Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 5BA31D57EF5975CA\n",[52,110,112],{"class":54,"line":111},6,[52,113,114],{},"W: Failed to fetch http:\u002F\u002Fpkg.jenkins.io\u002Fdebian-stable\u002Fbinary\u002FRelease.gpg  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 5BA31D57EF5975CA\n",[11,116,117,118,123],{},"参考了",[31,119,122],{"href":120,"rel":121},"https:\u002F\u002Fwww.jenkins.io\u002Fblog\u002F2023\u002F03\u002F27\u002Frepository-signing-keys-changing\u002F",[35],"这个资料","，似乎是密钥变更导致的。直接复制黏贴后就能升级了。",[42,125,127],{"className":44,"code":126,"language":46,"meta":47,"style":47},"curl -fsSL https:\u002F\u002Fpkg.jenkins.io\u002Fdebian-stable\u002Fjenkins.io-2023.key | sudo tee \\\n  \u002Fusr\u002Fshare\u002Fkeyrings\u002Fjenkins-keyring.asc > \u002Fdev\u002Fnull\necho deb [signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fjenkins-keyring.asc] \\\n  https:\u002F\u002Fpkg.jenkins.io\u002Fdebian-stable binary\u002F | sudo tee \\\n  \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fjenkins.list > \u002Fdev\u002Fnull\n",[49,128,129,134,139,144,149],{"__ignoreMap":47},[52,130,131],{"class":54,"line":55},[52,132,133],{},"curl -fsSL https:\u002F\u002Fpkg.jenkins.io\u002Fdebian-stable\u002Fjenkins.io-2023.key | sudo tee \\\n",[52,135,136],{"class":54,"line":61},[52,137,138],{},"  \u002Fusr\u002Fshare\u002Fkeyrings\u002Fjenkins-keyring.asc > \u002Fdev\u002Fnull\n",[52,140,141],{"class":54,"line":93},[52,142,143],{},"echo deb [signed-by=\u002Fusr\u002Fshare\u002Fkeyrings\u002Fjenkins-keyring.asc] \\\n",[52,145,146],{"class":54,"line":99},[52,147,148],{},"  https:\u002F\u002Fpkg.jenkins.io\u002Fdebian-stable binary\u002F | sudo tee \\\n",[52,150,151],{"class":54,"line":105},[52,152,153],{},"  \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fjenkins.list > \u002Fdev\u002Fnull\n",[155,156,157],"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":47,"searchDepth":61,"depth":93,"links":159},[160,161],{"id":17,"depth":61,"text":17},{"id":70,"depth":61,"text":70},"2024-02-19","md",{"layout":165,"excerpt":166},"post",{"type":8,"value":167},[168],[11,169,13],{},true,"\u002F2024-02-19-jenkins-problems",{"title":6,"description":13},"_legacy\u002F2024\u002F2024-02-19-jenkins-problems",[],"u7ipYedm2BYWlTZ8iRkErsPUWNQNVsmb_HW1ZKUNNoc",{"id":177,"title":178,"body":179,"date":311,"description":183,"extension":163,"meta":312,"navigation":170,"path":317,"seo":318,"stem":319,"tags":320,"__hash__":321},"blogs\u002F_legacy\u002F2024\u002F2024-02-01-openwrt-samba.md","OpenWrt设置局域网nas访问",{"type":8,"value":180,"toc":304},[181,184,187,194,201,208,212,219,226,231,234,241,244,248,251,257,294,302],[11,182,183],{},"使用的版本：OpenWrt 23.05。",[15,185,186],{"id":186},"安装",[11,188,189,190],{},"基本按照官方的来就行了： ",[31,191,192],{"href":192,"rel":193},"https:\u002F\u002Fopenwrt.org\u002Fdocs\u002Fguide-user\u002Fservices\u002Fnas\u002Fusb-storage-samba-webinterface",[35],[11,195,196,197,200],{},"里面有个samba的库已经过期了，直接在",[49,198,199],{},"系统\u002F软件包","界面搜索samba就能找到新的了",[11,202,203],{},[204,205],"img",{"alt":206,"src":207},"Alt text","\u002Fimages\u002F2024\u002Fimage.png",[209,210,211],"h3",{"id":211},"配置",[11,213,214,215,218],{},"配置要分两边配置，一个是",[49,216,217],{},"系统\u002F挂载点","这边，首先要成功的挂载USB存储设备才行。",[11,220,221,222,225],{},"挂载成功后在",[49,223,224],{},"服务\u002F网络共享","的共享目录这边添加新的就可以了，不同的硬盘可能会挂到不同的mnt点，无法访问的时候可以检查下。",[11,227,228],{},[204,229],{"alt":206,"src":230},"\u002Fimages\u002F2024\u002Fimage2.png",[209,232,233],{"id":233},"一些小问题",[11,235,236,237,240],{},"移动硬盘不识别，需要额外安装",[49,238,239],{},"kmod-usb-storage-uas","。我这边应该是usb3.0的移动硬盘的协议问题引起的，没有详细的考究。",[11,242,243],{},"目录不可写的问题，试了下找到的方案都没什么用。查了下原因似乎是ntfs引起的，于是将硬盘格式化成ext4就成功访问了。",[15,245,247],{"id":246},"开放wan口访问","开放Wan口访问",[11,249,250],{},"由于路由结构的问题，电脑是与路由器平级的，所以需要开放wan口才能访问。",[11,252,253,254],{},"直接配置",[49,255,256],{},"\u002Fetc\u002Fconfig\u002Ffirewall",[42,258,262],{"className":259,"code":260,"language":261,"meta":47,"style":47},"language-ini shiki shiki-themes github-light-high-contrast github-dark monokai","config rule\n    option name 'Open Samba on WAN'\n    option src 'wan'\n    option proto 'tcp udp'\n    option dest_port '137 138 139 445'\n    option target 'ACCEPT'\n","ini",[49,263,264,269,274,279,284,289],{"__ignoreMap":47},[52,265,266],{"class":54,"line":55},[52,267,268],{},"config rule\n",[52,270,271],{"class":54,"line":61},[52,272,273],{},"    option name 'Open Samba on WAN'\n",[52,275,276],{"class":54,"line":93},[52,277,278],{},"    option src 'wan'\n",[52,280,281],{"class":54,"line":99},[52,282,283],{},"    option proto 'tcp udp'\n",[52,285,286],{"class":54,"line":105},[52,287,288],{},"    option dest_port '137 138 139 445'\n",[52,290,291],{"class":54,"line":111},[52,292,293],{},"    option target 'ACCEPT'\n",[11,295,296,297,301],{},"这之前有参照官方的建议设置防火墙，如果设置了没用可以参考下：",[31,298,299],{"href":299,"rel":300},"https:\u002F\u002Fopenwrt.org\u002Fdocs\u002Fguide-user\u002Fservices\u002Fnas\u002Fcifs.server",[35]," 。",[155,303,157],{},{"title":47,"searchDepth":61,"depth":93,"links":305},[306,310],{"id":186,"depth":61,"text":186,"children":307},[308,309],{"id":211,"depth":93,"text":211},{"id":233,"depth":93,"text":233},{"id":246,"depth":61,"text":247},"2024-02-01",{"layout":165,"excerpt":313},{"type":8,"value":314},[315],[11,316,183],{},"\u002F2024-02-01-openwrt-samba",{"title":178,"description":183},"_legacy\u002F2024\u002F2024-02-01-openwrt-samba",[],"232l1rOjkHFVETwntFtYEfvPiyJFEa13sAsIseblrno",{"id":323,"title":324,"body":325,"date":617,"description":329,"extension":163,"meta":618,"navigation":170,"path":623,"seo":624,"stem":625,"tags":626,"__hash__":628},"blogs\u002F_legacy\u002F2024\u002F2024-01-17-sequence-face-trace-in-code.md","如何在代码中控制Sequence设置的FadeTrack",{"type":8,"value":326,"toc":615},[327,330,333,336,347,543,549,552,609,612],[11,328,329],{},"有时出于表现需求，会在Sequence中添加FadeTrack用于遮蔽场景且选择KeepState，我们需要保证代码接管逻辑时其状态被清除掉。",[11,331,332],{},"当前使用的UE版本为UE5.3.2。",[11,334,335],{},"如果只是简单的使用FadeTrack是不会有问题的，但是当动态使用Sequence太多的时候，就很难控制最后一个执行的Sequence不是会保持状态的Fade。因此，干脆在代码中加一个保险。",[11,337,338,339,342,343,346],{},"通过名字判断，首先会找到，FadeTrack本身的定义是在",[49,340,341],{},"UMovieSceneFadeTrack","中的。经过一串查找，最后可以找到",[49,344,345],{},"FFadeUtil::ApplyFade","。而这其中我们的目标是这个：",[42,348,352],{"className":349,"code":350,"language":351,"meta":47,"style":47},"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",[49,353,354,360,386,422,459,464,490,513,519,531,537],{"__ignoreMap":47},[52,355,356],{"class":54,"line":55},[52,357,359],{"class":358},"sZdD5","    \u002F\u002F Set runtime fade\n",[52,361,362,366,370,373,376,379,383],{"class":54,"line":61},[52,363,365],{"class":364},"s0idv","    UObject",[52,367,369],{"class":368},"sLXdl","*",[52,371,372],{"class":364}," Context ",[52,374,375],{"class":368},"=",[52,377,378],{"class":364}," Player.",[52,380,382],{"class":381},"scAT4","GetPlaybackContext",[52,384,385],{"class":364},"();\n",[52,387,388,391,393,396,398,400,403,406,409,412,415,419],{"class":54,"line":93},[52,389,390],{"class":364},"    UWorld",[52,392,369],{"class":368},[52,394,395],{"class":364}," World ",[52,397,375],{"class":368},[52,399,372],{"class":364},[52,401,402],{"class":368},"?",[52,404,405],{"class":364}," Context->",[52,407,408],{"class":381},"GetWorld",[52,410,411],{"class":364},"() ",[52,413,414],{"class":368},":",[52,416,418],{"class":417},"stP0Q"," nullptr",[52,420,421],{"class":364},";\n",[52,423,424,427,430,433,436,439,443,446,449,452,454,456],{"class":54,"line":99},[52,425,426],{"class":368},"    if",[52,428,429],{"class":364},"( World ",[52,431,432],{"class":368},"&&",[52,434,435],{"class":364}," ( World->WorldType ",[52,437,438],{"class":368},"==",[52,440,442],{"class":441},"sfUV7"," EWorldType",[52,444,445],{"class":364},"::Game ",[52,447,448],{"class":368},"||",[52,450,451],{"class":364}," World->WorldType ",[52,453,438],{"class":368},[52,455,442],{"class":441},[52,457,458],{"class":364},"::PIE ) )\n",[52,460,461],{"class":54,"line":105},[52,462,463],{"class":364},"    {\n",[52,465,466,469,471,474,476,479,482,485,488],{"class":54,"line":111},[52,467,468],{"class":441},"        APlayerController",[52,470,369],{"class":368},[52,472,473],{"class":364}," PlayerController ",[52,475,375],{"class":368},[52,477,478],{"class":364}," World->",[52,480,481],{"class":381},"GetGameInstance",[52,483,484],{"class":364},"()->",[52,486,487],{"class":381},"GetFirstLocalPlayerController",[52,489,385],{"class":364},[52,491,493,496,499,502,504,507,510],{"class":54,"line":492},7,[52,494,495],{"class":368},"        if",[52,497,498],{"class":364},"( PlayerController ",[52,500,501],{"class":368},"!=",[52,503,418],{"class":417},[52,505,506],{"class":368}," &&",[52,508,509],{"class":381}," IsValid",[52,511,512],{"class":364},"(PlayerController->PlayerCameraManager) )\n",[52,514,516],{"class":54,"line":515},8,[52,517,518],{"class":364},"        {\n",[52,520,522,525,528],{"class":54,"line":521},9,[52,523,524],{"class":364},"            PlayerController->PlayerCameraManager->",[52,526,527],{"class":381},"SetManualCameraFade",[52,529,530],{"class":364},"( FadeValue, FadeColor, bFadeAudio );\n",[52,532,534],{"class":54,"line":533},10,[52,535,536],{"class":364},"        }\n",[52,538,540],{"class":54,"line":539},11,[52,541,542],{"class":364},"    }\n",[11,544,545,546,548],{},"也就是说，实际调用",[49,547,527],{},"就可以调整FadeTrack了。",[11,550,551],{},"于是，在场景播放的动态Sequence系统结束时，调用下",[42,553,555],{"className":349,"code":554,"language":351,"meta":47,"style":47},"SetManualCameraFade(0.0f, FLinearColor(0.0f, 0.0f, 0.0f, 0.0f), false);\n",[49,556,557],{"__ignoreMap":47},[52,558,559,561,564,567,570,573,576,578,580,582,584,586,588,590,592,594,596,598,600,603,606],{"class":54,"line":55},[52,560,527],{"class":381},[52,562,563],{"class":364},"(",[52,565,566],{"class":417},"0.0",[52,568,569],{"class":368},"f",[52,571,572],{"class":364},", ",[52,574,575],{"class":381},"FLinearColor",[52,577,563],{"class":364},[52,579,566],{"class":417},[52,581,569],{"class":368},[52,583,572],{"class":364},[52,585,566],{"class":417},[52,587,569],{"class":368},[52,589,572],{"class":364},[52,591,566],{"class":417},[52,593,569],{"class":368},[52,595,572],{"class":364},[52,597,566],{"class":417},[52,599,569],{"class":368},[52,601,602],{"class":364},"), ",[52,604,605],{"class":417},"false",[52,607,608],{"class":364},");\n",[11,610,611],{},"就可以达到预期的效果了。",[155,613,614],{},"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":47,"searchDepth":61,"depth":93,"links":616},[],"2024-01-17",{"layout":165,"excerpt":619},{"type":8,"value":620},[621],[11,622,329],{},"\u002F2024-01-17-sequence-face-trace-in-code",{"title":324,"description":329},"_legacy\u002F2024\u002F2024-01-17-sequence-face-trace-in-code",[627],"ue5","39GUEjpcX3QLi8yyuTROXaoPMEd7eawb7vfU_-uyMYs",{"id":630,"title":631,"body":632,"date":878,"description":636,"extension":163,"meta":879,"navigation":170,"path":884,"seo":885,"stem":886,"tags":887,"__hash__":888},"blogs\u002F_legacy\u002F2023\u002F2023-10-19-ue5-ovrlipsync-fix.md","UE5.2中OvrLipSync无法使用的问题",{"type":8,"value":633,"toc":875},[634,637,640,643,648,651,654,657,660,663,841,844,859,866,869,872],[11,635,636],{},"OvrLipSync插件之前在UE4中使用还是比较正常的，但是在UE5.2上引入的时候发现生成的数据始终无法驱动动画。",[11,638,639],{},"当前使用的UE版本为UE5.2.0。",[11,641,642],{},"先直接上结论，输入指令：",[22,644,645],{},[11,646,647],{},"au.editor.ForceAudioNonStreaming 1",[11,649,650],{},"后再转化就可以了。",[15,652,653],{"id":653},"原因排查",[11,655,656],{},"这个插件之前用的时候是直接可以用的，所以没有怎么关注过细节。",[11,658,659],{},"这次稍微看了下实现，发现其原理还是比较简单的。尤其是针对离线数据使用的情况，其实就是针对语音文件生成了一个Visemes的数组。之后在语音播放时，根据当前播放的时间取到对应需要的MorphTarget值，然后设置到动画上。",[11,661,662],{},"由于这个过程在调试的时候不是很好判定，所以直接修改了插件的代码来观察生成的数据：",[42,664,666],{"className":349,"code":665,"language":351,"meta":47,"style":47},"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",[49,667,668,676,689,694,701,706,714,731,735,747,755,759,807,825,830,835],{"__ignoreMap":47},[52,669,670,673],{"class":54,"line":55},[52,671,672],{"class":381},"USTRUCT",[52,674,675],{"class":364},"()\n",[52,677,678,682,686],{"class":54,"line":61},[52,679,681],{"class":680},"sGZGq","struct",[52,683,685],{"class":684},"spBst"," OVRLIPSYNC_API",[52,687,688],{"class":441}," FOVRLipSyncFrame\n",[52,690,691],{"class":54,"line":93},[52,692,693],{"class":364},"{\n",[52,695,696,699],{"class":54,"line":99},[52,697,698],{"class":381},"    GENERATED_BODY",[52,700,675],{"class":364},[52,702,703],{"class":54,"line":105},[52,704,705],{"emptyLinePlaceholder":170},"\n",[52,707,708,711],{"class":54,"line":111},[52,709,710],{"class":381},"    UPROPERTY",[52,712,713],{"class":364},"(EditDefaultsOnly)\n",[52,715,716,719,722,725,728],{"class":54,"line":492},[52,717,718],{"class":364},"    TArray",[52,720,721],{"class":368},"\u003C",[52,723,724],{"class":680},"float",[52,726,727],{"class":368},">",[52,729,730],{"class":364}," VisemeScores;\n",[52,732,733],{"class":54,"line":515},[52,734,705],{"emptyLinePlaceholder":170},[52,736,737,739,741,744],{"class":54,"line":521},[52,738,710],{"class":381},[52,740,563],{"class":364},[52,742,743],{"class":441},"EditDefaultsOnly",[52,745,746],{"class":364},")\n",[52,748,749,752],{"class":54,"line":533},[52,750,751],{"class":680},"    float",[52,753,754],{"class":364}," LaughterScore;\n",[52,756,757],{"class":54,"line":539},[52,758,705],{"emptyLinePlaceholder":170},[52,760,762,765,767,770,773,775,777,780,783,787,790,793,795,798,800,803,805],{"class":54,"line":761},12,[52,763,764],{"class":381},"    FOVRLipSyncFrame",[52,766,563],{"class":364},[52,768,769],{"class":368},"const",[52,771,772],{"class":441}," TArray",[52,774,721],{"class":364},[52,776,724],{"class":680},[52,778,779],{"class":364},"> ",[52,781,782],{"class":368},"&",[52,784,786],{"class":785},"sbfHu","visemes",[52,788,789],{"class":368}," =",[52,791,792],{"class":364}," {}, ",[52,794,724],{"class":680},[52,796,797],{"class":785}," laughterScore",[52,799,789],{"class":368},[52,801,802],{"class":417}," 0.0",[52,804,569],{"class":368},[52,806,746],{"class":364},[52,808,810,813,816,819,822],{"class":54,"line":809},13,[52,811,812],{"class":364},"        : ",[52,814,815],{"class":381},"VisemeScores",[52,817,818],{"class":364},"(visemes), ",[52,820,821],{"class":381},"LaughterScore",[52,823,824],{"class":364},"(laughterScore)\n",[52,826,828],{"class":54,"line":827},14,[52,829,463],{"class":364},[52,831,833],{"class":54,"line":832},15,[52,834,542],{"class":364},[52,836,838],{"class":54,"line":837},16,[52,839,840],{"class":364},"};\n",[11,842,843],{},"这样就可以在资产文件中观察生成的数据了，可以看到生成的数据全部都是0。",[11,845,846,847,850,851,854,855,858],{},"于是转到生成逻辑，发现在",[49,848,849],{},"DecompressSoundWave","内部调用",[49,852,853],{},"InitAudioResource","时，在检查",[49,856,857],{},"IsStreaming","的地方没通过，导致实际没有返回插件预期的数据。",[11,860,861,862,865],{},"虽然要比较正式的修改的话需要进一步的跟进流程来确定怎么调整，但是这部分代码是",[49,863,864],{},"OvrLipSync","官方维护的，要动起来也得花时间去看它的结构。发现有一个开关可以在编辑器内关闭这个行为后就没有跟进了。",[11,867,868],{},"这样可能只能在编辑器内起作用，但是由于实际使用的时候是直接调用生成的离线数据的。打包后离线数据的使用没有影响。",[11,870,871],{},"由于没有使用实时数据动态生成的需求，就没有继续跟进了。",[155,873,874],{},"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":47,"searchDepth":61,"depth":93,"links":876},[877],{"id":653,"depth":61,"text":653},"2023-10-19",{"layout":165,"excerpt":880},{"type":8,"value":881},[882],[11,883,636],{},"\u002F2023-10-19-ue5-ovrlipsync-fix",{"title":631,"description":636},"_legacy\u002F2023\u002F2023-10-19-ue5-ovrlipsync-fix",[627],"uPQYbRzu9JEhV4bvlVrSX2SFbF-KJaj9ohYCNjlTHLc",{"id":890,"title":891,"body":892,"date":1040,"description":896,"extension":163,"meta":1041,"navigation":170,"path":1046,"seo":1047,"stem":1048,"tags":1049,"__hash__":1051},"blogs\u002F_legacy\u002F2022\u002F2022-09-20-log-of-fail.md"," 失败记录",{"type":8,"value":893,"toc":1031},[894,897,900,903,906,911,916,919,922,925,928,931,934,941,944,947,950,953,956,959,962,965,968,971,974,977,980,983,986,989,992,995,998,1006,1009,1012,1015,1018,1021,1025,1028],[11,895,896],{},"失败记录，希望下次是成功记录。",[15,898,899],{"id":899},"产品与市场",[11,901,902],{},"前面很长一段时间都在纠结叙事、玩法设计，但是总有种在原地转圈的感觉。因为游戏不是几天就能做成的，可能一开始觉得很棒的主意，后面却变得不是那么有趣了。",[11,904,905],{},"最近偶然看《Start small, Stay small》，感觉有受到一些启发",[22,907,908],{},[11,909,910],{},"Product Last. Marketing First.",[22,912,913],{},[11,914,915],{},"Market comes first, marketing second, aeshetic third, and functionality a distant fourth.",[11,917,918],{},"首先要思考的是，这个游戏是面向什么类型的玩家的。",[11,920,921],{},"放到Steam上的游戏和放到Switch上的游戏，其玩家群体会差别很大。",[11,923,924],{},"《魔女之家》和《零》，虽然可以都算作恐怖游戏，其面对的玩家群体却不见得完全相同。",[11,926,927],{},"没有一个目标市场就很难对产品进行定义，没有产品定义就很难形成企划。在企划形成前纠结叙事与玩法的设计是非常没有意义的。毕竟，有的游戏类型完全不需要叙事，有的则相反。产品没有定义会导致想法失控，各种各样的想法都觉得不错，都想放进来。最终使得项目变成一个四不像，连自己都看不下去。",[209,929,930],{"id":930},"定位",[11,932,933],{},"前几天看到的GDC演讲里，有大佬介绍自己是如何做出一些决策的。",[11,935,936],{},[31,937,940],{"href":938,"rel":939},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=YaUdstkv1RE",[35],"GDC-# Solo Development: Myths, Reality and Survival Strategies",[11,942,943],{},"感觉最好的方法，就是首先找到一个现有的成熟的产品类型，然后在这个类目内的设计上做简单的修改或者叠加。",[11,945,946],{},"一次想要做很多事情，更容易导致失控。",[209,948,949],{"id":949},"招募",[11,951,952],{},"前段有尝试自己进行一些网上的招募，感觉挺失败的。",[11,954,955],{},"总结下，除非有明确的商业计划，不要招募。",[11,957,958],{},"但是实际上，有明确商业计划的情况下，更好的选择是进行外包。",[11,960,961],{},"否则需要花费大量的时间去与人沟通，如果自己的商业目标都不明确，就更难说服别人参与进来。尤其是这边目前每天的时间非常有限，更加难以与其他人同步状态。",[15,963,964],{"id":964},"原型",[11,966,967],{},"原型很重要，任何想法要首先完成Prototype来验证是否真的好玩。",[11,969,970],{},"由于平时程序的习惯太重了，会想着找出实现玩法需要做的工作，然后就开始推进了。由于平时不是很有时间，会演变成花了很多时间最后却不觉得玩法有趣的情况。",[11,972,973],{},"有的时候为了弥补沉没成本，会想着如何添加新的东西进去挽救下，导致情况越来越糟糕。",[11,975,976],{},"做原型的话，就只要把最核心的部分做出来就可以了。",[11,978,979],{},"验证玩法有趣再推进才是正确的做法。一些细节的部分，就算做出来了，如果玩法本身没有什么有趣的部分，最后就只是在浪费时间而已。",[11,981,982],{},"比如存檔系統，如果要在設計不明瞭的情況下，兼容所有情況的可恢復性的話，會變得很複雜。",[11,984,985],{},"对于优化也是一样，过度的优化是没有意义的。在原型完成，确定要继续推进之后再优化也不迟。组件的性能提升完全不是原型阶段应该关心的问题。系统架构、优化，都应该放到一边。",[15,987,988],{"id":988},"避免过度计划",[11,990,991],{},"不要追求完美的计划",[11,993,994],{},"产品是在不断的迭代中完成的。",[11,996,997],{},"犯的一个错误是：",[22,999,1000,1003],{},[11,1001,1002],{},"一直想要完成一个“完美”的脚本，而试图完成一个“完美”的大纲",[11,1004,1005],{},"但是，何为完美？当前在技术上是否有实现的可能性？这些都没有考虑。",[11,1007,1008],{},"实际开始做发现：应该先将基础的部分做好。然后在其基础上看是否需要优化表现。",[11,1010,1011],{},"在实际操作之前我们能考虑到的东西都是有偏颇的，尤其是产品本身连个影子都没有的时候。很多一开始考虑的东西到最后或许会变成过度设计。",[11,1013,1014],{},"所以或许计划需要完备，多考虑可能会失败的地方。但是计划不要完美，完美就是不考虑任何错漏的地方，那是不可能的。",[11,1016,1017],{},"实际做的时候会遇到的困难只有实际做的时候才会发现，计划时需要多保留余地，而不是追求完美。",[11,1019,1020],{},"实际操作后的感想：开始作之后发现需要解决的问题完全是不同方面的…………",[15,1022,1024],{"id":1023},"summary","Summary",[11,1026,1027],{},"其实这边是对缓存的笔记的重新合并，主要是为了梳理一下自己的思路。",[11,1029,1030],{},"因此前后可能没有逻辑关系。",{"title":47,"searchDepth":61,"depth":93,"links":1032},[1033,1037,1038,1039],{"id":899,"depth":61,"text":899,"children":1034},[1035,1036],{"id":930,"depth":93,"text":930},{"id":949,"depth":93,"text":949},{"id":964,"depth":61,"text":964},{"id":988,"depth":61,"text":988},{"id":1023,"depth":61,"text":1024},"2022-09-20",{"layout":165,"excerpt":1042},{"type":8,"value":1043},[1044],[11,1045,896],{},"\u002F2022-09-20-log-of-fail",{"title":891,"description":896},"_legacy\u002F2022\u002F2022-09-20-log-of-fail",[1050],"narrative","FzYUgYfJnnE98VaWxtjDFiVPOc-HWcClK9H22tuYyis",222,1788763176486]