3ds Max导出FBX

导出模型

  1. 选择模型、所有具有蒙皮信息的骨骼、B_Root,如下:

  1. 导出选定对象
  2. 选择导出的目标文件夹以及文件名
    • 导出设置勾选Skins(蒙皮)以及Morphs(变形)

      Morphs是顶点变形动画(表情动画),Maya里叫BlendShape,Unity里采用的是Maya里的叫法。
      我们项目并没有用到Morphs,其实可以不选这一项。
      导出ASCII格式的FBX对比发现,选不选Morphs对最终的FBX文件并无影响,不同的只是时间戳和一些ID之类的内容。

    • 勾掉烘焙动画,模型文件不需要导出动画,动作文件才要
  3. 点“确定”,导出

导出动作

导出步骤基本同导出模型,只是导出时不要选择模型,选择具有蒙皮信息的骨骼和B_Root即可。导出设置也跟模型相反,不要勾选蒙皮和变形,要勾选烘焙动画

一键导出FBX

手动导出FBX费时费力而且容易出错,比如漏选或多选模型、骨骼(并不是所有骨骼都有蒙皮信息,有些骨骼是美术用来做辅助用的,不需要导出。所以在全选骨骼后,还要反选多余的骨骼)、导出设置选错之类。

这种一成不变的步骤最好工具化,提升效率,减少出错。

放在svn://192.168.15.9/client/tools/一键导出FBX/,使用MaxScript实现,拖进3ds Max窗口即可使用。

  • 自动根据.max文件名区分导出模型还是动作
    • 模型编号_skin.max文件导出模型skin.fbx
    • 模型编号_动作名.max文件导出动作动作名.fbx
  • 自动选择对应的导出对象
    • 导出模型:选中模型、所有蒙皮相关的骨骼、B_Root
    • 导出动作:选中蒙皮相关的骨骼、B_Root
  • 自动选择对应的导出预设文件
    • 模型:svn://192.168.15.9/client/tools/一键导出FBX/skin.fbxexportpreset
    • 动作:svn://192.168.15.9/client/tools/一键导出FBX/anim.fbxexportpreset
  • 自动导出至客户端对应目录下,并创建模型编号子文件夹:
    • 玩家:svn://192.168.15.9/client/develop/Assets/Art/Character/PC
    • 怪物:svn://192.168.15.9/client/develop/Assets/Art/Character/Monster
    • 机关:svn://192.168.15.9/client/develop/Assets/Art/Character/Trigger

杯莫停的模型&动作资源与我们存在的差异

  1. 杯莫停的模型没有逻辑上的B_Root骨骼,我们游戏中需要B_Root作为Root Motion用到的Root Node。
  2. 杯莫停有些角色的武器跟人物模型是分开的,而我们游戏武器跟角色是做在一起的。
  3. 有些skin文件跟动作文件的骨骼对应不上(比如Male_F_NR_01-凝蓉),不过可以直接用动作文件导出蒙皮信息
  4. 模型大小的差异(比如凝蓉才不到2米高,龙姬高2.7米)。Max里应该可以方便的放大一些?

FBX导入Unity

导入参数设置

Model

  • Scale Factor: 0.01Unity默认1个坐标单位1米,3ds Max里是1厘米

    http://blog.dou.li/unity3d-import-3dmax-model-scale.html

  • Mesh Compression: Medium压缩Mesh可以降低包体大小,但不会减少内存占用;

    压缩动作则包体大小和内存占用都会降低

    https://docs.unity3d.com/Manual/ReducingFilesize.html

  • Read/Write Enabled: Disable降低内存开销,enable会导致Mesh一直在内存中

    用到MeshColliders或需要对Mesh进行非统一缩放时才需要开启此选项

  • Optimize Mesh: EnableTick this checkbox if you want Unity to determine the order in which triangles are listed in the Mesh

    The vertices and indices will be reordered for better GPU performance

  • Import Blendshapes: enableBlendShapes是maya里的说法,3ds Max中叫做Morpher也就是表情动画。

    美术说我们项目没有用到morpher,那应该可以disable。

  • Generate Colliders: disable不需要碰撞,角色预制上会加一个Character Controller来简单处理
  • Swap UVs: disableTick this checkbox if lightmapped objects are picking up the wrong UV channels. This swaps your primary and secondary UV channels.
  • Generate Lightmap UVs: disable主角全部是disable

    目前只有少部分机关和怪物enable(恶人谷的大蜘蛛2418、炮台2312,都差不多算是场景中的固定物件吧)

  • Normals:meta文件中叫 normalImportMode

    主角: 38 Import, 25 Calculate,0 None

    怪物: 53 Import,117 Calculate,1 None

    机关:75 Import,11 Calculate,0 None

    没有用到法线贴图、不接收实时光照的可以勾选None

    目前并没有统一规范,全看心情?

  • Tangents:meta文件中叫 tangentImportMode

    玩家:38 Import,25 Calculate,0 None

    怪物:53 Import,117 Calculate,1 None

    机关:75 Import,11 Calculate,0 None : 0 Import(33个), 1 Calculate, 2 None(29个)

  • Materials: disable不需要导入材质,创建预制的时候指定

