用UE做角色项目的人,十有八九撞过这个事:角色模型明明是自己挑好的,导入引擎后一看,脖子以下多了一层默认底衣,甚至整套内衣裤都跟着出来了。尤其在数字人、虚拟穿搭、游戏换装这些项目里,底衣几乎是必处理项。这篇文章就把我在UE里处理底衣的几种方法掰开揉碎讲清楚,包括临时隐藏、运行时切换、彻底删除,以及删完之后碰撞、布料、动画的连带问题。
先说明一下,这里的“UE”指的是Unreal Engine(虚幻引擎),不管你是用UE5还是UE4,处理的思路基本一致。适合谁来参考?如果你正在做虚拟角色、换装游戏、自定义捏脸系统,或者只是想把Metahuman、DAZ、Character Creator导出的角色模型弄干净,这篇文章都能帮到你。
1. 为什么角色模型总要“穿”着一层默认底衣
1.1 这一层底衣从哪来
很多刚接触UE角色制作的开发者会很困惑:我又没给角色穿衣服,为什么导进来之后角色自带一层底衣?其实这层东西不是引擎给的,而是模型源文件里本来就带有的。
在DAZ Studio、Character Creator这类角色生成工具里,为了适配各种换装需求,系统默认会给角色身上叠加一层“基础内衣层”,官方一般叫它Base Underwear或者Body Suit。这层网格的作用是在角色换穿某些半透明衣物、或者衣服被物理引擎掀起来的时候,保证角色不会直接露出模型内部的空腔,也避免穿模穿得太难看。
另外,从一些模型交易网站下载的FBX角色,也经常自带这层底衣。建模师为了展示角色体型,会保留一套默认的基础着装,导出时没有单独清理。所以当你把模型导入UE看到“自带内衣”,这属于资源制作流程里的常态,不是引擎出错了,也不是模型坏了。
1.2 隐藏和删除,先分清你要的是哪一个
处理底衣之前,必须先明确需求。我见过不少项目组,本来只想让角色在某几个镜头里不显示底衣,结果美术同学直接在建模软件里把面删了重新导出,搞了半天,最后换装功能回来一测,动画错乱、物理崩了,全组加班。这个问题的根源,就是没搞清“隐藏”和“删除”的区别。
隐藏(Hide / Visibility)的意思是这个网格还在模型里,顶点、面、贴图都还占着资源,只是在某个条件下不渲染。它的优点是完全可逆,想恢复就恢复,适合做游戏里的换衣逻辑:按下一个键,角色“脱掉”底衣,再按一下“穿上”。
删除(Delete)的意思是直接从网格体里移除这部分三角形面。这是一个不可逆的几何操作,优点是模型文件更干净,性能上少一个提交批次,适合“这个角色永远不需要底衣”的场景,比如纯裸模角色、半身雕像、只穿长袍的角色等。
判断标准非常简单:如果后续可能在游戏运行时切换底衣显隐,就用隐藏方案;如果这个模型从立项到上线都不可能出现底衣,才考虑彻底删除。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 最快但可逆的做法:先把底衣“藏”起来
2.1 关卡视口里直接隐藏组件,适合调试
如果你只是想在编辑器里快速看看角色不穿底衣是什么效果,最简单粗暴的方法是直接在关卡视口里隐藏对应组件。
操作路径:在Outliner(大纲面板)里选中角色Actor,然后在Details面板里找到Components列表,展开后会看到类似SkeletalMeshComponent的组件。点选对应的网格组件,在Details面板上方把“Visible”复选框取消勾选,关掉后视口里这个组件就不显示了。
这个方法适合什么场景?适合你正在排查问题、想快速验证角色造型的时候。但你要清楚,这个操作只是改动了当前关卡里这个Actor的编辑器状态,打包运行后不一定生效,也不是项目级的修改。如果你把这个组件分配到多个关卡,得每个关卡都去改一遍,很烦。
所以我的建议是:视口隐藏只作为临时调试手段,不要在项目里依赖它。
2.2 用透明材质把底衣“隐身”:最通用的UE隐藏方案
这是我在项目里用得最多的一种方式,也是换装系统里最通用的底衣隐藏方案。思路很简单:底衣网格还保留着,但给它换一个完全透明的材质。
创建一个透明材质的具体步骤是这样:
第一步,在Content Browser(内容浏览器)空白处右键,选择“Material”,命名成类似M_InvisibleBody这样的名字。
第二步,打开材质编辑器,在Details面板里把Blend Mode改为“Translucent”,然后把一个常量0接到Opacity通道上。简单说,就是让这个材质完全不透明度为0,渲染出来就是透明的。
第三步,把这个材质赋给角色骨骼网格体对应底衣的那个材质槽。选中骨骼网格体资产,在资产的Details面板里找到Materials部分,你会看到Element 0、Element 1、Element 2这样一排材质槽。底衣一般对应其中一个槽位,逐个替换成透明材质,角色身上哪一部分消失了,哪个就是你要的槽位。
这种方法的好处非常直观:不动模型本身,不会破坏动画和骨骼,随时可以换回原材质。而且你可以把透明材质做得很干净,后续做换装时只需要切换材质槽里的材质,就能控制“有没有穿底衣”。
不过需要注意几个细节。第一,透明材质默认情况下还是会参与深度测试,如果你角色外面穿了一层半透明纱裙,底衣被透明化之后,纱裙内部还是会有奇怪的遮挡关系,需要搭配Render Pass设置去调。第二,网格顶点数没有减少,绘制调用负担还在,如果角色数量非常多,性能上会有影响。第三,阴影问题,很多新手发现材质全透明了,角色地面还是有黑色阴影,这是阴影投射仍然开启导致的,需要把网格体的Cast Shadow选项关掉。
2.3 蓝图运行时动态控制显隐,适合做换装功能
如果你的项目要做成类似“点击按钮切换底衣显示”这样的交互功能,需要运行时动态去控制,这时候要用蓝图节点来处理。
以角色蓝图为例,你需要拿到角色身上的SkeletalMeshComponent,然后调用Set Visibility节点或Set Hidden In Game节点,输入一个布尔值。为了确保切换生效,记得把Visibility基于Actor Tick更新或者直接勾选“Force Tick”之类的选项,否则在新版本UE里可能出现编辑器里正常、运行时切换无效的情况。
我通常的做法是封装一个自定义事件,比如叫ToggleUnderwear,内部做两件事:切换底衣材质槽的透明材质,或者直接Set Visibility整个底衣对应的网格组件。如果有人告诉你只切换材质就够了,那你大概率会遇到一个问题:底衣网格本身有单独的骨骼和碰撞体,材质虽然透明了,但碰撞体还挂着,角色动画里手臂穿过身体时会卡住。
所以正规做法应该是:网格组件可见性和碰撞体联动。可以给骨骼网格体组件单独指定PhysicsAsset,把底衣骨骼的碰撞体移除;或者更简单一点,运行时Set Collision Enabled,切换到NoCollision。这些逻辑组合起来,换装功能才算真正完整。
3. 彻底删除底衣:在外部模型文件里动刀
3.1 为什么不在UE骨骼网格里直接删
前面说的隐藏方案虽然好用,但终究是“治标不治本”。如果你的角色模型永远需要是干净素体,底衣就属于冗余数据,顶点还在,面还在,材质槽也占着,没必要留着。这时候就要做真正的删除。
但这里有个坑:UE引擎本身对骨骼网格体的几何编辑能力非常有限。Static Mesh可以在Static Mesh Editor里直接选中三角形删掉,但Skeletal Mesh的几何编辑在日常版本里并不是一个成熟的编辑流程,而且直接改骨骼网格体资产风险很高,一旦操作失误,蒙皮信息、材质槽顺序、LOD层级都可能出问题。
所以我的建议很明确:真正要删除底衣,不是去UE里删,而是去DCC软件(比如Blender、Maya、3ds Max)里改模型,改完重新导出FBX,再导入UE。这是一个更稳妥的工程流程。
3.2 Blender里删除底衣的完整流程
下面我以Blender为例,讲一遍完整的删除底衣操作流程。用别的软件的同学思路完全一致。
第一步,把带底衣的FBX导入Blender。File菜单,Import,FBX。
第二步,选中角色模型,按Tab进入Edit Mode(编辑模式)。这时候你能看到网格上的所有面,包括底衣那一层。问题是怎么快速选中底衣面,而不是选到身体表面的面。
这里有个非常高效的方法:如果底衣和身体用的是不同的材质,你可以在Edit Mode下调用Select Linked By Material功能。鼠标悬停在底衣的任意一个面上,在3D视图的Select菜单里找到Linked,选择Material,Blender会自动选中所有使用同一材质的三角形。这个方法比手工框选精准得多。
如果底衣和身体共用一套材质,那就要靠UV或者区域判断了。常见底衣覆盖区域是臀部、裆部、胸口,你可以用环选工具按住Alt选中一圈边,然后逐步加选,最后把这部分面分出来。操作前建议先复制一份模型备份,防止误删。
第三步,选中底衣的所有面后,按X键,选择Delete Faces,把这些面删掉。
第四步,检查模型有没有出现破洞。删除底衣后,如果它和身体共用了一部分边界,删掉之后可能会露出内部表面。这时候需要切换到顶点选择模式,手动把断开的边缘缝合起来。多数情况下底衣是独立的封闭网格,压在身体表面上,删掉后身体本身是完好的,所以这一步可选。
第五步,导出FBX。在导出面板里记得勾选Armature(骨架)、Mesh(网格),以及是否保留动画。如果你角色带有骨骼动画,要正确选择骨骼根部,并设置好Bake Animation选项,否则动画会丢失。
导回到UE里时,最好用一个新命名导入,比如Character_NoUnderwear,不要直接覆盖旧资源。确认没问题之后,再考虑替换旧资源。
3.3 导出FBX时容易踩的坑
FBX导出这块,我几乎每次带新人都会遇到同样的坑,在这里列一下。
第一个是单位和轴向问题。Blender默认是Metric单位、Z轴向上,UE默认是Centimeters、Z轴向上。如果导入时单位不一致,模型会整体放大100倍或缩小100倍,骨骼也会变形。建议导出时把Scale设置为1.0,导入UE时勾选“Import Uniform Scale”为1。
第二个是骨骼命名问题。有些DCC软件导出时会给骨骼加上命名前缀或后缀,如果和UE项目里已有的骨骼命名不一致,后续做重定向、物理资产、动画蓝图都要重新匹配,很麻烦。建议在导出前用Blender的Armature工具统一骨骼命名。
第三个是材质槽顺序问题。在UE里,Skeletal Mesh的每个材质槽对应FBX里的一个材质。如果你在DCC里删除底衣面时不小心把材质也删了,重新导出后材质槽数量可能会变少,UE里原本赋好的材质对应关系就乱了。解决办法是在导出前检查材质列表,确保所有需要保留的材质都在。
第四个是法线问题。删除底衣后,如果身体表面有共享法线被破坏,模型会出现黑斑或硬边。导出前可以在Blender里选择所有面,按Ctrl+N重新计算外侧法线,也可以使用Data Transfer重新映射法线。
4. 两个高频场景的实战方案
4.1 Metahuman角色的底衣怎么关
Metahuman在虚拟人项目里用得越来越多,但Metahuman源文件自带一套很完整的身体层。处理方式比较特殊,因为Metahuman不是一个骨骼网格体,而是由多个网格体组件组合起来的,不同版本的UE里组件结构不完全一样,但原理相通。
你要处理的通常是Body或者Torso这类网格,它里面会包含多个材质槽,其中一部分就是底衣对应的槽位。具体操作:打开Metahuman Actor,在Components面板里找到Body相关的SkeletalMeshComponent,选中它,然后在Details面板的Materials区域逐个找哪种材质名称里带Underwear、Base、Bra、Under之类的字样。
找到底衣槽位后,直接把这个槽位的材质替换成透明材质,和前面2.2节说的方法一样。我这里多提一个技巧:Metahuman经常会更新外观控制面板,如果你操作的版本里提供了类似Body Appearance这种可视化控制,可以直接在上面找相关开关。不同版本的入口命名有差异,你可以多找找,找不到就用材质替换兜底。
有一点要特别提醒:Metahuman的材质资产往往带有很多参数,直接用透明材质替换后,底衣隐藏了,但某些布料模拟组件可能还挂在对应骨骼上。如果角色动起来布料还在飘,记得去PhysicsAsset里把对应骨骼的碰撞和布料约束一并处理掉。
4.2 DAZ/CC角色导入后怎么处理底衣
DAZ和Character Creator导出的角色,也是底衣重灾区。DAZ导出FBX时,默认会把当前角色身上的所有可穿戴物品一起带出来,如果你之前给角色装过内衣、泳衣之类的预设件,导出时就会带进UE。CC相对好一点,导出时会有选项控制是否包含底层衣物。
处理这类角色,第一步要弄清底衣是独立网格还是同一网格的材质分区。很简单,导入UE后看Outliner:如果底衣是单独的SkeletalMeshComponent,直接删掉或隐藏组件;如果角色只有一个SkeletalMeshComponent,但材质槽里有很多层,那就用透明材质法处理对应槽位。
如果你有CC的源文件,我强烈建议回到CC里重新导出一次,在导出设置里关闭底层内衣相关选项,这样从源头上避免问题。没有源文件的情况下,用Blender流程删底衣面,或者直接用透明材质隐藏,两个方案都可以。
我个人的经验是:DAZ角色导入后,如果只是做静态展示或简单动画,透明材质处理就够了;但如果要做比较复杂的换装系统,建议还是在DCC里把底衣彻底删掉。因为DAZ底衣网格经常带独立的PhysicsAsset,它在换装逻辑里会干扰裙子、裤子的碰撞模拟,属于隐藏的“坑”。
5. 删完之后的连锁反应:物理、碰撞与动画
5.1 碰撞体和物理资产还在,角色会“隔空碰撞”
这是我在处理角色底衣时觉得最值得聊的一个点,也是很多人忽略的地方。你改了模型材质、删了底衣网格,表面看起来角色已经干净了,但运行游戏后你会发现手一抬起来,某些地方出现奇怪的阻挡感,衣服下摆会被什么东西托住。
原因很简单:角色的PhysicsAsset(物理资产)里,对应底衣骨骼的碰撞体还挂在角色身上。网格隐藏了,碰撞体可不会自己消失,它们还在原来的骨骼位置上占据空间,角色动画一运动,就会出现“隔空碰撞”。
解决方法分两步。第一步,打开骨骼网格体资产对应的PhysicsAsset,在骨骼树里找到底衣相关的骨骼(名称通常和底衣材质槽或网格命名一致),把这些骨骼对应的碰撞体删除或禁用。第二步,如果底衣网格本身有独立的碰撞组件(有些角色会单独挂PhysicalBody),把它也从蓝图中移除。
如果你不想改动PhysicsAsset,也可以在角色蓝图初始化时调用Set Collision Enabled,直接把整个SkeletalMeshComponent的碰撞设为NoCollision。但这个方法比较粗暴,会影响整个角色的物理交互,建议只用在不需要角色物理碰撞的一次性场景。
5.2 布料模拟、隐藏部分与LOD的连带影响
第二个连锁反应是布料模拟。很多角色的裙子、披风、尾巴是挂在底衣骨骼上的,当底衣网格被删除后,布料模拟的约束链可能断裂,表现为衣服飞起来、穿模、贴在身体上乱抖。这是因为Chaos Cloth的布料网格与底衣骨骼位置存在约束依赖。
解决办法是检查角色骨骼树,找到布料模拟根骨骼,看它的父级是否还在。如果父级骨骼因为删除底衣而丢失或者被合并,你需要重新给布料根骨骼设置父级关系。这个操作在非骨骼重定向的场景下比较麻烦,我的做法是:如果不是迫不得已,不要删除底衣节点下挂载的任何骨骼,只删除网格面。骨骼保留着,只是没有对应网格,动画和布料照样能跑。
第三个连带影响是LOD。如果你在DCC里删除了底衣面,重新导入UE时LOD0是干净的,但LOD1、LOD2可能还是旧版本,运行时相机拉远拉近会出现“过场”瞬间,角色突然又穿回底衣了。遇到这种情况,要么同步修改所有LOD层级,要么在导入时关闭LOD自动生成,手动生成一套纯LOD0的新资源。
6. 常见问题速查表与避坑心得
6.1 六个常见问题排查
我把实际操作中遇到的典型问题整理成了一张表,方便你对照排查。
| 问题现象 | 原因 | 解决方案 |
|---|---|---|
| 材质全透明了,角色地面还有黑色阴影 | 阴影投射没关 | 选中网格体,Details里取消Cast Shadow |
| 编辑器里隐藏了,运行时又显示出来 | 隐藏的是编辑器可见性,不是运行时可见性 | 用蓝图Set Hidden In Game或Set Visibility |
| 删除底衣后动画错乱 | 误删了身体表面或者骨骼权重相关面 | 回到备份,重新选择底衣独立网格面删除 |
| 重导FBX后材质全部丢了 | 导入时没有正确匹配材质槽 | 导回时保留原有材质路径,或在导入设置里指定 |
| Metahuman不知道哪个材质槽是底衣 | 材质槽数量多且命名不直观 | 逐个替换透明材质测试,观察哪个部分消失 |
| 隐藏底衣后角色手臂被卡住 | PhysicsAsset里底衣骨骼碰撞体还在 | 在PhysicsAsset里禁用或删除底衣骨骼碰撞体 |
6.2 一些我自己的操作习惯
最后分享一点我自己的经验。第一,拿到任何带底衣的模型,先别急着删。先把原始FBX备份到一个单独的目录,后面所有操作都基于这个备份展开,避免“一键删除”之后想恢复却找不到原始文件。
第二,我一直建议项目组里定一个命名规范。比如隐藏用的透明材质统一叫M_InvisibleBody,删除底衣后的角色资产统一加后缀_NoUnderwear,这样不同人做同样的事,不会一人一个风格,后面对接起来特别省事。
第三,如果你做的是换装系统,底衣不要直接删除,更不要用两个完全不同的角色资产做切换。用材质槽控制和骨骼网格体组件的可见性控制,才是既灵活又稳定的方案。你真想让游戏里“脱衣服”这个动作有动画效果,也可以靠骨骼AnimNotify配合透明材质实现,不需要动模型几何。
第四,处理Metahuman这类资源时,建议先看官方文档里关于Body Controls的说明,很多版本其实已经提供了底层显隐的接口,比我在这里讲的通用方法更优雅。不过接口这东西版本迭代快,今天写这个教程明确索引某一版,过几个月可能又变了,所以还是把材质替换和组件隐藏这两个底层方法掌握好,这才是真正的通用技能。
