Unity3D游戏美术全攻略:从入门到精通
Unity现在已经用的很广泛啦,可是却一直没有什么美术向的教程。
程序用方面的内容在各个论坛都有讨论,但是美术似乎很弱势啊。
明明美术也很需要掌握引擎方面的内容嘛!
山谷里的野百合还有春天呢 我们美术也要出教程!
这次选了本菜鸡比较不那么菜的细分领域?unity3d 3D美术模块 来讲
美术小伙伴们肯定是懒得看那么多字啦,所以我就写的尽量有意思一点吧……
计划是从入门到住院全部讲完的,但是能不能讲完我也不晓得,挖坑不填什么的最开心了
至于为什么是从入门到住院,因为学了这套东西,你就具备了在项目中跟程序撕逼的实力
指出程序员的错误 提出有效的解决方案 拳打南山老策划 脚踢北海程序员
(啊哈哈哈,开玩笑啦,研发组的小伙伴是要相♂亲相♀爱啊……)
但是考虑到程序们单身多年 膂力惊人 我猜你最后的下场肯定是住院……
OK现在我们已经做出了一套牛逼酷炫屌炸天的动画了 <ignore_js_op>
接下来我们需要在引擎里面看到它,并且配置好一切让程序老爷(猿)能顺利的使用它,这是我接下来要跟大家分享的事情。 <ignore_js_op>
我们需要从max中导出格式为FBX的文件供引擎使用,导出的文件通常要分成绑定的模型和动画两种,导出的方式也分为直接导出和导出选定对象两种。
模型文件要导出mesh、 骨骼、 蒙皮信息、 材质和其他与mesh相关的部分。贴图文件不要在的导出的时候勾选,否则会在维护的时候带来不必要的麻烦,只要手动吧贴图拷贝到指定的文件夹下,在引擎中重新指定即可。需要注意的是mesh、材质的名字在引擎中修改比较容易出错,所以一定要在max中改好mesh、材质的命名再进行导出。
下图是导出时需要注意勾选的地方,skins是蒙皮信息morphs是顶点变形动画(表情动画)embed media是贴图文件。
动画文件要导出的主要就是动画信息,注意 动画文件的骨骼结构及命名必须跟模型文件的一致,否则会导致动画丢失。如果使用的unity的老版本是不支持link链接、prop骨骼等,所以导出的时候要勾选烘焙动画。如下图:
导出动画之后,通常是要有一些这样的报错的,
遇到max不开心的那几天报错会特么有好几页。。。 <ignore_js_op>
在此我给大家提供一个行之有效的解决方案,那就是点它!是的 没错 直接点确定根本不要犹豫。相信我,你百分之九十的错误都与这些报错无关,剩下那百分之十,你不用看这些报错信息也会知道文件有问题!
导出分为直接导出和导出选定对象,两者做大的区别就是
一个是直接导出一个是导出选定对象……? <ignore_js_op>
好吧,其实我是想说,他们的区别在我来看是没有太大的实际意义。直接导出的话,在你的max中所有的东西,看得见的如mesh和看不见的如particle view统统都会被导出,你需要导出的骨骼模型和你不需导出的辅助体dummy点也都会被导出。但你不必紧张,我们进了u3d可以编辑这一切,只留下我们需要的内容,其他部分则不会被打包进入游戏占用资源。所以通常我们只要直接导出就好了,但是有时候如果遇到处女座的程序员,他们会要求资源的简洁规范,以及视觉上的整齐干净,不许存在不能♂用的东西,此时你就需要导出选定对象。导出选定对象的话,就是你选了什么就导出什么,也就是说如果一个完整的动画导出时你只选择了一根骨骼的话,则只会导出这个根骨骼的动画。但是当你进入u3d时,你会发现………………
你什么都没发现…… <ignore_js_op>
因为只有一根骨骼,没有完整的父子连接关系引擎是读不到动画信息的。 <ignore_js_op>
聪明的你是不是已经想到了什么。是的 你可以跟程序开撕了
撕逼指南:因为导出选定对象一不留神就会出错,如果资源量庞大,维护成本会非常大。仅仅是为了满足你猿的无理需求需要耗费本宝宝的多么大的精力,而且毕竟是人力维护,不可能完全不出错,一旦出错检查修改都要时间。
既然如此为什么不用简单保险的直接导出呢?
我估计到这一步程序就不会再说什么了,最多再问一下 那要怎么在使用的时候清除无用的资源,这个问题我们留在导入的内容里面讲。
顺便说下如何删除上文提到的particle view,以便于万一你撕输了,文件里又出现了看不见的particle view,恩。。。 如果你从来没遇到他……13
就当我什么都没说吧…… <ignore_js_op>
附上一个导出界面的翻译和基础介绍
好的,现在我们已经导出了一个干净或者不干净的FBX,总之他是可用的。既然导出来了我们如何在unity中使用它呢?别急,我们先看看他在哪。
这是一个标准的unity工程,作为一个不会写代码的美术 <ignore_js_op>
,你只要关心Assets这个资源的文件夹就好了。unity比较常见的工程管理有两种,一种是资源和代码在一个工程内,一种是资源和代码分开放在两个工程下。两种方案各有优劣这里不展开说了,但无论你用的是哪一种,肯定都会有Assets,这里面要存放游戏中要用到的所有的美术资源,也就是说,游戏中用不到的资源,千万不要放在这,否则…… <ignore_js_op>
Assets下会有很多文件夹,根据不同项目的分类方法各有不同,问你们的程序大爷要到动作文件的路径,然后记住它,以后这个路径下的内容就由我们来守护!
在成为一个合格的守护之前,先来学习一下基本操作吧,下图这八个窗口一个都不能少,统统要记住是干嘛用的!
1.Hierarchy 可以把它简单理解为max中的大纲视图也就是H键视图,你想要查看、编辑、修改一个东西的时候,通常要先把它拖放在这个视图。在这里你可以查看、编辑物体的层级关系,也可以在这里做预制体,这个视图的左上角Create下拉菜单中,可以创建很多unity内置的物件如灯光、几何体、摄像机、UI板等。
2.Project unity引擎内的文件管理窗口,这里可以查看、编辑Assets下的所有文件。这边是一个文件管理窗口可以创建文件夹和其他unity引擎中常用的文件,类似脚本、材质、状态机之类的就是在这边创建。
3.Animator 动画状态机的编辑窗口 在某些项目组动画状态机是由程序来编辑的,在另一些项目中则是由动画师来编辑,就是说这里的内容是跟程序的工作有大量交集的部分,后面会详细介绍这里的使用方法,这里主要功能是用来编辑动画状态机,处理分层动画,编辑动画遮罩等。
4.Inspector 简单理解为属性编辑窗口 这个窗口主要用来编辑当前选中物体的属性,你要是问我编辑的是什么属性……我只能说什么属性都编辑……这里根据程序写的脚本、插件、编辑器不同,可编辑的内容也各不相同。这个便面用到的次数差不多是其他面板的相加总和。
5.Scene 场景嘛简单来说就是你把一个物体拖到1.Hierarchy下,这个物体就会显示在Scene窗口中。大致功能跟max的主窗口类似。
6.Game 游戏窗口嘛 当然是玩游戏的 点击unity界面最上方中央的play键,这个窗口就会开始运行游戏。就是我们常说的本地pc版,当你导出了新的资源或者修改了原来的资源,都可以通过这个方法查看他在游戏中的实际表现效果。
7.Animation 就是动画窗口啦 不过用起来还是有些小复杂的。可以查看动画,也可以用来在unity中做一些简单的场景动画摄像机动画之类的。
8.Console? 我一般就管他叫报错窗口……这里会报出来各种黄的红的错误提醒,对你来说它的最大意义,就是可以把它报的错误截图发给程序看……
好 现在我们开始正式介绍一个模型文件的导入流程
首先,在导出时我们根据程序提供的路径和命名导好FBX,接下来我们要在unity的Project窗口中找到它。在Inspector窗口检查它的属性
为了节省笔墨(懒 <ignore_js_op> )我就不逐条解释了,说几个常用的的。
Scale Factor模型缩放 这里理论上都应该是1,也就是模型的原大小。但也有可能是0.1或者10之类的,跟你max的单位设置有关,无论是几都可以,只要跟其他模型是统一的就OK。
Mesh Compression网格压缩,用来降低模型的面数,这个一般都是选择关闭的,如果你们程序说,我们模型的面数太高了,我要在这里进行压缩,揍他,然后叫做模型的同学想办法在max里降低面数。
Import BlendShapes 导入BlendShapes ?BlendShapes是maya的说法,max中叫做Morpher也就是表情控制器。如果你在max里面做了morpher表情动画的话,勾选这个选项就能直接导入。
Material Naming 材质名称 这里面有几个下拉选项,问你是使用贴图名字还是模型名字。因为你导入模型进来的时候会自动把材质球带进引擎(如果不想带进来就把Import Materials后面的勾去掉),这个选项决定了材质球如何命名,如果是选根据模型命名,材质球就会跟max中材质球的名字一样,如果是根据贴图命名材质球就会跟它所关联的贴图名字一样。
好继续说下一个页签Rig,这边是设置模型用于那个动画系统以及在该动画系统下的配置。Animation Type可以下拉四个标签分别是N\L\G\H。这是个漫长的故事……我在这只说一点模型这边用得到的,后面会写专门讲动画系统的一章。
N这个标签我们可以直接不理。 <ignore_js_op>
L是4.0版本以前的动画系统,是比较老比较保险的动画系统,提供的功能比较少,但是也不会出什么错误,适合非常简单的游戏。
G和H是在4.0版本时同时推出的两套动画系统,他们有很多共性,比如都有自带的状态机、自带动画融合、自带Avatar等。比较大的区别就是H这个动画系统是专门用来做类人型两足生物的,它提供了动画的重定向,就是说它提供了一套动画赋予给多个体型不同的模型的解决方案。听起来是不是吊炸!其实实际使用的时候限制还是很多的,后面我在慢慢说我遇到过的坑!
G和H动画系统都有Avatar,一般来说模型文件都是使用Create From This Model,动画文件使用Copy From Other Avatar。
G动画系统允许我们手动指定根骨骼 就是在Root node这边下拉菜单里面选
H动画系统在这个页面没有根骨骼的指定选项,但是有个神秘的按钮,我们点一下试试吧
忽然画风一转,这个人绿了(也可能灰了)……简单来说,这里主要是用来配置骨骼的重定向的,小绿人身上的圆点对应着下面的绿色圆点,每个点后面的框可以指定一根骨骼。
我来试着说一下它的原理,能说清也不要小红花,说不清也别打我。这个绿人是H动画系统的角色骨骼结构,每个节点允许我们手动配置当前模型的骨骼,就是说这个模型的左手掌骨骼叫“曼玉”我们就把曼玉指定到
这里,右手手掌骨骼叫“子怡” 我们就把子怡指定到
这里。通过指定的骨骼我们完成了当前模型的骨骼重定向,这时候我们拿到另一个也完成了骨骼指定的模型的动画,无论他左右手是叫柏芝还是冰冰都没关系,通过这套角色骨骼结构的重定向,我们可以忽略骨骼的名字、长度、大小……直接使用动画信息了!厉不厉害!其实你偷懒套用bip的时候也是用的这个理论哟!
说一个小技巧,
使用max做动画的同学一定记住第二个选项,他可以根据max默认的骨骼命名一键配置好骨骼信息,省了你一根一根拖放的麻烦。
还有这个biped pose,有时候文件会报错说当前文件不是Tpose,也是点一下就修复啦!
现在,我们已经完美的导入了模型,接下来要讲到重头戏动画导入设置了。由于动画导入该如何设置取决于使用的是那种动画系统,所以我会把三种动画系统的导入设置分开讲,三种动画系统会有一些重合的内容,这类内容前边讲过之后后面就不会再重复了。
好 首先是Legacy动画系统(以下简称L),Legacy动画系统过去不叫这个名字,从前他是unity动画系统的高大帅气武艺超群的独生子
,当时它也不叫这个名字,他就叫Animation动画系统,对应的动画脚本名字也是Animation。后面4.0版本出来了,自带了全新的Generic(以下简称G)和Humanoid(以下简称H)动画系统,unity官方就把自己的亲儿子改名叫Legacy(遗产)。
Legacy的优势在于简洁,他仅仅提供了动画系统最基础的功能,动画切分、动画压缩以及一些基础的参数设置。功能少就意味着少出错,所以Legacy动画系统更稳定产生的bug更少,也是因为功能少,当你需要新功能的时候就需要程序来写,这就需要程序更多的工作量。而且遇到新手程序的话,可能写出来的东西,还不如官方在Humanoid和Generic动画系统里自带的 <ignore_js_op> ,这也就是Legacy系统的弊端了。 <ignore_js_op>
首先这个界面,其实我是不想讲的因为除了Store in root(New)这个选项,其他的都被打上了Deprecated(弃用)标签,这里我曾尝试过使用其它选项有什么区别,答案是没什么区别……写这段完全是给好奇宝宝和强迫症患者的福利……
然后是这个页签下的第一部分。
Import Animation就是字面意思啦,动画导入 不勾选的话就没有动画了(那么换言之就是说模型文件如果不小心也带了动画信息,你可以去掉这里的勾选)。
Wrap Mode 动画循环模式 下拉的选项分别是 默认、一次、循环、乒乓循环(正播一次倒播一次反复循环)以及停留在最后一帧。
Anim.Compression 动画压缩 这里有三个选项 分别是关闭压缩、减少关键帧、减少关键帧并压缩。后面两个主要的区别就是 第三个选项在减少关键帧的同时,还会压缩文件的大小。
下面这三个Error参数 是压缩的阈值 他的压缩原理是,当两帧之间移动、旋转、缩放的数值小于你当前所填的0.5时,这一帧就会被删掉。这个0.5是以什么为单位我还真是不清楚……
撕逼指南:这个值我最多开到0.8,再大的话 就会出现比较严重的失真了,动画会跟你在max里面见到的差很多。但是程序经常会要求你尽可能把这个值加大,再大,再大,大……他要求的是性能,但是我们要求的是画面。你跟他讲,真正的优化是保证画面效果的前提下优化性能,而不是一味的降低美术效果,那算个屁优化!
常见的一些脚步晃动、物件抖动都可能是根动画压缩有关,改小压缩值通常能够解决动画的抖动问题。当然了,动画抖动是个巨坑,产生抖动的原因不计其数,有些原因甚至是无解的……如果改了压缩阈值还是没好,你可以这样解释……
这里是动画切分,有时出于制作的和修改的方便,我们会把几个动画做在同一个动画文件里面,这样就需要在unity里面将他们切分开。点击红色框选的地方增加或删减动画片段,然后再橙色框选处重命名当前选中的动画,蓝色部分修改动画的起止帧。补充一下橙色部分相关的内容,unity标准的动画命名格式是 ?模型名@动画名 如boss1@idle ? 这样导入进来之后unity会自动给这个动画命名为idle而不是Take 001。
这里看到了一个熟悉的名字?Wrap Mode 动画循环模式,这里的动画循环模式是针对我们切分出来的动画片段,上面那个是针对整个动画文件的。注意看这里的Wrap Mode上方有个Add Loop Frame,勾选这个选项则使用整个动画文件总体的循环模式设置,不勾选就可以单独设置循环模式。
Mask 动画遮罩 ?Definition这部分是说使用动画本身的遮罩还是从别处获得动画遮罩,这个遮罩的用处是屏蔽一部分肢体的动画,那具体怎么用我们放到动画状态机部分来讲。下面这个Transform会列出这个动画的所有骨骼,你可以根据你的需要来勾选。如果没有特别要求应该是都要勾选上,但是会有比如bone骨骼的末端、CS骨骼的末端dummy这类是可以不勾选的。
Import Messages 导入信息 导入的动画如果报错了,就会在这里有提示。最常见的就是骨骼链接不规范的报错……
右下角俩按键就是还原和执行啦 你做了一堆操作设置之后千万要记得点Apply,或者你放弃这一切从头开始也可以点Revert。
Generic?这就是unity官方用来替代Legacy的次子了,跟他大哥不同,Generic在4.0刚推出的时候各种bug,使用时候各种坑,根本无法正式在项目中使用,简直就是恶魔……
但是随着版本的叠迭代,Generic越来越完善,越来越强大,小恶魔已经成为龙妈的国王之手了……咳咳,我是说Generic已经成为大部分项目的首选了。。。
Avatar Definition ?Avatar模式 模型用自身的Avatar,动画用copy的Avatar之前讲过不重复了。
Root node 这里可以指定根骨骼,这本身没什么可说的内容,只要选定你所需的根骨骼填进来就好了。但是这里要着重介绍一下None这个选项,如果你给拔根骨骼直向None,也就是空的,那么unity会自己根据重心来计算出一个根骨骼,这个根骨骼是实时运算得出来的,恩……简单来说就是,他会把你玩死……
接下来还有个选项叫做Optimize Game Object 优化游戏对象 ? ?我查过官方自述,大意是说他会优化Avatar上的骨骼节点并优化蒙皮骨骼的提取,总的来说就是目前还没用过不是很请楚……
Loop Time 是动画循环设置,勾选之后动画就会循环播放,这个循环是指在状态机里循环播,讲到状态机我会再说一次这个问题。
Loop pose 可以理解为位置循环。比如动画是向前走了一米,再循环播第二次的时候,是在一米的位置播还是原点的位置播取决于这个选项。
Cycle Offset 字面意思是循环抵消。可以理解为是播放延迟。假设一个40帧的动画,这里填0.5的话,动画就会从20帧的位置开始播。
具体应用:我随便说你们随便听吧,这个功能估计没几个人用得到。假设一个突突突的射击游戏,有朝左跑和超朝右跑的动画,并且动画是镜像复制出来的(镜像方法下面会说),并且需要给动画做融合左跑右跑无缝切换。左跑动画的第一帧迈的是左脚,又跑是镜像过去的,那第一帧自然是迈右脚的,这样就是无缝的啦!那我们就在又跑的Cycle Offset填上0.5,OK他会从动画的中间开始播也就是先迈左脚了。
恩 这很耐撕……
至于后面那个loop match是检查循环是不是匹配的,用动画师的语言来说,就是首尾帧是不是一致……越绿越一致越红差别越大……
下面三个选项是一回事 分别是旋转、Y轴位移(竖方向)、XZ轴位移(水平方向)。Bake Into Pose是指“基于什么”但是你可以简单粗暴的理解为锁定,勾选之后就会锁住旋转或者是位移,不管是动画上做的位移还是引擎计算出来的位移都会被干掉。Based Upon大概理解成初始位置、轴向吧。Body Orientation是身体朝向、Original是动画原本的样子、Center of Mass讲道理的话是质心,但是肯定不是你理解的那个质心……这里说一下,官方自述我并没有看,我上面讲这些基本是我基于使用时的表现反推的理论。如果你在别的教程里看到了跟我说的不一样的,我不管,反正是他错了……
Mirror镜像 比如你做了一个左转跑,在动画切分哪里多加一个动画片段改名叫右转跑,然后勾选Mirror就可以得到一个右转跑啦。
Additive Reference Pose 添加参考pose 至于是干嘛用的…… 本宝宝也不清楚……还有下面这个Curves这个曲线功能我也……从来没用过……不晓得干嘛用的……
Events事件 这个主要是给程序用的,在动画的时间轴上加一个事件点,程序可以检查到这个事件点,然后执行某个命令。比如在攻击动画的某一帧加事件点,作为播放特效的通知。
Mask上面讲了 Definition上面讲了Transform上面讲了 还剩个Humanoid。 这个Humanoid可以理解为是一个开关吧,手脚的IK和各部位动画的开关。默认是一个绿色的小人,如果不需要某一部位的动画,可以把它点成红色。
Motion 指定根骨骼,是的就是这么不讲道理。明明指定过一次根骨骼了,这里又要指定。但是两边的区别到底是什么,我还没搞懂,我问了程序,程序也没搞懂,所以这个问题留给你们了。问问程序这两个地方都是干吗用的,有啥区别!快去找程序员问吧,谁家的程序答得出来记得给他一个爱的抱抱,然后来这里分享一下哟!
Humanoid
我发现Humanoid能讲的,前面都讲过了……这特么就尴尬了