干这行快十年了,Maya 和 Unity 之间的模型交接,我前前后后踩过的坑能排满两屏。很多朋友在 Maya 里建模型建得赏心悦目,灯光材质调得心花怒放,结果一导入 Unity:模型消失、大小对不上、材质全糊、阴影乱闪,整个人瞬间心态崩掉。这篇东西我不讲虚的,直接从 Maya 的导出前准备、FBX 各项参数设置、Unity 导入面板逐项配置,再到包围盒异常、阴影问题的现场排查,把一条完整流程里你可能会撞上的坑全部列出来。无论你是刚入行的新人,还是被材质和动画折腾得焦头烂额的老手,这篇照着走都能少熬几个夜。
1. 进入 Unity 前:先在 Maya 里把家底收拾干净
1.1 单位制与缩放——米和厘米的换算关系,90%的模型错位都出在这
我先说一个绝大多数人第一步就忽略的事:单位。Maya 默认工作单位是厘米,Unity 的世界单位是米。这俩不是“大小不一样”那么简单,而是整个坐标系的标尺就不同步。假设你在 Maya 里拉了一个 100 单位长、100 单位宽的地板,你心里觉得它是 1 米见方,但 Unity 拿到这个 FBX 后,如果你不做任何缩放处理,它会把 100 当成 100 米来处理。你放进场景一看,好家伙,主角还没地板上的螺丝孔大。
所以导出之前第一件事,就是统一单位认知。我的习惯是:在 Maya 菜单栏打开 Window > Settings/Preferences > Preferences,在 Settings 面板把 Linear 设置为 Centimeter、Angular 设为 Degree。然后导出 FBX 时,在 FBX Export 对话框的 Advanced Options 里,把 Units 设置为 Automatic 或者明确写 Centimeters,勾选 Bake Units。这样 FBX 文件头会写入单位信息,Unity 新版导入器能自动识别并按比例换算,你就不用在导入面板里像玄学一样反复试缩放值。
不过这里要提醒一下:如果你的项目是从老版本 Unity 升级过来的,或者团队里有同事用 2019 之前的 Unity 版本,自动换算不一定可靠。这时候就要手动在 Unity 的 Model 导入面板里找到 File Scale,直接填 0.01。注意,File Scale 是乘法系数,它作用在模型所有顶点坐标上,不是改 Transform 的缩放值。这俩的区别很微妙,前者是在模型层面把网格做小了,后者只是把显示矩阵缩放,前者对物理系统和包围盒计算更友好。所以宁可花两分钟在导入面板里把 File Scale 填对,也不要在场景里拿 scale 去瞎补。
1.2 场景清理——组、层和辅助对象,还有那些“看不见的陷阱”
Maya 场景里七七八八的东西太多了:历史记录(History)、层(Layer)、组(Group)、曲线(Curve)、定位器(Locator)、IK 手柄、约束节点、还有你为了测试临时打的光和网格平面。这些东西一概不需要导出,它们只会让 FBX 文件变得臃肿,或者更糟——给 Unity 带来一堆莫名其妙的空节点和冗余 Transform。
我每次导出前会老老实实过一遍这几步:选中模型后执行 Edit > Delete by Type > History,把构造历史清干净。这一步非常关键,尤其是用了布尔运算、FFD 变形、软修改这类操作后,历史节点里很可能藏着一堆驱动网格的中间层,带着历史导出去 Unity,轻则模型无法正常显示,重则 Unity 直接报 “Mesh has no valid bounds” 之类的错。清理完历史后,再检查 Outliner,把没用的组、空 Group、动画控制器节点删掉,确保所有需要导出的模型都在一个干净的逻辑层级下。
另外提一嘴命名。Maya 里三个名为 pCube1、pCube2 的物体,导出到 Unity 后会生成三个名为 pCube1 的 Mesh 资产还是三个不同资产?取决于你在 Unity 导入器里是否勾选了按物体名拆 Mesh 的选项,但如果物体名有重名,Unity 的后处理很容易把贴图、Mesh 资源互相串。所以养成给模型起好名字的习惯,用有意义的前缀区分大类和部件,比如Char_Hero_Body、Wep_Sword_Blade,这比在 Unity 资源管理器里翻一堆 Cube、Sphere 幸福太多了。场景里 Lights、Cameras 这些辅助物体,如果不想带进 Unity,就在导出窗口的 Include 选项里手动关掉。
1.3 坐标轴与轴向设置——为什么模型到了 Unity 里会“躺下”或“转圈”
坐标轴是另一个高频翻车点。Maya 默认世界坐标系是 Y-up 右手系,Unity 是 Y-up 左手系,坐标系的手性不同,三角面的缠绕方向就会发生变化,直接表现为模型的面在 Unity 里朝向翻转,或者导出后模型整体朝着奇怪的轴偏转。FBX 格式本身支持嵌入轴向信息,所以正常情况下你不需要手动旋转根节点,但前提是你在 Maya 里的轴向设置足够干净。
具体操作:在 Preference 的 Settings 面板,把 World Coordinate System 设为 Y-up。然后选择物体后,用 Modify > Freeze Transformations 把 Transform 的平移、旋转、缩放全部清零。这一步的本质是让物体自身的 Local Axis 和世界坐标对齐,防止同一个模型在不同 DCC 软件之间因为 Local Rotation 残留而出现“Mit 里好好的,Unity 里模型打横”的情况。Freeze 之后再检查一下 Scale,尽量让 Local Scale 是 1,负缩放尤其要命,Unity 的面剔除算法会被负缩放搞疯,出现内部可见、外部看不见的反向法线效果。
有的团队习惯在 Maya 里把 X 轴向旋转 90 度让模型面朝 Z 方向,这个我不反对,但你的流程必须统一。如果项目里有人是 Z-up 工作流、有人是 Y-up 工作流,导出时 FBX 坐标转换就会互相打架。我的建议是:Maya 一律 Y-up,建模时让模型的正前方对准世界 Z 轴正方向。这样进入 Unity 后,Forward 是 Z+,模型的正面朝向才和 Unity 第三人称相机的预设匹配。
2. FBX 导出设置逐字段拆解
2.1 导出格式与版本——FBX 2020 还是 2019,兼容性怎么看
Maya 导出 FBX 时,第一个让你纠结的问题就是版本。FBX 文件格式每隔几年就会升级一次,Unity 对 FBX 版本的支持范围很广,但我最近几个项目实测下来,导出 FBX 2020 给 Unity 2021.3 LTS 或者 2022.3 LTS 用,稳定性和导入速度都很好。如果团队里还有人用 Unity 2019,那就选 FBX 2019 版本,别贪新,相容性永远比功能新更重要。
FBX 导出对话框里还有几个关键开关需要注意:第一,Preserve Instances 建议关闭。Maya 里的实例化物体导出后常常会让 Unity 误判成多份独立网格,或是在资源引用上绕一圈,交互体验很差。与其靠这个选项,不如在 Unity 里用 Prefab 自己做实例化,高效且可控。第二,Smoothing Groups 和 Normals 这两项勾选和取消有大学问。如果你在 Maya 模型上花了心思做软硬边,就把 Smoothing Groups 勾上,并在 Smoothing Groups 下方选择 Per-Vertex Normals 与 Export Normals;如果没做软硬边,就让 FBX 导出器自动生成法线,但这样 Unity 里模型的棱角分界线会和你 Maya 里看到的不一致。
其实我更推荐的做法是:第一步,在 Maya 里把 Normals 完整烘焙到网格上,Mesh Display > Set To Face,然后再选择 Soft Edge 或 Hard Edge;第二步,FBX 导出时选择 Export Normals and Tangents。这样贴图法线(Normal Map)在 Unity 里不会因为切线缺失而出现光斑错乱的问题。关于 Tangents,经验上是:只要你用了 Normal Map,就必须同时导出切线,否则 Unity 的 Shader 会把烘焙好的法线贴图完全当摆设。
2.2 轴向转换与高级选项——Bake 才是不做“事后旋转”的关键
FBX 导出窗口里有一个叫 Axis Conversion 的选项区。Maya 和 Unity 都是 Y-up,所以你会觉得这里根本不用管,但实际的坑在于:Maya 的 FBX 导出器在默认情况下不一定会把轴信息写干净。我建议在 Up Axis 里明确设置为 Y,Primary Axis 设置为 X——这是大多数游戏引擎默认的前向/上向组合。设置完成后再勾选 Bake Axis Conversion。这个“Bake”的含义是把坐标转换直接写进顶点数据,而不是靠节点旋转来补偿。这样 Unity 导入时不需要建立额外的根节点来对齐方向,模型的位置旋转数据会干净得多。
几何体选项区域还有一个 Always Deform 开关,做蒙皮动画时建议勾上。它会让 FBX 在导出时就把骨骼权重作用后的变形结果计算一次。如果不勾,Unity 导入 SkinnedMeshRenderer 时也可以正常驱动骨骼,但如果在绑定阶段模型有些奇怪的零权重或者单位矩阵残留,就会出现动画时模型“软塌塌”的异常。经验来看勾上不会有什么副作用,但能让 Unity 在导入阶段省去一部分容错计算。
还要注意摄像机、灯光这些对象。Maya 导出器默认会把你场景里的摄像机和灯光导成 FBX 节点,Unity 导入后生成 Camera 组件还好说,灯光导过来有时会带一堆 Unity 不认的衰减参数,造成 Parallel 光源的阴影范围和 Maya 里调的不一致。大多数纯模型需求根本不需要这些,直接在 Include 里把 Cameras 和 Lights 全部去掉,保留 Geometry、Animation 即可。
2.3 曲线、Blend Shape 和骨骼——不是所有东西都适合“一键全选导出”
很多教程会告诉你,导出时把所有内容选上,然后 Export Selection,这就完了。但真正让我栽跟头的恰恰是这种“全选导出”。动画曲线如果带有恒定切线、阶跃切线,导入 Unity 后动画会莫名其妙地抖动,因为 Unity 的动画压平方式跟 Maya 的曲线插值算法不完全兼容。如果只是做静态模型导入,Animation 干脆别勾;如果带动画,建议在 Maya 里把曲线 Bake 一下(Animation > Bake Channel),把数值按帧采样,这样 Unity 拿到的就是实实在在的离散关键帧,不会再出插值问题。
Blend Shape(融合变形)的导出排坑更典型。Maya 的 Blend Shape 可以带很多驱动节点,Unity 支持导入 Blend Shape,但要求它的名称唯一、且整个模型的顶点数量和拓扑结构不发生任何变化。常见错误是你在 Blend Shape 节点上做了二级驱动、或者给它加了 Utility 节点,Unity 导入后要么 Blink 不生效,要么整个 Mesh 消失。我的建议:导出前把 Blend Shape 相关的额外连接断干净,只保留最基础的 Base Mesh + Target Mesh 关系,Unity 里用 SkinnedMeshRenderer.GetBlendShapeWeight() 来控制权重。
骨骼方面,如果你的模型是简单机械结构,没有蒙皮,导出一个统一的 Hierarchy 就行;如果有蒙皮动画,必须在 Joint 列表里确保骨骼命名没有中文、没有空格,并且不要带_end这类 Unity 无法识别的后缀。Unity 的 Avatar 系统对骨骼名字的重建非常敏感,Hips、Spine、Chest这类标准骨骼名一定要保留,否则人形重定向会卡在最后一步——这个我后面章节再展开。
2.4 贴图路径与嵌入媒体——Path 断了才是真正的灾难
FBX 文件存储贴图引用时,只会记录一串路径,不会把贴图文件本身打包进去。在 Maya 里你所有贴图都是盘符下的绝对路径,比如D:\ArtAssets\Char\body_diffuse.tga。当你把这个 FBX 发给同事或者转移到别的电脑,对方的 Unity 项目里没有D:\ArtAssets这个目录,贴图就全部丢失,模型在 Unity 里变成一片刺眼的紫灰色。
解决方式有两种,我按优先级排序:第一种,在导出 FBX 时,把 Embed Media 选项勾上,这样贴图会被内嵌进 FBX 文件里。这种方式最省心,但代价是文件体积会大好几倍,而且每次修改贴图后都要重新导出 FBX,协作起来非常痛苦。第二种,也是我更推荐的方式:项目从一开始就定好 Assets 目录结构,把贴图和 FBX 放在同一个文件夹或相邻文件夹,用相对路径引用。Unity 导入时,只要贴图和 FBX 一起放在 Assets 下,并且你在 Unity 的导入器里把 Material Creation Mode 设置为 Standard 或者 From Embedded Texture,Unity 就能自动识别相对路径下的纹理。如果还是不识别,在 FBX 导出的 Embedded Media 里别勾选“仅限纹理”,然后回到 Unity 手动把贴图拖到模型的材质球对应通道上。
还有一个小技巧:FBX 里的 UV 通道默认只会导出 UV0。如果你在 Maya 里建了 UV1、UV2 来存光照贴图(Lightmap)数据,必须在 FBX 导出窗口的Advanced Options > UVs区域手动勾选导出所有 UV 集,否则 Unity 的 Lightmap 和自定义 Shader 会用错 UV 通道,表现就是贴图被拉伸成一片糊。
3. Unity 导入面板配置与核心问题排查
3.1 File Scale 与材质映射:一次“模型变得巨大”的现场排查
假设你已经导出了 FBX,拖进 Unity 后选中资源,Inspector 里会出现 Model、Animations、Materials 三个页签。Model 页签最顶部是 Model Scale,也就是我前面说的 File Scale。如果你在 Maya 里正确设置了单位为厘米,Unity 新版本会自动显示成 0.01,模型导入后就是“1 Unity 单位 = 1 米”的地球人直觉。但如果你打开别人的项目,发现 File Scale 变成了 0.001 或者 0.1,不用怀疑,要么是 Maya 里单位改了,要么是之前某个人手动改坏了。
File Scale 影响的不止是 Transform 的缩放。Physics 系统计算刚体碰撞体积时,用的是 Mesh 顶点坐标;Lightmap 烘焙时,使用的也是模型的世界尺寸;甚至 Camera 的 Near/Far 裁剪面都和这个比例密切相关。如果模型“看起来”在场景中心尺寸正确,但一加刚体就飞出去,或者摄像机贴近后模型被裁剪掉,先回来查 File Scale,十个里面有八个是它在作妖。
接下来说材质映射。Unity 导入 FBX 时,Materials 页签里的 Material Creation Mode 默认是 Standard。意思是:对于每个材质球,Unity 会尝试从 FBX 内部提取材质颜色和贴图,并生成一个 Standard Shader 的材质球。如果你的 Maya 模型用了 Arnold 材质或者 Redshift 材质,FBX 解析器根本读不出这些自定义属性,最后生成的就是纯白默认球。这种情况,我会选择在 Material Creation Mode 里选择Import via MaterialDescription(实验性),它有几率把 Arnold 的部分标准节点转换成 Unity 的 Shader Graph,但成功率看版本和复杂程度。更稳妥的做法是:在 Maya 里先把材质固定成 Standard Surface 或 Blinn,导出 FBX;Unity 这边用 Standard Shader,然后手动把 Diffuse、Normal、Metallic 贴图拖到材质球。这部分后面第四章还有补充。
3.2 包围盒(Renderer Bounds)异常解析:模型“漂浮”“被裁剪”怎么办
Unity 渲染器(MeshRenderer 和 SkinnedMeshRenderer)在导入时会生成一个 Axis-Aligned Bounding Box,叫包围盒,它决定了三个东西:遮挡剔除(Occlusion Culling)范围、相机的动态裁剪范围、以及阴影投射范围。包围盒一旦算错,后果非常魔幻:模型本身好好地在场景里站着,但相机一转,模型整个消失;或者阴影在一个莫名其妙的偏移位置出现一小块方块。
我遇到过一个印象很深的案例。同事导了一个带骨骼的机械臂 FBX 到 Unity,在 Scene 视图里挪了半天,但只要把 GameObject 的 Transform 移到某个位置,Mesh 就在 Game 视图里消失了。后来定位到问题:模型原本在 Maya 里没有做 Freeze Transform,模型的根节点带了一个很大的旋转和缩放值,Unity 导入器在计算 Model Bounds 时直接把网格的局部坐标和世界坐标混在了一起,最终包围盒算出了一个偏移的巨大矩形。模型本身没动,但裁剪和剔除判断全是错的。解决方式:回到 Maya 里 Freeze Transform,再配合 Unity 导入器把 Read/Write 打开之后重新导入,包围盒就正常了。
还有一个容易被忽略的细节:Unity 的 SkinnedMeshRenderer 包围盒是会随着骨骼动画运动的,而它默认是按照 T-Pose 计算一个最大范围。如果你的动画里角色做了一个大幅度的甩手动作,手的顶点完全越过了初始 T-Pose 包围盒的范围,那就会出现“动画播放时手部突然消失”的诡异现象。这个问题的正解不是回引擎里调包围盒,而是回 Maya,确保模型的 T-Pose 覆盖到所有可能的动画极限姿态;或者在 Unity 里手动把 SkinnedMeshRenderer 组件的 Bounds 做适当放大,直到不再出现顶点裁切。
3.3 阴影问题:Maya 世界观与 Unity 渲染管线的差异
Unity 里的阴影功能一直是个老大难。很多人从 Maya 转到 Unity 之后,第一反应是:为什么我的平行光打了阴影,模型上却全是条纹或者斑块?这背后其实是两个软件的阴影算法差异造成的。
Maya 的视口用的是一种软阴影近似,阴影边缘过渡非常柔和,而且受环境光影响大。Unity 不管内置管线还是 URP,实时阴影默认都是 Shadow Map,阴影边缘的软硬程度由 Shadow Resolution 和 Light 的 Shadow Normal Bias 控制。真正影响模型观感的通常是这两个参数:Shadow Normal Bias 和 Shadow Depth Bias。Normal Bias 的作用是把顶点沿法线方向推一丁点,避免阴影因深度精度不足而出现“阴影痤疮”(Acne)。但如果 Bias 给大了,模型接触地面的部分就会被削掉,看起来像模型“浮空”或者只有边缘接触,很多新手以为是模型没对齐地面,其实是 Bias 值在作怪。
另外一个我在实践中反复确认的坑:Maya 里建模型时,为了省面数会把地面做成一个巨大的平面,但是平面没有厚度,或者邻接的墙面与地面没有共享顶点。Unity 计算 Shadow Map 时,很薄的几何体常常因为在深度图上没有足够的精度而产生自阴影闪烁。要解决,最简单的方法是:给墙面、地面补一个小的挤出厚度,或者在 Unity 里把阴影的 Depth Bias 调大。别小看这个细节,在数字孪生项目里,室内的阴影闪烁是最常见也最影响观感的问题之一,尤其是 CAD 导出的建筑模型,面数不高,但全是薄壳。
还有一个平行光阴影、点光源阴影的选择问题。如果你要展示室内效果,用点光源和聚光灯做阴影会非常吃性能,因为每个光源都要生成独立的 Shadow Map。我在项目里通常会用 1 到 2 盏平行光配合 Lightmap 烘焙来解决静态物体的阴影,再用一盏实时方向光专门给动态物体投射阴影。模型上的阴影闪烁如果出现在动态角色身上,多半是 Shadow Resolution 不足,把 Light 组件的 Shadow Resolution 从 Low 调到 Medium,往往就稳了。
4. 进阶场景:骨骼动画、多材质与数字孪生项目里的实战
4.1 骨骼绑定与 Avatar 配置——当动画“七扭八歪”时先查谁的锅
如果你在 Maya 里绑了骨骼、K 了动画,导出 FBX 到 Unity 后发现模型动起来整个散架,第一步别怀疑 FBX 导出设置,先回 Unity 检查 Avatar 是否成功生成。Unity 对骨骼模型的处理分两套路径:Generic(通用动画)和 Humanoid(人形重定向)。人形重定向依赖骨骼映射表,如果骨骼命名不规范,Unity 在 Rig 页签会自动映射失败,动画导入后就会像一摊烂泥。
这里我分享一个经验:如果是普通角色,骨骼命名尽量使用 Unity 预设的 Humanoid 标准名字,Hips / Spine / Chest / UpperChest / Neck / Head / Shoulder_L这样。导出的 FBX 在 Unity 的 Rig 页面,把 Animation Type 设为 Humanoid,然后点 Configure 查看映射表是否全绿色。如果发现某个骨骼映射黄色甚至空白,别试图在 Unity 里硬调,回 Maya 检查骨骼是否有重复命名或者多了一层级联节点。
还有一类让人抓狂的问题:Maya 里动画预览完全正常,进入 Unity 后动画整体沿某个轴偏转了 90 度。这通常是 FBX 导出时没有勾选 Bake Axis Conversion,或者模型根关节的旋转分量没冻结。导出的根骨骼带一个 Local Rotation,Unity 把它当作动画的起点,整个角色的朝向就歪了。解决方式我已经在第 2.2 小节强调过:Freeze Transformations+Bake Axis Conversion。这两个动作做完,再重新导入,朝向问题基本绝迹。
4.2 材质与 Shader 映射——为什么你在 Maya 里调好的材质进 Unity 全变了
材质这块是我见过最多人崩溃的环节,也是跨引擎协作的“保留节目”。Maya 里你用一个 Arnold Standard Surface 把金属度、粗糙度调得美轮美奂,但 FBX 格式本身几乎没有承载完整 PBR 参数的能力,它只能记录最基础的 Diffuse 颜色、Transparency、反射色等属性。Unity 收到之后,所有 Arnold 调的高光、粗糙度、金属度小细节全部被丢弃,看到的当然是一坨白膜或灰膜。
解决思路绝对不是试图让两个软件通过 FBX 直接互通,而是明确一套对接规范:第一,约定渲染管线。比如 Unity 侧用 URP 还是 HDRP,材质球应该用 Standard 还是 Lit,这些在项目启动前就要定好。第二,在 Maya 里按“BaseColor + Metallic + Roughness + Normal”的工作流准备材质,不要只调一个 Arnold 表面。第三,FBX 导出时把贴图文件用 Embed Media 一起带上,或在 Unity 里手动给材质球赋值贴图。做这一步的时候,可以顺手检查一下贴图是 SRGB(颜色贴图)还是 Linear(数据贴图),Normal Map 要设置成法线贴图类型,否则方向会反或者效果完全消失。
一个小技巧:如果你的团队在 MAYA 和 Unity 之间频繁同步材质,可以考虑在 Maya 里使用 Unity 官方提供的 FBX Exporter 插件,它生成的 FBX 携带的材质参数更贴近 Unity 的默认解析方式,能省掉一大半手动调整时间。但插件也不是万能药,我仍然建议最终再跑一遍光照和材质检查。
4.3 数字孪生与大体量项目中的模型优化策略
数字孪生项目这几年特别火,而这类项目最大的特点就是模型多、场景大、数据杂。CAD、Revit 导出的模型乱七八糟就算了,DWG 文件动不动塞进几十万个碎面,直接丢给 Unity 用原生 FBX 处理,包你体验什么叫“编辑器彻夜卡死”。问题不见得是 Maya 需要干什么,而是整个模型进入 Unity 之前,必须遵守一套 LOD 和面数预算体系。
出模型时我会按用途分三层:高模层、中模层、低模层。高模层给产品展示或特写;中模层给常规场景;低模层用 Unity 的 LOD Group 做远距离渲染。这个分层在 Maya 里就开始做,不是等进了 Unity 才减面。减面用 Maya 的 Quad Draw、Remesh,或者外部工具做 Retopology,导出时高模中日模各存一个 FBX。到了 Unity 里,再用 MeshCombiner 之类工具把静态物体合并 Mesh 批次,减少 Draw Call。数字孪生场景里大量重复的楼层结构、桌椅设备,合并成一个 Mesh 或使用 GPU Instancing,性能提升是数量级的。
还有一点和大场景阴影强相关:数字孪生项目一旦场景面数上去,实时阴影的负担会陡然增加。我通常在 URP 里设置更保守的 Shadow Distance(比如 30-50 米),超过这个距离只显示 Lightmap 烘焙的光照,不处理实时阴影,否则哪怕机器配置再好,运行一段时间后帧数也会以五分钟为单位骤降。
5. 通用问题速查表与我的“最后一公里”经验
5.1 高频问题速查表
| 问题现象 | 推荐勾选/检查项 | 参考章节 |
|---|---|---|
| 模型进入 Unity 后尺度不对 | File Scale 设置为 0.01,或在 Maya 里开 Bake Units | 1.1, 3.1 |
| 模型沿轴翻转或躺倒 | 勾选 Bake Axis Conversion,Freeze Transformations | 1.3, 2.2 |
| 贴图在 Unity 里丢失/变紫 | 打开 Embed Media,或把贴图放进 Assets 并用相对路径 | 2.4, 3.1 |
| 阴影闪烁/模型接触面“烂掉” | 调整 Shadow Normal Bias 与 Depth Bias,给薄片加厚度 | 3.3 |
| 动画播放时模型部分消失 | 回 Maya 看看 T-Pose 是否覆盖动画极限,手动放大 SkinnedMeshRenderer Bounds | 3.2, 4.1 |
| 动画导入后角色朝向错误 | 检查根骨骼 Local Rotation,冻结变换后重新导出 | 2.3, 4.1 |
| 带法线贴图但光斑错乱 | 确保 FBX 导出包含 Tangents,Unity 材质球正确设置法线贴图类型 | 2.2, 4.2 |
| 大场景实时阴影拖垮帧率 | 缩短 Shadow Distance,使用 Lightmap + LOD | 3.3, 4.3 |
5.2 一些和文档无关的习惯
每次做完一个资产的导入,我会在 Unity 的 Project 窗口里把 FBX 的 Model 页签扫一眼,把 Mesh > Read/Write 选项打开(前提是资源不是特别巨大)。这一步不是为了刻舟求剑,而是很多需要运行时动态修改网格的功能,比如切割、变形、MeshCollider 更新,都必须依赖 Read/Write 标记。默认状态下 Unity 为了内存安全是关闭的,等你某个功能运行时突然报 “Cannot access a mesh because it is not readable”,才想起来去开,那就要多等一次全量重新导入,项目大一点能打断一整天的节奏。
还有一个习惯:每次从 Maya 导出到 Unity 之后,我都会手动把 Unity 生成的同名 *.meta 文件一起提交到版本库。Meta 文件在多人协作里非常关键,它记录了 GUID 和导入参数。如果两个人同时操作一个 Unity 项目,其中一个人把 FBX 换了但没提交 meta,另一个人拉下来,资源引用就会全套失效,重新做一张 Prefab 的时间成本够你做三个模型。
最后再分享一个不一定写在文档里的经验:在做完材质映射和阴影调整后,不要急着继续下一项。先新建一个空场景,只放一个最简单的 Plane 和方向光,把模型拖进去跑一遍,关掉灯光阴影,再开阴影,对比一下,确认模型本身没有自带一套“隐形法线问题”。这是我多年下来最省时间的一个小仪式,能帮你把“Maya 端问题”和“Unity 端问题”快速隔离开,而不是在两者之间来回改,心态爆炸。
5.3 当一切正常之后,再往深走一层
有的读者可能觉得,模型能放进 Unity、能显示、能跑动画,就算大功告成了。但真正的项目交付,尤其在数字孪生、医疗、教育类可视化场景里,后面还有的是活儿。模型优化、LOD 制作、纹理图集、光照烘焙、性能分析,每一项都是独立的技术栈。我个人的建议是:新手期先把本章节前面的导入流程跑顺,把常见问题的排查路径烂熟于心;等你有余力了,再去研究 URP 里的 SRP Batcher、GPU Instancing、动态遮挡剔除这些性能杀手锏。引擎这东西,看起来是“丢进资源就完事”,实际玩久了就会发现,能静下心把每个节点细节咬准的人,才是在团队和项目里真正不可替代的人。