参考
当3dMax遇上Unity3d---模型导入的前后你需要注意的地方(非常推荐)
Unity动画系统详解2:如何导入使用外部的动画?
Unity3D游戏美术全攻略:从入门到精通
Unity游戏动画 从入门到住院:动画状态机
这两篇从美术角度讲解的非常细致,注意部分参数选项和Unity 2019.4.1f1版本不一致
在Unity中只能制作比较简单的动画,要想要复杂的动画,比如人物跳舞的动画,那就得在外部的软件中制作并且导入到Unity中使用,那这个过程是什么呢?
一、美术导出FBX
大多数情况下,含动画的模型导出的fbx文件会同时包含网格信息和动画信息,但是也有一些情况fbx文件只需要导出动画信息。例如同一个模型有很多动画,网格信息只需要一个就够了,其他动画信息可以通过单独的模型文件(不包含网格信息)导出,可以减小Unity工程的体积。
有些情况下,动画是基于特定模型制作的,不能在其他模型上重用。例如,游戏中的终极Boss巨型章鱼会有独特的骨骼,以及自己的动画。
在其他情况下,美术同学在制作动画时应该考虑动画的重用,用于场景中同类的模型。例如,不同的人形角色可能都使用相同的走动和跑步动画。只要保持骨骼结构一致,动画就可以重用。
1.导出模型和动画
模型文件要导出mesh、 骨骼、 蒙皮信息、 材质和其他与mesh相关的部分。贴图文件不要在的导出的时候勾选,否则会在维护的时候带来不必要的麻烦,只要手动把贴图拷贝到指定的文件夹下,在引擎中重新指定即可。需要注意的是mesh、材质的名字在引擎中修改比较容易出错,所以一定要在max中改好mesh、材质的命名再进行导出。
下图是导出时需要注意勾选的地方,skins是蒙皮信息morphs是顶点变形动画(表情动画)embed media是贴图文件。
2.导出分为直接导出和导出选定对象
直接导出的话,在你的max中所有的东西,看得见的如mesh和看不见的如particle view统统都会被导出,你需要导出的骨骼模型和你不需导出的辅助体dummy点也都会被导出。但你不必紧张,我们进了u3d可以编辑这一切,只留下我们需要的内容,其他部分则不会被打包进入游戏占用资源。所以通常我们只要直接导出就好了,但是有时候如果遇到处女座的程序员,他们会要求资源的简洁规范,以及视觉上的整齐干净,不许存在不能♂用的东西,此时你就需要导出选定对象。导出选定对象的话,就是你选了什么就导出什么,也就是说如果一个完整的动画导出时你只选择了一根骨骼的话,则只会导出这个根骨骼的动画。
因为导出选定对象一不留神就会出错,如果资源量庞大,维护成本会非常大。仅仅是为了满足你猿的无理需求需要耗费本宝宝的多么大的精力,而且毕竟是人力维护,不可能完全不出错,一旦出错检查修改都要时间。
二、Model页签
参考
Unity Learning Notes:Models Import 01
为Unity3D创建素材(2):模型、绑定、动画
Unity优化-Model/Mesh相关通过控制选项进行部分优化
1.Scene部分
- Scale Factor:调整模型在场景中的比例。前期设定好,跟美术沟通好,节省后期时间。理论上都应该是1,也就是模型的原大小。但也有可能是0.1或者10之类的,跟你max的单位设置有关,无论是几都可以,只要跟其他模型是统一的就OK。
Unity3D中默认 1单位距离 = 1米。由于Maya中默认设置为 1单位距离 = 1厘米,所以Maya模型导出成.fbx以后再导入Unity3D,要设置scale为0.01,否则就会变得超级大。
- Convert Units:可以将模型中定义的单位转换为Unity中的单位,例如3ds Max中使用1个单位表示10厘米,而Unity一个单位表示1米。这里的Convert Units勾选与否,是决定是否启用模型自身的尺寸单位,一般我们会按照1中提到的正常模型比例在3dMax中就设置好需要的模型的尺寸大小,并启用Convert Units。如果不勾选Conver Units 则会使得模型自身的尺寸设置失效,即忽略3dMax中的单位设置,3dMax中模型尺寸的1单位被直接解释为unity中的1m
- Import BlendShapes:导入Mesh上的BlendShapes。对于一些细微的表情等动作,使用骨骼有点过于复杂和浪费,可以预先设计几张表情,然后通过BlendShape来进行表情的过渡。
这里Blend Shape 是一种脸部动画的播放方式,通过预设脸部网格对应不同通道值的扭曲程度,来进行脸部动画的播放。Blend Shape其实实质是一种网格扭曲的混合通道绑定,其实也可以用于实现其他的网格混合扭曲效果。Blend Shape是Maya所创建的一种混合扭曲的组件,3dMax中使用Morpher完成同样的功能,同样需要勾选这个设置属性来完成导入。
- Import Visibility:导入可见属性用以保证可以读取FBX中的可见属性来禁用或启用unity中的MeshRender组件去渲染物体。模型动画如果涉及了模型可见属性的改变则需要勾选,来保证unity正常读取可见属性。
- Import Cameras/Import Lights:是否导入摄像机/灯光。unity可以直接导入Fbx上的相机和灯光的参数。不推荐从3dMax中导入摄像机与灯光,而使用unity中创建的摄像机,灯光,来完成渲染。
- Preserve Hierarchy:如果不勾选,则unity会自行剔除模型中的所有空节点,对于那些只包含空节点用以表现模型动画的FBX文件来说,这会导致动画Rig不匹配。如果勾选,即使只有Root节点unity也会创建一个显示的预制根节点作为父物体。
并且我们发现3dMax中导出时的自动轴转转化设置在勾选了之后Preserve Hierarchy才会生效,但我们更推荐按3中提到的,来手动设置出合适轴向,一般我们保持这一项不勾选,所以导出时也不必在意是否勾选了自动轴转化,而使用我们手动旋转好的轴向。 - Sort Hierarchy By Name:是否通过名称对层次结构进行排序
2.Mesh
- MeshCompression:网格压缩,亲测质量差距比较大,不太建议开启。使用时最好让Mesh看上去没变太多。
- Read/Write Enabled:开启Read/Write Enabled一般是用于运行时修改Mesh的顶点数据,开启这个选项会导致Mesh的内存占用翻倍。因此如果项目中不需要在运行时修改这些Mesh数据的话,我们建议把这个选项关闭。
- Optimize Mesh:优化网格,如果开启,网格的定点和三角形会按照U3D既定的一套规则重新排序用以提高GPU性能。看样子可以开启
- Generate Collider 如果开启时,Mesh导入时会自动生成MeshCollider,这个比较适合环境中静态的物体,不适合那些有动作形变的物体。人物模型不适合开启,建筑模型合适。
3.Geometry
- KeepQuads 保持四边形,不转换为三角形。我们在U3D中使用的网格,大部分是把所有的面都转换成了三角形,但是某些特定的需求下,四边形会得到更好的效果,例如Tessellation shaders(细分曲面着色器)。
- Weld Vertices 顶点焊接,合并处于同一位置的顶点,这样可以整体减少mesh的顶点数。通过顶点焊接可以优化顶点数量,获得更好的渲染性能。但如果需要脚本中动态控制网格,模型故意设有位置相同的顶点时应取消勾选
- Index Format unity在导入网格时使用的索引表示长度。通常Auto,在使用基于GPU的渲染管线编程时,通常使用32位。Auto时将取决于网格的大小;16bit时若网格顶点较多将进行顶点分块,分块后每个顶点块<64k个顶点,这是unity 2017.2或之前版本的设置;32bit时可确保所有网格使用相同的索引格式,这可以降低着色器顶点处理的复杂性。
- Swap uvs 这个选项只能交换第一套和第二套uv,如果导入的模型uv混乱可以试着勾选一下,如果fbx上有更多套uv,可能得通过代码来控制了。
- Generate LightMap Uvs 为模型展开一道UV以接受unity中的光照烘焙(非实时的渲染光照)效果,从而将烘焙光照以光照贴图的形式表现在模型表面。注意!!!场景中的静态物体模型,需要接受Unity光照烘焙的物体模型,一定要进行这个UV展开
- Normals:法线定义
- Import:从模型中导入法线,如果模型不包含法线则会计算法线,这是默认选项
- Caculate:根据 Normals Mode、Smoothness Source 和 Smoothing Angle属性来计算法线。
- None:如果网格不需要法线贴图,也不受实时光照影响(各光照模型的计算都需要法线数据)应选择此项
导入模型时,可以选择直接导入模型中的法线和切线、也可以选择使用unity自动计算法线和切线、也可以不导入法线和切线。具体的参数,不太懂,如果美术资源提供了法线和切线、直接import就行了。
三、Rig页签
1.Animation Type
- N是不导入动画。
- L是4.0版本以前的动画系统,是比较老比较保险的动画系统,提供的功能比较少,但是也不会出什么错误,适合非常简单的游戏。为了兼容Unity3.x旧版本,不建议使用
- G和H是在4.0版本时同时推出的两套动画系统,他们有很多共性,比如都有自带的状态机、自带动画融合、自带Avatar等。比较大的区别就是H这个动画系统是专门用来做类人型两足生物的,它提供了动画的重定向,就是说它提供了一套动画赋予给多个体型不同的模型的解决方案。
2.Avatar Definition
Avatar替身是unity为管理骨骼动画所创建的一种保持节点信息的文件,通过在Animator中指定所需要用到的Avatar,Animator动画状态机在运行时就能根据Avatai中提供的节点信息,寻找子物体中的对应节点并对其赋予动画的控制,完成骨骼动画与含骨骼绑定的模型的适配。
这里的替身来源主要有两个,
- 从该模型创建出一个Avatar替身
- 使用其他模型配置好的Avatar替身
创建出的Avatat替身文件,尤其是人形骨骼的Avatar替身需要进行配置工作,绑定骨骼,设置初始T-Pos,通过复用其他模型创建好的Avatar替身可以减少繁杂的配置操作,尤其是我们导入只包含骨骼动画的FBX时,复用角色模型的Avatar替身就可以快速完成骨骼动画于人物模型的适配。
3.Optimize Game Object骨骼节点嵌入优化
仅在替身来源为从该模型创建时可用
选择后将在实际应用模型时,剔除FBX中的骨骼节点,节点信息将保持在Avatar 和 Animator中,即将骨骼节点嵌入到动画系统内部,以保证更高效的节点提取和变换。模型的SkinnedMeshRenderers蒙皮渲染使用动画系统内部的骨骼节点,蒙皮网格的矩阵提取也将变为多线程,从而提高渲染效率。
对导入模型进行优化后,Unity将不会为骨骼创建实际的游戏对象了(我们也可以暴露出一些骨骼作为挂点)。
除此之外,Unity还会将计算骨骼矩阵的操作放到工作线程中,来减少主线程耗时。
3.Skin Weights
设置有多少骨骼会影响蒙皮,骨骼数越多,动画越精准,但是计算量越大,对性能要求越高。
- Standard(4 Bones):4块骨头
- Custom:自定义,可以设置最大的骨骼数量以及最小的影响权重
4.Root node
仅在骨骼类型为非人形骨骼,且从该模型创建Avatar替身时可选。为非人形骨骼绑定指定一个根节点骨骼,一般需要选中骨骼的根节点。
5.配置骨骼重定向
H动画系统在这个页面没有根骨骼的指定选项,但是有个神秘的按钮Configure
左边的小图标,对勾或叉,代表unity是否自动完成了模型骨骼与标准人形骨骼的绑定。但由于T-Pos标准姿态问题,即使为对勾,我们也需要点击该项去检查T-Pos是否正确。
在通过Animation窗口进行动画制作时,我们就应该知道,所谓的动画,就是对于当前节点,以及当前节点的子节点,一系列属性对于时间的差值控制。能够应用动画片段的前提就是该节点以及该节点的子节点层级结构,以及所拥有的动画属性与参与动画片段的属性能够对应。
Avatar的存在主要是为了解决人物动画的复用问题,不同来源的FBX中,对于骨骼节点的层级结构,以及命名可能不尽相同。因此Unity以Avatar作为一个中介,不同的FBX都对Avatar中的标准人物骨骼结构去创建映射关系,将动画片段中的人物骨骼节点,映射到标准人物骨骼结构中,建立对标准人物骨骼结构的映射关系。
在Animator状态机进行动画控制时,依照人物模型创建的Avatar,将人物动画片段对标准人物骨骼中的节点控制,映射到当前的人物模型当中。从而就实现了对不同来源FBX中,人物动画的复用。
那个小绿人,暂时还没搞清楚……
四、Animation页签
1.Import Constraints
是否导入Constraints(约束)。美术同学可能知道在3D建模软件中有Constraints设置,用来添加一些约束。Unity支持5种约束的导入。目前用到的较少。
2.Import Animation
是否导入动画,如果不勾选代表不导入动画,下面的选项也会隐藏。
3.Bake Animations
解析并烘焙使用了 IK反向动力学 或 Simulation仿真模拟 创建的非帧动画,转化为使用关键帧储存运动信息的通用动画格式。通常不可用,因为我们通常导入的FBX文件中如果包含动画,本身就是帧动画的形式。
4.Resample curves
解析动画曲线,并重采样为四元数的形式。默认启用,在原动画存在关键帧间差值时,为保持原有曲线应禁用此项。
5.Anim. Compression 动画压缩
- Off 禁用压缩。Unity不会减少关键帧,这个选项能提高动画的精度,但是会降低运行时性能,存储空间和运行时内存占用都会变大。一般不建议禁用压缩,但如果你需要非常精准的动画,禁用后可以得到原始动画,不会有压缩精度误差。
- Keyframe Reduction 根据设置的误差值移除关键帧。
- Optimal Unity自动决定如何压缩。根据设置的误差值移除关键帧并且压缩关键帧。这只会减小动画存储空间占用,运行时内存占用和 Keyframe Reduction 相同。
这里一般使用默认的Optimal最佳模式就好
6.Anim. Compression 不选择Off时,会显示下面三个选项
- Rotation Error 旋转变化小于这个误差的关键帧会被删除。值越小动画越精确。
- Position Error 位置变化小于这个误差的关键帧会被删除。值越小动画越精确。
- Scale Error 缩放变化小于这个误差的关键帧会被删除。值越小动画越精确。
决定压缩多大精度变化下的旋转,移动,缩放曲线,值越小精度越高,值越大压缩比率越高
7.Animated Custom Properties
通过FBX文件中设置用户自定义属性,以及extraUserProperties传入与FBX中相同的名称,unity可以通过传入Assert后处理器,来链接FBX中的用户自定义属性设置。
8.分割动画
有时出于制作的和修改的方便,我们会把几个动画做在同一个动画文件里面,这样就需要在unity里面将他们切分开。点击+-,增加或删减动画片段,然后再橙色框选处重命名当前选中的动画,蓝色部分修改动画的起止帧。
补充一下橙色部分相关的内容,unity标准的动画命名格式是 ?模型名@动画名 如boss1@idle ? 这样导入进来之后unity会自动给这个动画命名为idle而不是Take 001。
点击加号可以创建一段新的动画,可以在下方设置该段动画在完整动画中的起始帧和结束帧。设置时,可以下下方预览窗口查看当前移动位置的动画状态。
在拖动起始、结束箭头时,能看到下方会显示4条曲线,右方有4个灯,会显示绿色、黄色或红色。从上到下依次是:
- 姿态循环:角色的姿态是否在剪辑开始与结束时相似
- 方位循环:角色根节点朝向的方位,是否在剪辑开始与结束时相似
- Y轴根节点运动循环:角色的根节点,在Y轴高度方向上的位置,是否在剪辑开始与结束时相似
- XZ平面根节点运动循环:角色的根节点,在XZ平面上的位置是否在剪辑开始与结束时相似
其实这些是为了方便你在剪辑动画时,能更好地剪出循环的动画。比如一个跑步的循环动画,起始帧人物各个骨骼的位置应该和结束帧人物各个骨骼的位置一致,动画循环时才不会出现跳动的现象。绿灯代表开始帧和结束帧符合,黄灯代表有些不符合,红灯代表一点都不符合。但是也不能追求4个全绿灯,因为4个灯代表了4个不同的位置类型,有些情况下是不同的。
9.Bake Into Pose
将角色对应属性的变换植入到身体(Pose)的运动中,让根节点对应属性的运动不发生改变。
注意!!!即使姿态属性评价为红色。也可以勾选Bake Into Pose ,但此时动画播放完后,身体姿态会与根节点出现很大的偏移,进行状态机混合时就会出现身体姿态的突变。勾选Bake Into Pose,将消除根节点对应的运动属性,在切片播放时,角色对应的旋转/位移,将不会被植入到Unity中(apply root motion勾选)
通常需要某个姿态属性循环(恒定)的切片,我们应保证剪辑时评价为绿色,并勾选LoopPose/Bake Into Pose
10.Based upon
对应属性的改变要以什么为参照(通常保持默认即可)
- original 引用FBX文件中原先的位置,方位坐标,并以此为参照,通常对Y轴启用,对Rotation启用可能导致人物初始朝向不是Z轴正方向,对XZ平面启用可能导致人物不在原点位置
- Body Orientation 按身体的朝向变化为参照,通常对Rotation启用
- Center Of Mass 按身体重心位置为参照,选定时,身体重心位置会被至于原点,通常不对Y轴启用,而对XY平面启用
- feet 按脚底的Y轴高度为参照(Y轴高度的另一个参照)
11.Loop Time
动画循环设置,勾选之后动画就会循环播放,这个循环是指在状态机里循环播,讲到状态机我会再说一次这个问题。
12.Loop pose
可以理解为位置循环。比如动画是向前走了一米,再循环播第二次的时候,是在一米的位置播还是原点的位置播取决于这个选项。
13.Cycle Offset
字面意思是循环抵消。可以理解为是播放延迟。假设一个40帧的动画,这里填0.5的话,动画就会从20帧的位置开始播。具体应用:我随便说你们随便听吧,这个功能估计没几个人用得到。假设一个突突突的射击游戏,有朝左跑和超朝右跑的动画,并且动画是镜像复制出来的(镜像方法下面会说),并且需要给动画做融合左跑右跑无缝切换。左跑动画的第一帧迈的是左脚,又跑是镜像过去的,那第一帧自然是迈右脚的,这样就是无缝的啦!那我们就在又跑的Cycle Offset填上0.5,OK他会从动画的中间开始播也就是先迈左脚了。
14.其它参数
- Rotation Offset:可以设定旋转的初始偏移
- Y Offset:可以设定Y轴高度的初始偏移
- Mirror:左右镜像翻转动画,可以节省动画师的工作量
15.Curves
我们可以通过Unity的曲线编辑器,配置一条或多条曲线。
曲线的横轴将以动画播放的百分比进程为时间轴,纵轴将是曲线的一个输出值,我们可以利用Controller中的一个float动画参数作为映射输出,从而在执行动画的过程中,获得我们预先配置好的数值变化的效果。
利用AnimationCurve,我们可以将输出值应用到脚本控制中,实现一些特殊的效果,例如配合人物的动作对特效表现做出改变,在进行翻越跨越动作的同时动态改变碰撞体。
曲线的名称需要与float动画参数的名称一致,从而绑定一个动画参数作为输出映射。
曲线的编辑需要结合下方查看动画,观察不同阶段的百分比进程,从而对横轴进行把控。
- 可以有多个片段中的曲线使用相同的名称,对同一动画参数进行输出映射
- 如果某个片段中没有对应的曲线使用映射参数,则动画参数的值会被置为0
- 当从一个无映射的片段过渡到一个有映射的片段时,数值会在过渡中从0被逐渐置于曲线的开头数值(融合效应)
- 当从一个有映射片段过渡到无映射片段是,数值会在过渡时,从原映射值向0过渡,忽略后面的曲线
- 当片段被循环播放时,从末尾到开头的部分将会产生融合,可能导致曲线变形
- 其它类似的过渡同理,都会在过渡过程中通过融合产生数值的变化,避免数值的突变
注意!!!循环片段,末尾与开头的融合可能导致实际输出曲线变形,数值不按照曲线的走势变动。因此针对循环播放时,末尾与开头的数值必须一致,否则受融合效应的影响,曲线将会产生变形,实际数值的变换不会按照曲线走势正确输出。如果开头末尾数值不一,那么片段必须是非循环的,才能正确输出。
推荐采用开头末尾均为0,中间数值进行所需变动的曲线模式,这也要求动画师在制作一些特殊动作时,要有头有尾。
16.Events事件
这个主要是给程序用的,在动画的时间轴上加一个事件点,程序可以检查到这个事件点,然后执行某个命令。比如在攻击动画的某一帧加事件点,作为播放特效的通知。
在游戏运行时,播放到对应关键帧位置时,会通过反射,查找Animator组件所在物体,挂载的脚本中,是否有对应名称的可触发方法,并传入预设的传参
public void Animation_EventLog(int n)
{
Debug.Log("On Animation Event!!!" + n);
}
在Animator组件所在物体上,添加以上脚本。然后将Events上的Function名称改为Animation_EventLog,参数Int改为22,点击Apply后,即可测试
17.Mask
这部分是说使用动画本身的遮罩还是从别处获得动画遮罩,这个遮罩的用处是屏蔽一部分肢体的动画,那具体怎么用我们放到动画状态机部分来讲。
五、Materials页签
1.sRGB Albedo Colors
设置材质颜色反射率
- 启用时为伽马颜色空间的反射率
- 禁用时为线性颜色空间
2.Location
材质位置
- Use Embedded Materials 材质被嵌入保存在FBX文件中,这是现在3dMax导出FBX时的材质保存模式
- Use External Materials (Legacy) 材质从外部提取,这是旧的材质保存模式,在导入FBX文件的同时会在FBX文件外部创建出材质
3.Use External Materials (Legacy)外部材质提取式的相关设置
可通过下方的Naming 以及 设置 范围选项来查找对应范围的材质,并按照FBX文件中的材质映射赋予材质
无法重建材质映射
使用了新版的Use Embedded Materials 嵌入式材质保存的FBX模型也可以选择使用这个旧模式来将内部储存的材质外放
这可以使得材质能够被再次修改,且如果外部材质丢失,会自行从FBX中尝试提取一次材质,包括材质贴图,有时具有找回材质的作用
目前Revit导出的FBX模型仍是使用这种旧版的材质储存模式,需要通过选择这个模式将跟随FBX的隐藏文件夹中的材质解析出来,材质的贴图也被保存在外部的隐藏文件中,需要通过这个模式进行解析获取