ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

UE4静态网格体碰撞设置与合并Actor:从穿模到性能优化全攻略

UE4静态网格体碰撞设置与合并Actor:从穿模到性能优化全攻略 做UE4的新手教程接触多了之后我发现大家问得最多的两类问题一个是静态网格体的碰撞设置另一个就是合并Actor合并静态网格体。这两个功能单独拿出来都挺好理解但放在一起用的时候很容易把人绕晕合并完之后角色穿模、碰撞线框消失、材质变得一团糟……这些坑我基本上都踩过一遍。这篇文章按“先碰撞、后合并、再排查”的顺序写尽量把概念讲透把操作步骤写完整。不管你是刚装了UE4、还没搞懂Collision和Physics区别的纯新人还是已经能拖模型进场景、想优化关卡性能的入门开发者都可以照着操作一遍。看完之后你至少能回答三个问题静态网格体碰撞到底怎么设置才不穿模、合并Actor到底是干嘛的、合并完出了毛病该去哪里查。1. 为什么新手绕不开碰撞和合并这两件事1.1 一个非常典型的翻车现场启动UE4编辑器从内容浏览器拖一个静态网格体到关卡里然后点Play角色直接从模型中间穿过去、或者整个人掉到地面以下——这是我见过次数最多的新手提问。另一个常见情况是从商城下载了一套环境资产往场景里一摆运行起来帧数忽高忽低打开统计信息一看Draw Call直接飙到几千。碰到的这两类问题恰恰对应了标题里的两个关键词静态网格体碰撞设置以及合并Actor。碰撞决定的是一个模型在关卡里“能不能被挡住”、“能不能被检测到”它直接影响游戏手感和角色行为而合并Actor解决的是场景物件数量过多带来的性能压力属于非常典型的项目优化手段。两者常常一起出现你想合并一批组件又怕合并完碰撞丢了所以必须先把碰撞设置的逻辑搞清楚再去操作合并工具否则连问题出在哪里都找不到。1.2 把目标拆开碰撞管“交互”合并管“性能”普通新人入门不用一口气把引擎里的所有概念学完先把两个目标分开就好。碰撞相关的调整其实都是在回答三个问题这个物体玩家能不能站上去子弹能不能打到它开启模拟物理之后它会不会往下掉这三个问题分别对应了简单碰撞、碰撞预设和物理模拟算是三个递进的层次。合并Actor的目标就简单很多把场景里成百上千个独立的小模型合并成少数几个大模型减少引擎需要处理的物体数量和渲染指令从而提升帧率。它不改变物体的“外观”太多如果设置得当但会改变物体的“身份”——从很多个Actor变成一个全新的静态网格体资产。理解了这层身份变化后面很多坑就不会踩。2. 静态网格体碰撞设置先把三个核心概念吃透2.1 简单碰撞与复杂碰撞快递箱和泡沫塑料静态网格体的碰撞设置首先要区分简单碰撞和复杂碰撞。简单碰撞Simple Collision是指用Box、Sphere、Capsule、Convex这些基础几何体去近似模拟物体的外形它计算量小是游戏运行时默认用来做碰撞检测的。我们双击静态网格体资产进入Static Mesh Editor在工具栏上的Collision下拉菜单里点Add Box / Add Sphere / Add Capsule / Add Convex Collision加出来的东西全都属于简单碰撞。关卡视口里看到的绿色半透明线框也就是这个碰撞体。复杂碰撞Complex Collision则直接使用渲染网格本身的三角面来做碰撞检测精度高但开销也大。绝大多数情况下我们不会让游戏持续使用复杂碰撞因为三角面数太多物理查询会非常贵。有一个生活化的类比简单碰撞就像快递外面的纸箱搬运方便、成本低只要外形差不多就行复杂碰撞则像纸箱里每一件商品自己的形状精确是精确但你要把所有东西都按原样搬到货架上代价太高。如果确实需要用到网格本身的三角面去参与碰撞可以在静态网格体资产的设置里勾选Use Complex Collision as Simple。它的意思就是把复杂碰撞当作简单碰撞来用适合那些不能用盒体、球体近似的异形物体。新手要记住这个选项一旦开启性能消耗会明显上升所以它不是默认选项也不是万能的。2.2 手动添加简单碰撞体的详细步骤这里把在静态网格体编辑器里加碰撞的完整流程写一遍新手可以直接照着操作。第一步在内容浏览器里双击静态网格体资产打开Static Mesh Editor。第二步在顶部工具栏中找到Collision按钮点开下拉菜单里面会列出Add Box Simplified Collision、Add Sphere Simplified Collision、Add Capsule Simplified Collision、Add Convex Collision、Auto Convex Collision这些选项。第三步如果目标是一个墙体、地板这类方方正正的物体直接Add Box Simplified Collision就行引擎会根据网格的包围盒自动生成一个盒体。这时候绿色线框如果比模型大出一圈就选中这个线框用平移和缩放工具把它压到贴合模型表面。注意别把碰撞体缩到模型内部太深否则会出现“看着碰到了、实际没碰到”的穿透现象。第四步如果物体形状不规则比如一块岩石、一截断墙用Box会偏差太大建议用Add Convex Collision或者直接用Auto Convex Collision自动生成多个凸包。Auto Convex这个功能本质上是用一组凸包去逼近复杂外形面板里的Max Hulls Verts和Max Hulls两个参数分别控制“每个凸包最多包含多少顶点”和“最多生成多少个凸包”。数值越高碰撞精度越高但性能开销也越高实际使用时建议从默认值开始再按效果微调。第五步加完之后在Static Mesh Editor的视口里切换碰撞视图模式检查绿色线框的实际覆盖范围。这一步我强烈建议养成习惯因为很多时候你以为线框贴紧了实际上扩展出去一大截玩家隔着空气就被挡住手感非常奇怪。2.3 碰撞预设和对象类型场景里那块看不见的开关光在资产里加了简单碰撞还不够。把一个静态网格体拖进关卡之后选中这个Actor在细节面板的Collision分类里还能看到Preset、Object Type、Collision Responses这几组设置。新手经常在这里犯迷糊我一个个解释清楚。Preset是引擎预设好的一些碰撞响应组合常见的有BlockAll、OverlapAll、IgnoreOnlyPawn等等。BlockAll意思是所有碰撞通道都会被阻挡OverlapAll则是不阻挡只触发重叠检测IgnoreOnlyPawn是只忽略Pawn也就是玩家角色其他照常。Object Type用来声明当前物体是什么类型常见选项有WorldStatic世界静态物体、WorldDynamic世界动态物体、Pawn可控制角色、PhysicsBody物理体等。这些类型本身不会直接决定物体会不会被挡住真正起作用的是下面的Collision Responses通道响应表。Collision Responses表里列出了各种对象类型每种类型有三种状态Block阻挡、Overlap重叠、Ignore忽略。如果一个Actor的Preset被设成了IgnoreOnlyPawn那么它对Pawn通道就是Ignore玩家角色自然直接穿过去。很多人一脸懵地发现自己角色能穿过一堵墙先检查这里大概率是预设没选对。2.4 查询碰撞和物理模拟的区别两个世界的事最近经常看到有人搜“UE4查询和物理模拟器的区别”这个点确实值得单独拎出来讲因为它能解释一堆奇怪的现象。所谓查询Query指的是我们在游戏逻辑里主动发起的检测比如用LineTraceByChannel发射一条射线看它碰到谁或者用SphereOverlapComponents检测一个范围内有哪些Actor。这类检测只看碰撞通道的响应配置——Block还是Overlap还是Ignore——它不涉及质量、重力、力也不关心物体有没有开启物理模拟。物理模拟Physics Simulation则是让物体真正去参与物理引擎的计算具体来说就是选中Actor后在Physics分类里勾上Simulate Physics。这时候物体会受重力下落会被其他物体推开也会因为质量、碰撞体形状不同产生不同的运动反馈。要让一个物体真正“有物理”它必须同时满足三个条件有碰撞体、开启了Simulate Physics、碰撞响应至少是Block缺一个都可能出现直接掉穿世界的现象。我把两者的区别整理成表格方便收藏对比项查询碰撞Query物理模拟Physics Simulation触发方式游戏逻辑里主动发起射线/检测引擎每帧被动计算受力与运动依赖设置主要看碰撞预设与通道响应需要开启Simulate Physics、质量、碰撞体典型应用拾取检测、视线判定、范围检测掉落物、可推动箱子、绳索约束与重力关系不相关直接相关常见问题Ignore预设导致射线检测不到只勾Simulate Physics但碰撞是Overlap直接穿透新手最常见的场景就是给静态网格体勾了Simulate Physics结果它从关卡里掉下去了。这时候你看它的Collision Preset大概率是某个Overlap或者Ignore的预设物理引擎根本不知道该跟它发生接触。反过来另一类情况是射线怎么打都打不到某个物体那就要去查它是不是对所有通道都是Ignore。记住“查询看通道响应、模拟看物理开关”这个口诀能帮你省下大量的排查时间。3. 合并Actor与合并静态网格体场景优化的常用操作3.1 合并Actor和合并静态网格体到底什么关系很多教程把“合并Actor”和“合并静态网格体”混着用实际上在UE4里它们指的是同一套工具流程的不同叫法。引擎提供的工具叫Merge Actors它把场景中选中的多个静态网格Actor烘焙成一个新的静态网格体资产。合并完成后内容浏览器里会多出一个Static Mesh场景中原来的Actor还在你可以自己决定保留还是删除。新生成的静态网格体也能像普通静态网格体那样使用——拖回场景、设置碰撞、调整LOD都很正常。所以可以这样理解操作对象是Actor产物是Static Mesh。标题里写的“合并Actor合并静态网格体”本质就是在说这一件事。这个工具最典型的用途是处理静态场景里的装饰物和建筑部件。比如一堆碎石、锁链、木箱它们数量多、又不会动合并成几个大的静态网格体之后渲染性能会明显提升。3.2 从零开始完成一次合并Actor操作打开UE4编辑器按下面的步骤操作整个过程大概两三分钟。第一步在场景中框选所有需要合并的静态网格Actor。注意只有包含Static Mesh Component的Actor才能参与合并蓝图里自带的其他组件不会被合并进去。第二步在顶部菜单栏打开Window找到Merge Actors。不同版本的菜单位置稍有差异有些版本在Window的Developer Tools子菜单里有些直接在Window菜单下找不到就用编辑器右上角的搜索框输入Merge Actors也能快速定位。第三步打开Merge Actor面板后左侧是场景里选中的Actor列表右侧是各种合并参数。第四步在设置区域确认几个关键选项Pivot Point、Material Merging、Auto Generate Collision、Add to Folder确认无误后点击Merge按钮。第五步引擎会弹出一个保存对话框要求把生成的静态网格体资产保存到一个内容文件夹里。建议单独建一个目录比如Merged/方便管理和回退千万别直接点保存默认路径完事。合并完成后把新的Static Mesh拖回场景检查一下确认位置、碰撞、外观都没问题再把原来那一批Actor删掉。我更习惯的做法是先保留原Actor把合并结果放在旁边对比确认无误之后再清理。3.3 合并参数里最容易影响结果的四项第一个是Pivot Point也就是新静态网格体的轴心点。可选World Origin世界原点、Center of Bounds包围盒中心、First Selected Component第一个选中物体等。轴心点影响后续所有旋转缩放操作如果你合并完发现物体一旋转就绕着奇怪的位置转多半是这里没选对。我的经验是如果这批物体在场景里要作为整体摆放选World Origin最省事。第二个是Material Merging材质合并。勾选后引擎会把多个材质整合成一张材质图集以换取更少的材质数量。代价是纹理会被拼进一张贴图里UV会跟着改变原来每个物体独有的材质参数也会被改写。如果你的模型贴图分辨率很高合并后可能出现画质下降这一点需要权衡。第三个是Auto Generate Collision我强烈建议新手直接勾上。合并工具生成的新静态网格体默认不一定带有简单碰撞。如果不勾选合并完物体就是一个“没有碰撞的空壳”拖进关卡后角色可以直接穿过。勾上之后引擎会为新网格自动生成简单碰撞体省得再去资产里手动加一遍。第四个是Add to Folder把生成的资产放到指定目录。新手往往忽视这个选项结果合并完不知道资产被存到哪里下次想改都找不到。建议从一开始就建立清晰的文件管理习惯。3.4 合并后必查的三件事按照我的习惯合并动作完成之后一定会依次检查三件事。第一碰撞。打开Static Mesh Editor切到碰撞视图看看绿色线框是否已经生成覆盖范围是否合理。如果碰撞线框完全不存在回头检查Auto Generate Collision是不是没勾。第二材质。把视图切到Lit模式看外观重点看贴图是否拉伸、颜色是否异常。如果合并前材质种类特别多逐项检查材质图集的拼接情况看有没有明显的UV重叠。第三轴心。选中新网格体观察它的轴心位置。轴心不在模型几何中心也没关系但必须是你预期中的位置否则日后摆放会非常别扭。4. 实操中的翻车记录与排查方案4.1 碰撞失效、物体穿模按这个顺序排查碰撞相关的问题90%都能靠下面几个步骤定位到根源。第一步确认静态网格体资产本身有没有简单碰撞体。打开资产切到碰撞视图直接看没有碰撞体就手动加一个或者用Auto Convex Collision自动生成。第二步看关卡里Actor的Collision Preset。如果是OverlapAll或者Ignore把它换成BlockAll再测试。很多时候我们以为模型碰撞坏了其实只是预设被改成Ignore了。第三步检查是不是开启了Simulate Physics但碰撞响应不匹配。如果物体勾了Simulate Physics同时碰撞预设是Overlap物理引擎就不认为它需要和其他物体接触自然就掉穿了。把预设改成BlockAll之后问题通常立刻消失。第四步检查有没有多个碰撞体互相嵌套。合并前的模型各自带碰撞合并后如果还保留了多个内部的碰撞体某些情况下会产生奇怪的物理跳动。手动删除多余的碰撞体只保留最外层合适的那一个。还有一个比较隐蔽的坑合并工具生成的新静态网格体碰撞体缩放偶尔会变得异常导致绿色线框比模型大出一圈。遇到这种情况先把所有简单碰撞体删除再用Auto Convex Collision重新生成一遍基本都能解决。4.2 合并后材质和光照异常怎么办材质异常里最常见的是贴图拉伸。原因是合并时开启了Material Merging引擎自动拼合纹理但UV如果重叠或者贴图分辨率变化视觉上就会出现明显瑕疵。如果你对画面要求比较高建议合并时先关闭Material Merging合并完成后手动创建材质实例来统一参数通过减少材质数量的另一条路径控制性能开销。光照异常也不少见。合并前的多个网格在Lightmass烘焙时是分开计算光照贴图的合并后变成一个网格光照贴图UV如果不满足要求就会出现漏光、黑块或者颜色突变。遇到这种情况先选中新网格体在Lighting分类下检查是否允许生成光照贴图必要时重新生成UV然后重新烘焙一次静态光照。不是所有情况都能一键解决但多数静态场景合并后重新烘焙一次就好。4.3 合并不是万能药这些情况下别用它合并Actor只是优化手段之一并不适合所有场景。如果一个物体在游戏过程中需要被独立控制比如门要开、抽屉要拉、机关要触发那它绝对不能合并进去。合并完成之后它就变成一个静态网格体失去了独立交互能力你没法再单独控制它的开关状态。如果你只是重复摆放大量相同的物体比如一片树林、一条街的路灯也不建议用Merge Actors。这种情况更适合用Instanced Static Mesh实例化网格在渲染层面效率非常高而且每个实例还能独立变换、独立控制灵活性和性能都比合并更好。另外如果角色的碰撞查询很频繁比如经常做射线检测合并出太大的单网格也可能带来物理查询开销上升的问题。性能优化讲究平衡建议分小片区域做合并测试对比之后再决定合并到什么粒度最合适。5. 给新手的落地建议和个人心得5.1 记住一个顺序先碰撞后合并再复查我给新手的最重要一条建议是先学会看碰撞视图再做任何合并操作。很多人把碰撞和合并当成两个独立功能碰壁之后才发现它们的设置是互相影响的。合并会生成一个新的静态网格体而这个新资产的碰撞状态直接决定了你在关卡里能不能正常走动。正确的顺序应该一直是先检查碰撞再操作合并最后再复查碰撞。这套顺序我用了好几年基本没再出现过合并后穿模的低级事故。5.2 批量操作前把备份习惯养好另外一个值得养成的小习惯是任何批量操作之前保存关卡、做好备份。合并Actor这类操作虽然可以撤销但资产一旦生成并覆盖保存后悔的成本就会高很多。我一般会把原始Actor先放到一个单独的文件夹或者图层里合并确认无误之后再清理。这样即使合并结果不理想也能快速回到操作前的状态不会因为一次失误把半天的工作搭进去。5.3 优化思路打开一点别只盯着合并最后聊点题外话。UE4场景优化的思路远不止合并Actor一个方向Instanced Static Mesh、HLOD、LOD都是后续值得研究的内容。但无论哪个方向前提都是把静态网格体的碰撞设置、材质设置这些基本功打牢。这篇文章讲的虽然是最入门的一部分但把这套流程完整跑通一遍后面看更高阶的优化教程时会发现很多概念都能轻松对上而且排查问题的思路也是相通的。
返回列表