[{"data":1,"prerenderedAt":1322},["ShallowReactive",2],{"blog-page-3":3,"blog-count":1321},[4,306,690,1137,1241],{"id":5,"title":6,"body":7,"date":287,"description":288,"extension":289,"meta":290,"navigation":299,"path":300,"seo":301,"stem":302,"tags":303,"__hash__":305},"blogs\u002F_legacy\u002F2022\u002F2022-09-19-note-storytelling-pixar-in-a-box.md"," 《Pixar in a box》笔记",{"type":8,"value":9,"toc":271},"minimark",[10,22,25,29,33,36,39,42,55,58,61,64,67,70,73,76,79,86,92,95,98,101,104,107,110,113,121,124,127,130,163,166,169,185,189,192,195,198,201,204,207,210,213,216,233,236,239,242,251,254,262,265,268],[11,12,13,14,21],"p",{},"可汗学院上Pixar工作室的",[15,16,20],"a",{"href":17,"rel":18},"https:\u002F\u002Fwww.khanacademy.org\u002Fhumanities\u002Fhass-storytelling\u002Fstorytelling-pixar-in-a-box",[19],"nofollow","storytelling-pixar-in-a-box","的笔记。",[11,23,24],{},"这个系列整体的介绍了Pixar的电影制作流程，当然也包含了叙事的部分。虽然叙事的方法论基本都有很多相通的部分，不过Pixar本身的工作流还是有很多值得参考的部分的。",[26,27,28],"h2",{"id":28},"我们都是故事讲述者",[30,31,32],"h3",{"id":32},"挖掘记忆",[11,34,35],{},"回想自己能够最先想到的鲜明的记忆。",[11,37,38],{},"思考下自己为什么能够立刻想到这个回忆，试着挖掘其中包含的情绪。",[11,40,41],{},"然后试着使用某种方式将这个记忆与情绪描述出来，可以采用以下的形式：",[43,44,45,49,52],"ul",{},[46,47,48],"li",{},"口述: 向某个你认识的人口述，看看是否能让听者感受到其中的情绪",[46,50,51],{},"写: 在至少一页内写出来，回忆的情绪是否通过文字传达出来了？",[46,53,54],{},"视觉: 仅使用线条与图形描绘出自己的回忆，看是否成功的传达了情绪",[30,56,57],{"id":57},"电影回忆",[11,59,60],{},"回忆自己最喜欢的三个电影。",[11,62,63],{},"思考自己为什么会喜欢各个电影，这几部电影之间是否有共通之处，又有什么不同的地方。",[30,65,66],{"id":66},"如果",[11,68,69],{},"就是常说的“神奇的如果”。",[30,71,72],{"id":72},"角色与世界",[11,74,75],{},"这个主要介绍了角色和故事世界的定义。",[26,77,78],{"id":78},"角色",[11,80,81,82],{},"这边介绍了个角色描写的测试",[83,84,85],"em",{},"The Elevator Test",[87,88,89],"blockquote",{},[11,90,91],{},"如果角色被困在了电梯中，ta会如何反应",[11,93,94],{},"这个建议看原始视频，对电梯测试表现的比较好。",[11,96,97],{},"角色的特征，可以分为外部特征和内部特征。内部特征主要指精神和性格上的。上面的电梯测试主要用于表现其内部特征。",[11,99,100],{},"角色的目标，这个似乎就是常说的外部目标和内部目标。不过这里面用的wants和needs。",[11,102,103],{},"wants，是角色以为自己想要的。",[11,105,106],{},"needs，是角色真正需要的。",[11,108,109],{},"角色有了行动的目标之后，故事中阻止角色达到目标的就是障碍。",[11,111,112],{},"而角色克服障碍达到自己的外部或者内部目标的过程，就是故事弧光。",[43,114,115,118],{},[46,116,117],{},"主角一开始的外部目标是什么?",[46,119,120],{},"故事最后主角发现自己真正需要的是什么?",[11,122,123],{},"赌注，应该是常说的“台面价值”。角色为了达到自己目标必须放弃什么。",[26,125,126],{"id":126},"故事结构",[11,128,129],{},"Pixar这边定义的故事结构最大的单位是Stroy Spine和Beats。",[87,131,132,135,160],{},[11,133,134],{},"Story Spine:",[136,137,138,141,144,147,150,152,154,157],"ol",{},[46,139,140],{},"Once upon a time...",[46,142,143],{},"Every day...",[46,145,146],{},"Until one day..",[46,148,149],{},"Because of that...",[46,151,149],{},[46,153,149],{},[46,155,156],{},"Until finally...",[46,158,159],{},"And ever since then...",[11,161,162],{},"The moral of the story is...",[11,164,165],{},"还是遵守比较经典的三幕结构。",[11,167,168],{},"主题，通常的情况下，角色发现自己真正的need的时候就是主题。",[11,170,171,172,176,177,180,181,184],{},"一些提到的术语也应当是与传统的叙事概念对应的：",[173,174,175],"strong",{},"want\u002Fgoal"," ，",[173,178,179],{},"point of no return","，",[173,182,183],{},"low point","。",[26,186,188],{"id":187},"visual-language","Visual language",[11,190,191],{},"比较偏向于美术方向。",[11,193,194],{},"线条",[11,196,197],{},"形状",[11,199,200],{},"空间",[11,202,203],{},"动作",[11,205,206],{},"色调(灰度,对比度)",[11,208,209],{},"颜色",[26,211,212],{"id":212},"电影语法",[11,214,215],{},"这个章节是关于故事结构的，是基于上面的Story Spine继续对故事进行实现。",[87,217,218,221,224,227,230],{},[11,219,220],{},"Major beats，这个就是对应前面Story Spine已有的几个节点",[11,222,223],{},"Sequnce，单个Major beats分解到一个或者多个scene",[11,225,226],{},"Scene，对应于某个时间和地点，角色在这里获得了新的转变",[11,228,229],{},"Minor beats，场景内的剧情节拍",[11,231,232],{},"Shots，对应剧情节拍中的一个分镜",[11,234,235],{},"这些划分对应的是具体的工作流中的节点，划分到Shot时，就是一个单一的分镜。",[11,237,238],{},"拆分到Shot之后，就开始使用简单的草稿来代表单个分镜。然后就可以对故事板进行迭代，废弃分镜、重组分镜等。",[11,240,241],{},"镜头按照摄像的远近有个简单的区分，具体选择在于甄别想要传达的内容和情感。",[11,243,244,245,250],{},"分镜构图比较常采用居中或者",[15,246,249],{"href":247,"rel":248},"https:\u002F\u002Fzh.wikipedia.org\u002Fwiki\u002F%E4%B8%89%E5%88%86%E6%B3%95_(%E6%A7%8B%E5%9C%96)",[19],"三分法","来进行。",[11,252,253],{},"Dynamic shots，主要指摄像采用跟随或者缩放等动态操作的情况。",[11,255,256,257,184],{},"分镜有一个更加详细的教学，在这里",[15,258,261],{"href":259,"rel":260},"https:\u002F\u002Fwww.khanacademy.org\u002Fcomputing\u002Fpixar\u002Fvirtual-camerashttps:\u002F\u002Fwww.khanacademy.org\u002Fcomputing\u002Fpixar\u002Fvirtual-cameras",[19],"Virtual Cameras",[26,263,264],{"id":264},"推销与反馈",[11,266,267],{},"在有了初版的故事板之后，就开始在团队内部互相展示自己的故事板。",[11,269,270],{},"似乎没有介绍什么详细的方法，感觉这和团队本身的工作方式相关，所以没有什么系统性的介绍。",{"title":272,"searchDepth":273,"depth":274,"links":275},"",2,3,[276,282,283,284,285,286],{"id":28,"depth":273,"text":28,"children":277},[278,279,280,281],{"id":32,"depth":274,"text":32},{"id":57,"depth":274,"text":57},{"id":66,"depth":274,"text":66},{"id":72,"depth":274,"text":72},{"id":78,"depth":273,"text":78},{"id":126,"depth":273,"text":126},{"id":187,"depth":273,"text":188},{"id":212,"depth":273,"text":212},{"id":264,"depth":273,"text":264},"2022-09-19","可汗学院上Pixar工作室的storytelling-pixar-in-a-box的笔记。","md",{"layout":291,"excerpt":292},"post",{"type":8,"value":293},[294],[11,295,13,296,21],{},[15,297,20],{"href":17,"rel":298},[19],true,"\u002F2022-09-19-note-storytelling-pixar-in-a-box",{"title":6,"description":288},"_legacy\u002F2022\u002F2022-09-19-note-storytelling-pixar-in-a-box",[304],"narrative","5lxixTWNwOGq4peEewUsnE_sWbQ9KahSZkd0WLrxM0c",{"id":307,"title":308,"body":309,"date":679,"description":313,"extension":289,"meta":680,"navigation":299,"path":685,"seo":686,"stem":687,"tags":688,"__hash__":689},"blogs\u002F_legacy\u002F2022\u002F2022-09-18-note-imagineering-in-a-box.md"," 《imagineering in a box》笔记",{"type":8,"value":310,"toc":652},[311,314,323,328,331,334,345,348,351,354,357,360,363,366,369,380,383,386,389,392,396,399,402,405,408,411,414,417,420,423,426,429,432,435,438,441,444,447,467,470,473,477,480,483,486,489,492,499,502,505,508,522,525,528,531,545,548,551,554,557,562,565,568,570,573,576,579,582,586,589,597,600,603,617,620,623,626,629,632,643,646,649],[11,312,313],{},"可汗学院的《imagineering in a box》的学习笔记。",[11,315,316,317,322],{},"这个系列的课程其实主要是介绍如何制作一个主题的公园的，原始的地址在",[15,318,321],{"href":319,"rel":320},"https:\u002F\u002Fwww.khanacademy.org\u002Fhumanities\u002Fhass-storytelling\u002Fimagineering-in-a-box\u002F",[19],"这里","。虽然有很多部分可能与游戏制作关联性不大，但是从如何提供一个叙事体验的角度来看的话，还是有一些值得参考的部分的。",[87,324,325],{},[11,326,327],{},"Note: 由于很多设计领域的词汇不在知识范围内，可能采用的是不正确的翻译。",[26,329,330],{"id":330},"叙事",[11,332,333],{},"主题公园的叙事与传统的电影叙事存在着一些不同点：",[136,335,336,339,342],{},[46,337,338],{},"叙事是基于各种感官的",[46,340,341],{},"无法进行线性叙事",[46,343,344],{},"观众具有自己的角色",[11,346,347],{},"想要自己制作主题公园的话，首先需要发散一些想法。比如说这是一个怎样的主题公园，其中发生的是什么样的故事，希望观众在其中体会到什么。",[30,349,350],{"id":350},"主题",[11,352,353],{},"主题公园与游乐园的不同在于，主题公园具有一个叙事性的主题。",[11,355,356],{},"故事是关于发生了什么的，而主题是这个故事是关于什么的。",[11,358,359],{},"‘Cars’, 生活是关于旅途而不是关于终点的",[11,361,362],{},"“Star Wars”, 希望的力量",[11,364,365],{},"“Avatar”, 对自己生活的世界的责任感",[11,367,368],{},"可以回想自己喜欢的故事，思考下",[43,370,371,374,377],{},[46,372,373],{},"如何用简单的语句来描述这个故事讲了什么?",[46,375,376],{},"这个故事想要传达的内容是什么?",[46,378,379],{},"故事结束后从中体会到了什么?",[26,381,382],{"id":382},"布局",[11,384,385],{},"整体的布局上，要考虑如何让观众呆在故事里面。由于观众可以自由的在主题公园内行走，所以需要考虑布局上如何引导观众。",[11,387,388],{},"建筑等的可信度：根据原始故事的不同，会对建筑物进行一定程度的缩放，并让公园的环境更加舒适一些。",[11,390,391],{},"另外，公园设施是会长期运营的，所以其中的建筑物也必须在制作时充分的考虑耐久度的问题。",[30,393,395],{"id":394},"landscape","Landscape",[11,397,398],{},"这个看视频的介绍，植物在布局上采用的是人造植物与真实植物混合的形式。",[11,400,401],{},"对于真实的植物，需要考虑其是否能够适应主题公园所在区域的气候。",[11,403,404],{},"机制设计上，使用巨大的树木，可以用来展示场景的历史感。",[11,406,407],{},"植物同时也用于控制观众的视野，方便引导观众的注意力。",[30,409,410],{"id":410},"材料",[11,412,413],{},"材料首先必须考虑的是耐久性，尤其是对于观众会频繁经过的地方，需要考虑使用损耗。",[11,415,416],{},"同时材料在选择的时候，需要考虑对声音的影响。包括场景本身期望的回声水平以及观众的脚步声等。",[30,418,419],{"id":419},"视觉设计",[11,421,422],{},"总体感觉上和游戏领域的环境叙事的原理差不多。",[11,424,425],{},"Ghost graphics, 留白，能够让观众产生联想的视觉设计，观众不一定会注意到。",[11,427,428],{},"Story graphics，与主线故事相关的视觉设计",[11,430,431],{},"Operational Graphics, 导航，指引等",[11,433,434],{},"主题公园一般以3~5种关键颜色进行设计，不过这个只是大概的氛围感，应该不能教条。",[30,436,437],{"id":437},"声音",[11,439,440],{},"声音可以很好的控制氛围和观众的感知，设计上需要考虑扬声器如何隐藏的放置，以及如何让声音被限定在特定的区域内。",[11,442,443],{},"除了使用指向性很强的扬声器设备外，还会在特定的地方采用能够吸收声音的材质，保证声音不会超出范围。",[11,445,446],{},"声音可以包括：",[43,448,449,455,461],{},[46,450,451,454],{},[173,452,453],{},"背景音"," (持续存在的环境音，如雨声或者海浪声)",[46,456,457,460],{},[173,458,459],{},"音乐"," (能够反映主题的音乐)",[46,462,463,466],{},[173,464,465],{},"音效"," (一些随机的音效，例如动物吼叫声或者雷鸣)",[30,468,469],{"id":469},"味道和气味",[11,471,472],{},"主要是指主题公园内的食物的设计，以及在各处的香精的埋设。",[30,474,476],{"id":475},"mood-board","Mood board",[11,478,479],{},"其实相当于一个缩略图，用于标识在各个景点期望向观众提供的总体氛围，方便规划。",[26,481,482],{"id":482},"设施",[11,484,485],{},"娱乐设施中需要设计的是，用于乘坐的载具系统。主题公园的搭乘系统不仅仅追求像过山车一样的刺激性，也需要符合主题叙事。",[11,487,488],{},"主题公园会有被称为Dark Ride的娱乐设施设计。在其中，光照和声音等是完全被设计好的。有时候也会加入一些交互性的桥段，让玩家能够有参与感。",[30,490,491],{"id":491},"概念设计",[11,493,494,495,498],{},"娱乐设施的概念设计最核心的部分，必须像",[173,496,497],{},"电梯演说","一样简短，例如: “在月球上骑自行车”",[11,500,501],{},"通常采用头脑风暴的形式，这里介绍了名为Blue sky phase的方法。",[11,503,504],{},"会将所有想到的方法都通过便签贴到一块头脑风暴的板子上，这样就可以方便的进行移动和添加。",[11,506,507],{},"一些建议:",[43,509,510,513,516,519],{},[46,511,512],{},"点子不分好坏",[46,514,515],{},"使用点子来构建点子",[46,517,518],{},"不要丢弃点子",[46,520,521],{},"放松下来，享受交流",[30,523,524],{"id":524},"故事设计",[11,526,527],{},"娱乐设施通常在3~4分钟内，所以需要对故事的结构和弧光进行设计。故事的冲突是什么，发生了什么改变，做出了什么样的选择。",[11,529,530],{},"通过头脑风暴完成娱乐设施内的节拍表：",[43,532,533,536,539,542],{},[46,534,535],{},"首先发生了什么…. (场景 1)",[46,537,538],{},"然后是… (场景 2)",[46,540,541],{},"然后是… (场景 3)",[46,543,544],{},"最后发生了什么… (场景 4)",[11,546,547],{},"有了粗略的想法后可以简单的描绘下贴到板子上，要留意由于会经常的修改，不需要画的非常好。",[11,549,550],{},"有了故事的初步设计后，可以通过向其他人介绍自己的故事来获取反馈，对故事进行修正。",[30,552,553],{"id":553},"载客容量",[11,555,556],{},"需要在设计时考虑娱乐设施的载客量，一个娱乐设施一小时的载客量为：",[87,558,559],{},[11,560,561],{},"载客量 = 单个载具的容量 x 发车间隔",[30,563,564],{"id":564},"模型",[11,566,567],{},"一开始做简单的模型来观察效果，之后可以制作更加精细的模型来辅助色彩、光照等的详细设计。",[26,569,78],{"id":78},[11,571,572],{},"角色会与观众进行交互，必须让其可信。这里面主要介绍的不是负责角色扮演的真人，而是用于表演的机械角色。",[30,574,575],{"id":575},"衣服",[11,577,578],{},"衣服的设计本身与传统的角色设计差不多。",[11,580,581],{},"不过角色的衣服还需要决定使用不同的布料进行制作。这边不是美术就没有详细的纠结了。",[30,583,585],{"id":584},"character-sheet","Character sheet",[11,587,588],{},"这个是用于制定角色的工具表。",[87,590,591,594],{},[11,592,593],{},"核心姿态：能够表现角色的关键姿态",[11,595,596],{},"表情：角色的各种表情",[11,598,599],{},"感觉上总体和一般的动画的人设图差不多。",[11,601,602],{},"自制指南：",[43,604,605,608,611,614],{},[46,606,607],{},"简单的绘制一个或多个关键姿态",[46,609,610],{},"绘制角色的一些动作下的姿态",[46,612,613],{},"用一两个句子来描述角色的性格",[46,615,616],{},"用一两个句子简述角色背后的故事",[26,618,619],{"id":619},"机器人",[11,621,622],{},"主要是主题公园内非工作人员扮演的，与观众进行交互的各种机器人。",[11,624,625],{},"在设计阶段，会使用一些简单的材料来制作原型",[30,627,628],{"id":628},"动力",[11,630,631],{},"动力上总共有三种",[43,633,634,637,640],{},[46,635,636],{},"气压动力",[46,638,639],{},"液体动力",[46,641,642],{},"电机",[11,644,645],{},"液体动力的力量比较大，可以用于驱动大型的物体或是快速动作。电机的控制会非常精细。",[30,647,648],{"id":648},"控制",[11,650,651],{},"一些简单的角色是使用预先编制好的动作序列来进行的，也有更加复杂的自动化角色，通过传感器的数据进行控制。近年也有在引入基于深度学习的控制，可以更好的与观众进行交互，更加具有真实感。",{"title":272,"searchDepth":273,"depth":274,"links":653},[654,657,665,671,675],{"id":330,"depth":273,"text":330,"children":655},[656],{"id":350,"depth":274,"text":350},{"id":382,"depth":273,"text":382,"children":658},[659,660,661,662,663,664],{"id":394,"depth":274,"text":395},{"id":410,"depth":274,"text":410},{"id":419,"depth":274,"text":419},{"id":437,"depth":274,"text":437},{"id":469,"depth":274,"text":469},{"id":475,"depth":274,"text":476},{"id":482,"depth":273,"text":482,"children":666},[667,668,669,670],{"id":491,"depth":274,"text":491},{"id":524,"depth":274,"text":524},{"id":553,"depth":274,"text":553},{"id":564,"depth":274,"text":564},{"id":78,"depth":273,"text":78,"children":672},[673,674],{"id":575,"depth":274,"text":575},{"id":584,"depth":274,"text":585},{"id":619,"depth":273,"text":619,"children":676},[677,678],{"id":628,"depth":274,"text":628},{"id":648,"depth":274,"text":648},"2022-09-18",{"layout":291,"excerpt":681},{"type":8,"value":682},[683],[11,684,313],{},"\u002F2022-09-18-note-imagineering-in-a-box",{"title":308,"description":313},"_legacy\u002F2022\u002F2022-09-18-note-imagineering-in-a-box",[304],"IBVtH_koZEgiKG5ZLXehN6W_kG4d_qVaEHao0W4VIB8",{"id":691,"title":692,"body":693,"date":1125,"description":697,"extension":289,"meta":1126,"navigation":299,"path":1131,"seo":1132,"stem":1133,"tags":1134,"__hash__":1136},"blogs\u002F_legacy\u002F2022\u002F2022-08-15-ue5-enhanced-input.md"," UE5 Enhanced input",{"type":8,"value":694,"toc":1117},[695,698,701,704,718,730,733,736,739,742,753,759,762,765,768,785,788,791,795,802,805,1033,1039,1043,1046,1058,1061,1071,1076,1079,1086,1089,1094,1097,1102,1107,1110,1113],[11,696,697],{},"最近看Lyra的代码，发现有个新的Enhanced Input系统，稍微看了下。",[11,699,700],{},"当前使用的UE5版本为5.0.3。",[11,702,703],{},"这个系统目前还在实验性阶段，但是看起来官方似乎挺想推的。",[11,705,706,711,712,717],{},[15,707,710],{"href":708,"rel":709},"https:\u002F\u002Fdocs.unrealengine.com\u002F4.27\u002Fen-US\u002FInteractiveExperiences\u002FInput\u002FEnhancedInput\u002F",[19],"官方文档","和社区的",[15,713,716],{"href":714,"rel":715},"https:\u002F\u002Fdev.epicgames.com\u002Fcommunity\u002Flearning\u002Ftutorials\u002FaqrD\u002Funreal-engine-enhanced-input-binding-with-gameplay-tags-c",[19],"使用教程","都有比较详尽的描述。",[11,719,720,721,725,726,729],{},"虽然看起来这个系统是为",[722,723,724],"code",{},"GameAbilitySystem","而设计的，且教程那边也用到了",[722,727,728],{},"GamePlayTags","。但是实际上这个系统本身并不强制的使用这两个东西。",[26,731,732],{"id":732},"简单使用",[11,734,735],{},"基础的配置当然还是要按照官方的来，需要打开插件，然后将输入系统配置到Enhanced Input。",[11,737,738],{},"其实这个系统主要就是将原本只能在项目配置中定义的输入传递给资产化了，方便动态绑定。",[11,740,741],{},"原本在UE4的时候我们要实现动态绑定需要自己做一层中继，现在只是官方给出了可以方便进行动态绑定的部分而已。",[11,743,744,745,748,749,752],{},"核心的部分是",[722,746,747],{},"UInputAction","与",[722,750,751],{},"Input Mapping Contexts","，这两个的使用可以参照上面给出的第二个链接。",[11,754,755,756,758],{},"只不过",[722,757,747],{},"可以直接配置，不需要硬性使用GAS那一套东西。感觉最大的好处是方便项目之间迁移，之前迁移一些逻辑后会发现输入配置对不上。有的时候要到代码和蓝图里面找逻辑中原本绑定的输入到底是什么。输入的配置资产化之后就可以连输入部分一起迁移了。",[11,760,761],{},"当然，有一个官方的动态输入绑定方案自然会方便很多。",[30,763,764],{"id":764},"输入类型",[11,766,767],{},"这里面个人在测试的时候遗漏了一个地方，就是移动方向这些输入需要修改为Axis2D",[136,769,770,773,776,779,782],{},[46,771,772],{},"IA_Fire - ValueType(bool), Triggers(Pressed), Modifiers(None)",[46,774,775],{},"IA_Jump - ValueType(bool), Triggers(Pressed ), Modifiers(None) ",[46,777,778],{},"IA_Move - ValueType(Axis2D), Triggers(None ), Modifiers(None ) ",[46,780,781],{},"IA_MouseLook - ValueType(Axis2D), Triggers(None), Modifiers(Negate - Y axis) ",[46,783,784],{},"IA_StickLook - ValueType(Axis2D ), Triggers(None), Modifiers(None)",[11,786,787],{},"如果这里漏掉的话，之后做输入转换的一些2维的操作其实是会失败的。",[11,789,790],{},"表现上会变成只能左右移动无法上下移动，由于原文只有这里没有截图，当时跳过去了。",[30,792,794],{"id":793},"modifier自定义","Modifier自定义",[11,796,797,798,801],{},"修改器虽然可以自定义，但是其实默认的基本够用了。不过需要的时候可以尝试下，很简单的。直接参考引擎的内部实现，继承下",[722,799,800],{},"UInputModifier","就好了。",[11,803,804],{},"需要注意的是InputAction的类型是无法修改的，看引擎的这里：",[806,807,811],"pre",{"className":808,"code":809,"language":810,"meta":272,"style":272},"language-cpp shiki shiki-themes github-light-high-contrast github-dark monokai","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","cpp",[722,812,813,884,889,897,903,918,934,940,949,955,962,1006,1012,1018,1027],{"__ignoreMap":272},[814,815,818,822,825,829,833,836,840,843,846,848,851,854,857,861,864,866,869,871,875,878,881],"span",{"class":816,"line":817},"line",1,[814,819,821],{"class":820},"sfUV7","FInputActionValue",[814,823,824],{"class":820}," UEnhancedPlayerInput",[814,826,828],{"class":827},"s0idv","::",[814,830,832],{"class":831},"scAT4","ApplyModifiers",[814,834,835],{"class":827},"(",[814,837,839],{"class":838},"sLXdl","const",[814,841,842],{"class":820}," TArray",[814,844,845],{"class":827},"\u003C",[814,847,800],{"class":820},[814,849,850],{"class":838},"*",[814,852,853],{"class":827},">",[814,855,856],{"class":838},"&",[814,858,860],{"class":859},"sbfHu"," Modifiers",[814,862,863],{"class":827},", ",[814,865,821],{"class":820},[814,867,868],{"class":859}," RawValue",[814,870,863],{"class":827},[814,872,874],{"class":873},"sGZGq","float",[814,876,877],{"class":859}," DeltaTime",[814,879,880],{"class":827},") ",[814,882,883],{"class":838},"const\n",[814,885,886],{"class":816,"line":273},[814,887,888],{"class":827},"{\n",[814,890,891,894],{"class":816,"line":274},[814,892,893],{"class":831},"    TRACE_CPUPROFILER_EVENT_SCOPE",[814,895,896],{"class":827},"(EnhPIS_Modifiers);\n",[814,898,900],{"class":816,"line":899},4,[814,901,902],{"emptyLinePlaceholder":299},"\n",[814,904,906,909,912,915],{"class":816,"line":905},5,[814,907,908],{"class":820},"    FInputActionValue",[814,910,911],{"class":827}," ModifiedValue ",[814,913,914],{"class":838},"=",[814,916,917],{"class":827}," RawValue;\n",[814,919,921,924,927,929,931],{"class":816,"line":920},6,[814,922,923],{"class":838},"    for",[814,925,926],{"class":827}," (",[814,928,800],{"class":820},[814,930,850],{"class":838},[814,932,933],{"class":827}," Modifier : Modifiers)\n",[814,935,937],{"class":816,"line":936},7,[814,938,939],{"class":827},"    {\n",[814,941,943,946],{"class":816,"line":942},8,[814,944,945],{"class":838},"        if",[814,947,948],{"class":827}," (Modifier)\n",[814,950,952],{"class":816,"line":951},9,[814,953,954],{"class":827},"        {\n",[814,956,958],{"class":816,"line":957},10,[814,959,961],{"class":960},"sZdD5","            \u002F\u002F Enforce that type is kept to RawValue type between modifiers.\n",[814,963,965,968,970,973,976,979,982,985,987,991,994,996,998,1001,1003],{"class":816,"line":964},11,[814,966,967],{"class":827},"            ModifiedValue ",[814,969,914],{"class":838},[814,971,972],{"class":831}," FInputActionValue",[814,974,975],{"class":827},"(RawValue.",[814,977,978],{"class":831},"GetValueType",[814,980,981],{"class":827},"(), Modifier->",[814,983,984],{"class":831},"ModifyRaw",[814,986,835],{"class":827},[814,988,990],{"class":989},"s4Wjf","this",[814,992,993],{"class":827},", ModifiedValue, DeltaTime).Get",[814,995,845],{"class":838},[814,997,821],{"class":820},[814,999,1000],{"class":827},"::Axis3D",[814,1002,853],{"class":838},[814,1004,1005],{"class":827},"());\n",[814,1007,1009],{"class":816,"line":1008},12,[814,1010,1011],{"class":827},"        }\n",[814,1013,1015],{"class":816,"line":1014},13,[814,1016,1017],{"class":827},"    }\n",[814,1019,1021,1024],{"class":816,"line":1020},14,[814,1022,1023],{"class":838},"    return",[814,1025,1026],{"class":827}," ModifiedValue;\n",[814,1028,1030],{"class":816,"line":1029},15,[814,1031,1032],{"class":827},"}\n",[11,1034,1035,1036,184],{},"就算在修改器里面改了，在这里也会被设置回到",[722,1037,1038],{},"RawValue.GetValueType()",[26,1040,1042],{"id":1041},"commonui问题","CommonUI问题",[11,1044,1045],{},"CommonUI这边有一个全局的Action绑定，但是配置好之后使用的过程中总是会报错。",[87,1047,1048],{},[11,1049,1050,1051,1054,1055,1057],{},"\"Cannot\nbind widget ",[814,1052,1053],{},"%s"," to action ",[814,1056,1053],{}," - provided tag does not map to an existing UI\ninput action. It can be added under Project Settings->UI Input.",[11,1059,1060],{},"排查了下原因，感觉是实验性阶段的BUG。主要的问题来源是：",[11,1062,1063,1066,1067,1070],{},[722,1064,1065],{},"UCommonUIInputSettings","的加载时机要早于",[722,1068,1069],{},"FGlobalUITags","的标签加载时机",[87,1072,1073],{},[11,1074,1075],{},"UGameplayTagsManager::OnLastChanceToAddNativeTags",[11,1077,1078],{},"导致在配置加载的时候没有读取到Tag，最后绑定的时候就错了。",[11,1080,1081,1082,1085],{},"倒腾了下没发现好的直接修正的方式，只能通过自己定义Tag的方式来绕过。自己定义Tag可以选择直接在项目配置里面加。如果一时之间找不到配置的位置，在项目配置里面搜索",[722,1083,1084],{},"gameplay tags","即可。",[11,1087,1088],{},"或者在代码中快速定义：",[87,1090,1091],{},[11,1092,1093],{},"UE_DEFINE_GAMEPLAY_TAG_STATIC(Tag_CUSTOM_SETTINGS_INPUT_ACTION_Cancel, \"UI.Action.Css.Cancel\");",[11,1095,1096],{},"也可以通过.h与.cpp中分别定义来方便别的类能够取到",[87,1098,1099],{},[11,1100,1101],{},"UE_DECLARE_GAMEPLAY_TAG_EXTERN(Tag_CUSTOM_SETTINGS_INPUT_ACTION_Confrim);",[87,1103,1104],{},[11,1105,1106],{},"UE_DEFINE_GAMEPLAY_TAG(Tag_CUSTOM_SETTINGS_INPUT_ACTION_Confrim, \"UI.Action.Css.Confirm\")",[26,1108,1109],{"id":1109},"总结",[11,1111,1112],{},"总体而言感觉新系统的意义不是很大，如果项目中已有完整的输入管理逻辑的话，没有必要迁移。可能对新项目可以考虑下……",[1114,1115,1116],"style",{},"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":272,"searchDepth":273,"depth":274,"links":1118},[1119,1123,1124],{"id":732,"depth":273,"text":732,"children":1120},[1121,1122],{"id":764,"depth":274,"text":764},{"id":793,"depth":274,"text":794},{"id":1041,"depth":273,"text":1042},{"id":1109,"depth":273,"text":1109},"2022-08-15",{"layout":291,"excerpt":1127},{"type":8,"value":1128},[1129],[11,1130,697],{},"\u002F2022-08-15-ue5-enhanced-input",{"title":692,"description":697},"_legacy\u002F2022\u002F2022-08-15-ue5-enhanced-input",[1135],"UE5","14nYQPYf3R6xkEirhewjHWl0UU3aYeXZM60t9GxwqAc",{"id":1138,"title":1139,"body":1140,"date":1230,"description":1144,"extension":289,"meta":1231,"navigation":299,"path":1236,"seo":1237,"stem":1238,"tags":1239,"__hash__":1240},"blogs\u002F_legacy\u002F2022\u002F2022-07-22-ue5-simplify.md"," UE5原型项目配置精简",{"type":8,"value":1141,"toc":1226},[1142,1145,1148,1151,1156,1159,1162,1165,1171,1174,1179,1182,1187,1190,1195,1198,1201,1206,1209,1212,1215,1220,1223],[11,1143,1144],{},"虚幻引擎这次升级之后感觉对小型游戏开发有些不友好，最大的问题就是默认的空地图掉帧掉到怀疑人生。",[11,1146,1147],{},"当前使用的UE5版本为5.0.2。",[11,1149,1150],{},"虽然有考虑换个引擎，但是实在是没有足够的时间，于是选择看看能不能把一些自己用不到的功能给关掉。",[87,1152,1153],{},[11,1154,1155],{},"注意： 本文主要针对Demo\u002FPrototype制作的情况，有些功能可能最后实际发布的时候还是会希望打开。",[11,1157,1158],{},"感觉这个其实官方提供一个最小化的默认项目就可以解决了，不知道是否UE5的开发太急了所以没有留意到非主流用户的需求……",[26,1160,1161],{"id":1161},"渲染相关",[11,1163,1164],{},"这个反射，从Lumn换到屏幕空间",[11,1166,1167],{},[1168,1169],"img",{"alt":272,"src":1170},"\u002Fimages\u002Fue5-simplify\u002F2022-07-25-21-57-17-image.png",[11,1172,1173],{},"这个关掉，效果很好",[11,1175,1176],{},[1168,1177],{"alt":272,"src":1178},"\u002Fimages\u002Fue5-simplify\u002F2022-07-25-21-57-39-image.png",[11,1180,1181],{},"抗锯齿也改回TAA",[11,1183,1184],{},[1168,1185],{"alt":272,"src":1186},"\u002Fimages\u002Fue5-simplify\u002F2022-07-25-21-58-05-image.png",[11,1188,1189],{},"还有这个阴影相关的，不知道为什么在编辑器里面没问题，打包之后就很耗……",[11,1191,1192],{},[1168,1193],{"alt":272,"src":1194},"\u002Fimages\u002Fue5-simplify\u002F2022-07-25-21-58-23-image.png",[26,1196,1197],{"id":1197},"打包相关",[11,1199,1200],{},"空项目打包就很大，发现有个插件对于小型游戏应该不会用到却默认打包进去了：",[11,1202,1203],{},[1168,1204],{"alt":272,"src":1205},"\u002Fimages\u002Fue5-simplify\u002F2022-07-25-21-55-47-image.png",[11,1207,1208],{},"OpenImageDenoice这个，应该是RayTrace才会需要的功能。",[11,1210,1211],{},"另外就是打包后默认是全屏的，不是很确定是否是本地环境问题。默认直接2K分辨率全屏，根本带不动……",[11,1213,1214],{},"切换到默认窗口，1600x900，默认的空地图才能勉强到60fps。关掉",[87,1216,1217],{},[11,1218,1219],{},"r.AmbientOcclusionLevels 0",[11,1221,1222],{},"之后，才稳定到60帧……",[11,1224,1225],{},"总之先这样用吧。",{"title":272,"searchDepth":273,"depth":274,"links":1227},[1228,1229],{"id":1161,"depth":273,"text":1161},{"id":1197,"depth":273,"text":1197},"2022-07-22",{"layout":291,"excerpt":1232},{"type":8,"value":1233},[1234],[11,1235,1144],{},"\u002F2022-07-22-ue5-simplify",{"title":1139,"description":1144},"_legacy\u002F2022\u002F2022-07-22-ue5-simplify",[1135],"hTLep6kDjv-CXlBVk5Eid4t_NIJKpaEFuz0KuGExA5c",{"id":1242,"title":1243,"body":1244,"date":1309,"description":1248,"extension":289,"meta":1310,"navigation":299,"path":1316,"seo":1317,"stem":1318,"tags":1319,"__hash__":1320},"blogs\u002F_legacy\u002F2022\u002F2022-04-26-full-site-go-static-now.md","全站静态化迁移完成",{"type":8,"value":1245,"toc":1305},[1246,1249,1252,1255,1258,1262,1265,1268,1271,1274,1277,1280,1283,1286,1289,1296,1299,1302],[11,1247,1248],{},"最近几天把博客从wordpress迁移到了静态的Jekyll，然后部署到了Github.io上。",[11,1250,1251],{},"其实本身博客这边已经很久没有更新了，最主要的原因是没有足够的时间。",[11,1253,1254],{},"总是没法静下心来写些东西，技术方面的东西，想要整理的完善一些也非常的花时间。",[11,1256,1257],{},"一来二去就没有动笔了。",[26,1259,1261],{"id":1260},"wordpress的痛点","Wordpress的痛点",[11,1263,1264],{},"要维护一个wordpress的网站需要花费很多精神，虽然挂在一些wordpress托管商那里是一个较为省心的选项。但是通常托管商的定制性不足，而且提供的服务不稳定。所以后期主要是挂在VPS上自己搭建Lnmp环境。",[11,1266,1267],{},"自己架设VPS会带来很多维护上的成本，需要不时的维护HTTPS签名，监控服务器状态……而且由于各种原因，有时候还要玩捉迷藏。",[11,1269,1270],{},"有时候好不容易有些时间，却总是花费到了写作之外的地方。",[11,1272,1273],{},"所以干脆迁移到Jekyll上，这样可以专注在写作上。",[11,1275,1276],{},"虽然也有可能还是什么都写不出来……",[26,1278,1279],{"id":1279},"现状和打算",[11,1281,1282],{},"架设在Github.io上其实网站本身的响应速度还是挺快的，但是也有一些小问题。",[11,1284,1285],{},"最主要的是，还是会有捉迷藏的问题。在某些网络环境下，就是无法访问到这边。",[11,1287,1288],{},"这点基本上放弃了，虽然也有迁移到Amazon S3上去的选择，但是本质上还是有可能会陷入不断切换IP的老路。",[11,1290,1291,1292,1295],{},"目前的原则是：",[173,1293,1294],{},"不折腾","。因此，短时间内就放在这里了。",[11,1297,1298],{},"另一方面，是评论的问题。",[11,1300,1301],{},"博客至今基本都开着评论，不过并没有很多有效的交流。相信很多读者和我一样，查到资料解决完问题就足够了。毕竟博客并不是一个实时的平台，在时空的阻隔之间喊话实在难以产生火花。",[11,1303,1304],{},"因此，虽然Jekyll也有一些提供评论功能的方案，暂时并不打算去折腾。",{"title":272,"searchDepth":273,"depth":274,"links":1306},[1307,1308],{"id":1260,"depth":273,"text":1261},{"id":1279,"depth":273,"text":1279},"2022-04-26",{"layout":291,"status":1311,"published":299,"excerpt":1312},"publish",{"type":8,"value":1313},[1314],[11,1315,1248],{},"\u002F2022-04-26-full-site-go-static-now",{"title":1243,"description":1248},"_legacy\u002F2022\u002F2022-04-26-full-site-go-static-now",[],"vwcOczb1KUjzff2lOb7pPXW20ezKsqjPodqxl8jK0IE",222,1788763176486]