[{"data":1,"prerenderedAt":365},["ShallowReactive",2],{"\u002F2021-01-24-unreal-fest-trials-of-mana-3-note":3},{"id":4,"title":5,"body":6,"date":341,"description":12,"extension":342,"meta":343,"navigation":346,"path":358,"seo":359,"stem":360,"tags":361,"__hash__":364},"blogs\u002F_legacy\u002F2021\u002F2021-01-24-unreal-fest-trials-of-mana-3-note.md","UE4-Fest-圣剑传说3笔记",{"type":7,"value":8,"toc":319},"minimark",[9,13,22,29,32,35,39,42,45,49,52,59,62,68,71,75,78,84,87,95,98,101,104,107,110,113,116,119,122,125,133,139,142,151,154,157,160,163,166,169,172,175,183,186,189,192,198,202,205,211,214,217,220,223,229,232,236,239,242,251,259,262,265,268,278,281,284,287,290,294,297,300,303,307,310,313,316],[10,11,12],"p",{},"UEFest2020的圣剑传说3的分享",[10,14,15,16],{},"PPT参考的这里：",[17,18,19],"a",{"href":19,"rel":20},"https:\u002F\u002Fwww.slideshare.net\u002FEpicGamesJapan\u002Funreal-festext2020winter-xeen",[21],"nofollow",[10,23,24,25],{},"后面才发现有原始视频：",[17,26,27],{"href":27,"rel":28},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=NHZRn4OHa1g",[21],[10,30,31],{},"最终使用引擎版本4.22.3",[10,33,34],{},"渲染方面没有使用任何引擎改造，全部使用引擎标准机能实现。",[36,37,38],"h2",{"id":38},"角色",[10,40,41],{},"美术上的参考主要有：原作的像素风格、插画。以及本作的插画。",[10,43,44],{},"从中寻找共通的魅力，以手绘的风格为目标进行制作。",[46,47,48],"h3",{"id":48},"轮廓线",[10,50,51],{},"轮廓线使用PostProcess来制作。",[10,53,54],{},[55,56],"img",{"alt":57,"src":58},"image-20210117185504080","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117185504080_thumb.png",[10,60,61],{},"使用深度数据比较的方法来计算轮廓线，对于深度差别不大的地方，会并用Detail normal map进行角度比较，抽出轮廓线数据。",[10,63,64],{},[55,65],{"alt":66,"src":67},"image-20210117185821442","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117185821442_thumb.png",[10,69,70],{},"轮廓线的粗细使用World normal进行Mask来控制。",[46,72,74],{"id":73},"shading","Shading",[10,76,77],{},"使用NPR渲染，作为特征的Specular和阴影是在材质中实现的。",[10,79,80],{},[55,81],{"alt":82,"src":83},"image-20210117190629938","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117190629938_thumb.png",[10,85,86],{},"阴影的部分使用了两种颜色的阶调来进行实现，在计算的时候使用Rim进行遮罩，就能在原本的颜色上表现出RimLight的感觉。在对边界和背光进行表现时能够起作用。（这部分不是很确定是不是理解正确了……）",[10,88,89,90,94],{},"法线贴图在制作时会在Photoshop中使用滤镜来实现最终渲染时类似笔触的画风，这个应该和",[17,91,93],{"href":92},"\u002F2021-01-24-cedec-2016-sfv-note\u002F","街霸5的分享","里面提到的操作方法类似。但是使用的滤镜没有明确说明。",[46,96,97],{"id":97},"光照",[10,99,100],{},"在地图中使用一个Stationary的直射光作为天光来使用，其他的光照基本上都是static light。",[10,102,103],{},"对于每一个关卡，都有一个曲线来控制24小时的光照。",[46,105,106],{"id":106},"菜单画面",[10,108,109],{},"游戏中的菜单画面没有使用RenderTarget，而是直接进行3D绘制。",[10,111,112],{},"主要原因是开发时出于抗锯齿、处理负荷等因素，以及无法准备高分辨率的贴图等原因。",[10,114,115],{},"这样直接绘制的问题是，场景内的光照因素会反映到菜单画面来。",[10,117,118],{},"处理的方法是，首先使用light channel来避免被场景中的光达到。",[10,120,121],{},"同时从PostProcess中关闭GI的影响。",[10,123,124],{},"最后将r.SkyLightingQuality置为0。",[10,126,127,128,132],{},"消除掉环境的影响后，使用",[129,130,131],"strong",{},"Ambient Cubemaps","来添加光照。",[10,134,135],{},[55,136],{"alt":137,"src":138},"image-20210117195359304","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117195359304_thumb.png",[46,140,141],{"id":141},"动态装饰物体",[10,143,144,145,150],{},"混合使用了",[17,146,149],{"href":147,"rel":148},"https:\u002F\u002Fgithub.com\u002Fpafuhana1213\u002FKawaiiPhysics",[21],"KawaiiPhysics","与AnimDynamics。",[10,152,153],{},"使用KawaiiPhysics是因为其设置简单，动作起来很萌。",[10,155,156],{},"开发初期使用的是PhysicsAsset，由于初期性能优化不好，在帧率下降时，出现了穿模等一系列物理模拟不准确的问题，在各个平台上进行运行测试后，判断要使用需要花费的成本过高。",[10,158,159],{},"于是中期就切换到了AnimDynamics，虽然比PhysicsAsset要安定许多，但是在性能下降时还是会出现穿模的现象。为了达到理想的效果，进行了很多试错……",[10,161,162],{},"在开发终盘，性能已经稳定下来了。再次对PhysicsAsset进行验证，发现在帧率下降时还是会有穿模现象，同时从AnimDnamic切换过去会花费额外的成本，放弃使用了。",[10,164,165],{},"最后发现了KawaiiPhysics，KawaiiPhysics本身在帧率下降后的表现依然很稳定，很少发生穿模，形状出现问题的情况也必须少。与现存的AnimDynamic可以并用，替换的成本也较低，在终盘也能安定的进行。",[36,167,168],{"id":168},"程序编制",[46,170,171],{"id":171},"过场动画",[10,173,174],{},"圣剑传说3在游戏过程中，需要从6个主要角色中选择3个人来进行游戏。可组合的方式导致过场动画制作起来有不少的难度。在有的场景中，由于所选的角色组合不同，所播放的内容会有很大不同。",[10,176,177,178,182],{},"对应方法是，在",[179,180,181],"em",{},"Sequencer","中使用一个专用的共通Actor来进行表演的设置，在游戏运行时。则将对应的角色替换到这个共通Actor中。这样就能让队伍的角色成员反映出来，也能保持玩家所携带的装备。",[10,184,185],{},"为了实现这一点，所有的角色都会采用一样的命名规范。在进行Sequencer播放时，会由代码按照规则取出对应角色的对应动画。各个角色的动画会通过转换器进行自动收集并输入到csv文件中，最终在UE4中加载成为DataTable。",[10,187,188],{},"语音台词和LipSync动画也遵循类似的规则进行取出。",[10,190,191],{},"动画在设置上，分为身体、眉毛、眼睛和嘴巴四个层次进行控制。",[10,193,194],{},[55,195],{"alt":196,"src":197},"image-20210117204320733","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117204320733_thumb.png",[46,199,201],{"id":200},"event","Event",[10,203,204],{},"有的时候，对于特定的组合而言，需要额外的播放一些场景。此时会对当前的角色进行判定，来决定是否播放特定的子动画。",[10,206,207],{},[55,208],{"alt":209,"src":210},"image-20210117204241149","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117204241149_thumb.png",[46,212,213],{"id":213},"视线和头的朝向",[10,215,216],{},"分为角度型和目标指定型的LookAt两种。",[10,218,219],{},"但是主角色的眼球大小会有所不同，所以需要设定眼睛的可达角度限制，在实际运行时进行控制。",[10,221,222],{},"由于各个角色的身高不同，所以根据角色的不同会使用不同的摄像。在Sequencer中会提供不同的角色的相机位置设置，可以在运行时进行取出。",[10,224,225],{},[55,226],{"alt":227,"src":228},"image-20210117205036407","\u002Fwp-content\u002Fuploads\u002F2021\u002F01\u002Fimage-20210117205036407_thumb.png",[10,230,231],{},"似乎会通过代码进行CameraTrack的实时替换。",[46,233,235],{"id":234},"lipsync","LipSync",[10,237,238],{},"语音对应了日语和英语两种，分别有相应的LipSync数据。",[10,240,241],{},"规则上，要求台词的文本ID与语音的文件名一致。",[10,243,244,245,250],{},"使用SE的",[17,246,249],{"href":247,"rel":248},"https:\u002F\u002Fcedil.cesa.or.jp\u002Fcedil_sessions\u002Fview\u002F1742",[21],"Byblos","进行文本的管理。",[10,252,253,254,258],{},"LipSync使用了Oculus的OVRLipSync进行录制，参考这个",[17,255,256],{"href":256,"rel":257},"https:\u002F\u002Fpafuhana1213.hatenablog.com\u002Fentry\u002F2018\u002F11\u002F26\u002F011057",[21],"。",[10,260,261],{},"对于录制的LipSync数据，必要的话会手工进行调整。",[10,263,264],{},"流程上，同样是使用转换器收集成csv并导入到UE4成为DataTable。",[10,266,267],{},"运行时在场景中生成时，由台词的文本显示同步触发：",[269,270,271,275],"ul",{},[272,273,274],"li",{},"同名的语音文件播放",[272,276,277],{},"在对应的角色上播放LipSync动画",[36,279,280],{"id":280},"其他",[10,282,283],{},"避免使用资源的硬链接",[10,285,286],{},"使用Interface在设计上避免耦合。",[10,288,289],{},"蓝图C++化，由于游戏逻辑9成使用的都是蓝图，实际处理时风险过大。最后只将一部分比较重的逻辑移植到了C++中。",[46,291,293],{"id":292},"削减load时间比较有效的方法","削减Load时间比较有效的方法",[10,295,296],{},"玩家相关、特效相关、SE相关的常驻处理",[10,298,299],{},"Widget、图标贴图事先进行Cache缓存",[10,301,302],{},"防止不必要的资源进入地图",[46,304,306],{"id":305},"对于cpu性能改善比较有效的方法","对于CPU性能改善比较有效的方法",[10,308,309],{},"尽可能的关掉Tick，在新建项目的时候一起关掉，只有必要的Actor才Tick",[10,311,312],{},"复杂的处理果然还是放到C++里面比较快",[10,314,315],{},"PGO(Profile Guided Optimization)，利用游戏中的Profile结果进行最优化处理",[10,317,318],{},"URO(Enable Update Rate Optimizations)，对远离摄像的动画更新进行降频",{"title":320,"searchDepth":321,"depth":322,"links":323},"",2,3,[324,331,337],{"id":38,"depth":321,"text":38,"children":325},[326,327,328,329,330],{"id":48,"depth":322,"text":48},{"id":73,"depth":322,"text":74},{"id":97,"depth":322,"text":97},{"id":106,"depth":322,"text":106},{"id":141,"depth":322,"text":141},{"id":168,"depth":321,"text":168,"children":332},[333,334,335,336],{"id":171,"depth":322,"text":171},{"id":200,"depth":322,"text":201},{"id":213,"depth":322,"text":213},{"id":234,"depth":322,"text":235},{"id":280,"depth":321,"text":280,"children":338},[339,340],{"id":292,"depth":322,"text":293},{"id":305,"depth":322,"text":306},"2021-01-24","md",{"layout":344,"status":345,"published":346,"author":347,"author_login":349,"author_email":350,"wordpress_id":351,"wordpress_url":352,"date_gmt":353,"excerpt":354},"post","publish",true,{"display_name":348,"login":349,"email":350,"url":320},"风铃","flinkor","flinkor@foxmail.com",3243,"\u002F?p=3243","2021-01-24 04:08:31 +0000",{"type":7,"value":355},[356],[10,357,12],{},"\u002F2021-01-24-unreal-fest-trials-of-mana-3-note",{"title":5,"description":12},"_legacy\u002F2021\u002F2021-01-24-unreal-fest-trials-of-mana-3-note",[362,363],"unreal fest","NPR","w76ga3vPnRwZGTYJffVzsbZqAiFFfGMDM85SQ_10Ka8",1788763177371]