Rig

  • Animation Type: Generic是否可以考虑尝试Humanoid Animation
  • Avatar Definition:skin选Create From This Model,动作选Copy from other Avatar(从skin.FBX中拷贝)
  • Root node:动作带位移的角色需要设置为B_root,否则None

    都选B_root应该也不会有什么影响?

    When working wth humanoid animations, Unity can determine the center of mass and orientation of the rig. When working with Generic animations, the skeleton can be arbitrary, so you must specify which bone is the Root node. The Root node allows Unity to establish consistency between Animation clips for a generic model, and blend properly between Animations that have not been authored “in place” (that is, where the whole model moves its world position while animating).

    Specifying the root node also allows Unity to determine between movement of the bones relative to each other, and motion of the Root node in the world (controlled from OnAnimatorMove.

  • Optimize Game Object: disableUnity技术人员对此选项的解释:

    It's neither skinned mesh combine, nor texture atlas builder.

    What it is: instead of having 70 (or whatever) game object hierarchy with Transform components on each, it keeps at that "internally" (in a nicely packed arrays for performance). Since we found out that in many cases it's not the actual skinning or animation that's costing time - it's just recomputing the transform matrices from the hierarchy and sending update notifications to the transform components.

    So what the optimization does, is it reduces the number of game objects in your rig. This means way fewer cache misses, smaller memory consumption, ability to multi-thread skinning matrices computation, and way less transform update notifications.

    开启后骨骼挂载点会收进Avatar和Animator组件内,但我们的游戏逻辑有依赖挂载点,比如在角色身上播放特效,从角色的某个部位发射投射物,都是需要获取挂载点位置的。

    是否可以规范用来做逻辑的挂载点,然后添加到Extra Transforms to Expose?或者干脆不让用骨骼做挂载点?

    https://unity3d.com/cn/unity/whats-new/unity-4.3

    https://forum.unity3d.com/threads/unity-4-3-optimize-game-object-on-rig.198110/

Animations

  • Import Animation:顾名思义,模型文件disable,动作文件enable
  • Bake Animations:.FBX文件此选项不可用,.max文件可以
  • Anim. Compression: Optimal优化包体和内存,但动作可能会失真
  • Rotation Error/Position Error/Scale Error: 0.5Defines how much rotation\position\scale curves should be reduced. The smaller value you use - the higher precision you get.

    目前全是0.5, 可以再开高一点么?网上有个经常跟程序撕逼的美术都允许开到0.8

Animation Clip

  • name:导入后默认为Take 001,要改成真正的动作名,只改.fbx文件名是没用的

    还有一种方式,将.fbx文件名改为模型名@动作名.fbx的格式,导入时clip的默认名字就是正确的动作名了

  • Start/End:clip的起止帧

    我们有些动作的.fbx文件包含比实际用到的clip更长的动作信息,比如斗神的有些技能动作分段,是拷贝多份.fbx文件,然后每个.fbx文件只用其中的部分帧

    其实技能动作的拆分不用拷贝.fbx文件,直接在.fbx里拆分成多个clip就行

  • Loop Time:循环动作需要enable,比如guard、idle等,其余disable
  • Loop Pose: disable开启后循环更平滑。(开启后发现Apply Root Motion不起作用了)

    disable:

    enable:

  • Cycle Offset: 0循环开始的偏移量,我们都是0
  • Root Transform Rotation / Root Transform Position(Y) / Root Transform Position(XZ)Root Motion相关,{% post_link Unity-Root-Motion 看这里 %}
  • Mask:勾选哪些骨骼受动画的影响
  • Curves:设置一些跟动画相关的参数,没用用到。
  • Events:动作打点相关