*案例1请见我的博客空间 Unity动画系统案例1
**所需要的项目素材和完整项目见我的线上课堂https://www.zuikakuedu.cn*
该栏目讲解所有Unity的动画:有多种类型,和一些高级用法 创建一个场景NormalAnimation.该场景讲解普通动画
(1)动画分类
【普通动画】
Windows- Animation或者右键直接创建animation拖到对应游戏物体上。这种方式所创建的动画,并且将会自动的为这个物体生成一个动画状态机animtor,由这个animator控制整个动画控制Animation的编辑,直接改数据将会在线位置添加关键帧,也可以直接确定位置之后,直接修改检视面板的值【前提该值已经加到Add property】
添加关键帧的一个简便方法,使用录制工具
创建空的动画片段后,并拖入给需要动画的物体使其具备动画状态机后,打开Animation面版,不用Add property,直接点击录制,此时线会在第一帧,只要动了该游戏物体【及其子物体】的任何属性,这一时刻的关键帧都会自动创建,然后移动线到所需的下一时刻,也这样操作.对动画进行微调,可以到曲线模式
该模式下可以连续的方式查看关键帧的变化,并可以对曲线进行微调,按住shift+滑轮,上下缩放,ctrl+滑轮,左右缩放
如果想取消曲线形式的变化【beizer曲线】,可以右键该点把Tagents属性改为line直线
【UGUI按钮动画】
设置为animation,并点击自动生成并保存到相应位置,点中这个按钮进入Animation面板就可以对4种效果进行编辑
【2DSprite精灵动画】
其中分为了两种方式,一种是作为游戏物体而创建的sprite动画【SpriteRenderer渲染】,还有一种是作为UI显示的Sprite动画【CanvasRenderer渲染】。前者可以通过直接按序列多选图片拖入层级窗口直接创建而成【将会是SpriteRenderer渲染器,一般该物体作为预制体使用】,或者创建空物体后添加Animation,在编辑Animation的时候拖入图
片Sprite。而后者由于是CanvaasRenderer渲染,所以直接按序列拖入的方法不适用,只能通过Animation面板编辑.
(2)3D模型/模型动画基础知识
美术所提供的资源由3个部分组成,模型,材质,贴图。
【情况A】动画本身也可以是单独的一个fbx,人物@动作.fbx。
【情况B】也可以集成在基础模型内部,展开模型后可看到该模型的所有动作(Tips:可能是分开的,也有可能只有一个,但包含了所有,要截取下来用)
材质一般跟着模型走由美术提供,但当没有材质时,则需要在Unity中创建材质
球
主要分为人形(可使用动画重定向)和非人形
【导入过程】
导入模型时3样东西,模型本身,贴图,和材质。【导入后有时会出现些问题
*】
可以发现,导入模型后,原本为fbx文件,进入到unity的project窗口后,就可
以展开了。你可以看到模型的组成【部件】,网格,动画【如果在Animation
选项卡中设置有的话】。骨骼Avatar
对模型进行设置
- 修改shader类型,根据需要和提供的素材,更改shader类型,比如该项目提
供了法线贴图normalmap【能更加体现模型的纹理】若该shader没有设置 normal
map的选项。就需要修改为一个可以指定法线贴图normalmap的。 - 注意材质球的颜色,材质没有反映出其本身颜色时,注意颜色设定,应该是 白色
- 设置模型合理的大小,将模型拖入层级窗口中后,创建一个标准的CUBE与其 比较,人大概就在2个cube大小左右。如果不合适可以调节Transform中的Scale属性,但推荐将这里保持为1,修改缩放则在project菜单下,找到模型,到检视面板,model选项卡修改Scale factor
- 在project窗口对模型的RIG选项卡进行设置
①第一个设置的是动画类型,Legacy是早期使用的,只能使用Animation组件
来控制,现在基本上淘汰不使用了【因为这种类型不支持Animator,后面两种都
支持】Generic代表通用的,即可是人形的,也可是非人形的,比如载具,坦克战舰的转炮Humanoid代表是人形的,只能为人形的才能使用
②第二个设置骨骼来源
通常来说,这个是根据美术组提供的素材决定的,如果像是这个项目,所有的动
作都集成在一起,就这个模型上,那么符合【情况B】则选择creat from this
model因为只有整个素材只有这一个模型,只能使用这个模型里面的骨骼
Avtar。//如果像是VRCHAT,ARPG这种,提供了基模【基础模型】
和各种人物@动作.fbx的情况下【情况A】,就应该对 基模设置为
CreatFromThisModel,其余动作的Fbx,都设置为Copy From others,然后
指定这个基模,这样可以大大的降低消耗【当然如果是多个人物的骨骼完全一样
也可以就使用一套】。
③设置根节点,这个只有在为Generic模式才有,一般选择该模型的最父级,但设
为none也可以
④
这个为优化模型,优化后,会将模型的骨骼节点自动隐藏,只留出有关渲染的内容,不影响使用,而且更加方便 - 对模型动画进行截取【对于情况B只有一个动画集合的处理,情况A不做此 步】回到这个模型Animations选项卡,如果美术告知了,每个动作的帧开始,帧结 束的位置。就可以较为准确的切分。如果没有只有预览看来切分
这个动画一共262帧, Clips下就是当前已有的动画片段,现在修改第一个名字
改为idle,然后在下面设置start与end的然后点击小加号,添加新的动画片段,命名,然后以同样的方式截取。由于这几个动作【跑步,待机】都是循环的,所以勾选LoopTime,looppose是使循环时无缝衔接,cycleoffset是循环后偏移量,没什么用,一般不指定默认0.,【对于死亡,攻击就不是循环的】最后应用
- Humanid与Genric的区别
①Humanid支持动画重定向,就是指,都对于是人形模型而言。如果使用
Genric模式,那么一个人物的模型的动画只能其自己使用,不能指定给其他人
物模型,而Humanid就支持,一个动画给所有的人物角色都可以使用。所以对
于是模型是人形的情况下,导入时通常选择Humanid,其原理就是因为人的骨
骼是差别不大的,只要事先进行骨骼映射。
②Genric模式运动和动画播放时分离开的,都是单独控制***【与Animator的
Apply root motion无关,这里的运动和刚刚提到的无关】***。而Humanid模式
下,是可以将动画和运动合起来,更加的协调 - Humanid的导入方式-骨骼映射设置 模式选择Humanid后apply,点击config按钮进行对骨骼映射的查看或修改。Unity会自动进行映射,绿色的就代表映射成功了,如果模型没有发生变形,则说明成功并且是正确的,灰色则代表没有映射,这些绿线的生成是根据模型而生 成的,不同人物模型可能不同。
而这一套是Unity标准的人体骨骼,其中实线圆圈代表必须映射的,虚线则非必需,如果有没有映射上的则会表示为灰色.
映射逻辑,是点击Unity标准的人体骨骼,点击这些小圆点,去映射模型中的骨骼,最后达到,Unity标准骨骼必须连的都是绿色,并且模型中需要映射的也变为了绿色就行了。
该项目biker模型的手臂和小腿并没有映射上,点击
对手臂重新映射,选择
点击
如果想重新映射所有,或者是误操作后想让他再次自动映射,可以点击
旁边的Pose不用修改,姿势默认是以T这样展开显示的。
模型中还存在一些灰色的没有映射,那些是多余没有必要的,只要保证Unity标
准骨骼映射完毕且正确,就可以了。
【其实该项目也可以不用做骨骼的重新映射,自动映射虽然没有映射的小臂和小
腿,但映射到了他们的根骨骼,根骨骼的运动是可以带动子骨骼的。】
切换至Muscles setting选项卡
可以预览刚刚的骨骼绑定在做动作时是否是正常的
通过修改这些值来观察模型是否是正常的进行了骨骼上的运动
修改完毕后应用并退出
- Humanid的导入方式-动画的相关设置
可以发现,上次genric模式下切割的动画依然还在,此时可以使用LoopMatch功能,来查看切割过后的循环动画是否是真正的循环了即确定第一帧与最后一帧是否相同如果吻合,则亮绿灯
下面讲解几个重要的内容
在Animator的apply root motion勾选的情况下,即使用了动画自带的位移,
才有讨论以下东西的必要
这3个单选框默认是没有被勾选的,即,在动画执行时,会影响到模型本身在 场
景中的Transform下属性的值,如角度,位移.比如该项目中的Biker。点击运行后可以发现Idle动画的 Rotation的Y方向和Position是在发生变化的。
要使某个方向上的Position或者Rotation在运行动画时不受到动画的影响,则勾选对应的单选框。都不需要的话【是指该模型的所有动画都不需要】,就可以直接取消Animator中的 apply root motion勾选
对于该项目,由于要运用到【 Humanid模式下,是可以将动画和运动合起来,更加的协调–刚刚讲的区别】所以要勾选Appply Root Motion。但Idle动画是不需要有转动的,所以勾选Idle动画的Bake into Pose单选框,对于前进后退动画【RunForward RunBacK】,只需要有位置的移动,不应该有 旋转的变化,所以要勾选
Tips目前该项目也不存在Y方向上的位移,所以Position(y)也可以勾选
Root Transform Rotation下的:
Based Upon则是设置基于什么方向,Body orientation表示身体的正前方
【默认使用这个】
Origin则表示模型师定义的最前方
Root Transform Rotation(Y)
origin是模型师事先设置的
Offset偏移量的设置
如果发现其动画运动的方向【红色箭头】与真实要运动的方向【蓝色箭头】存在一定的偏移.默认情况下,这两个箭头是同向的,但可能正是因为这个同向而导致,模型动画的方向和实际运动的方向不合适.比如这个项目,biker应该是头朝向真实运动的前方,而实际是偏离的,所以要修改Offset.让头朝向蓝色箭头
【在写好代码后可以发现,从待机转换为跑步时,头回自动的朝向前方,再开始跑】
!!由于该项目提供素材的缘故,在正确设置勾选这些之后,依然是以斜方向运
动,模型师提供的模型动画所带的位移是有问题的,所以只能妥协不使用他的位 移,全部勾选Bake into Pose单选框,或是直接取消勾选Apply root motion【到时候使用另外一个模型来演示*C 动画控制运动】
- Humanid模式特有的:动画重定向-这就是Unity mecanim系统的一大功能 即一套动画,所有人形的模型都可以用.将女性人物的模型也设置为Humanid,由于该女性角色的骨骼与biker的骨骼并 非完全相同,所以只能Creat from this model 点开Config进行骨骼映射。操作刚刚已经讲过。Tips该女性角色的模型里面没 有动画。想要让该女性角色一样的运动起来。①你可以直接Ctrl+D,biker的动画,拿出来,此时为女性角色创建动画状态机,把这个复制出来的动画丢进去,重新为其写状态机的控制。【注意:此时Ctrl+D的那份动画已经可以在Animation窗口 中修改了,不再是只读了*[VRCHAT对动画形态键追加-下面的常见问题细 讲]】 ②也可以最简单的,直接为女性主角添加Animator组件,直接将Biker的动画状态机指定过去,加上Biker脚本,一样也可以运动,控制了
- Humanid模式特有的:动画控制运动【*C 动画控制运动,这里换一套模型 来演示,使用Unity官方提供的人物模型】
新建一个场景,取名为05-Unity character ,拖入Character文件夹,导入后,
对这个模型做常规操作,先设置为Humanid,骨骼映射去观察一下,99%的情
况是正常的,因为这是Unity官方的人物模型。最后由于材质/贴图丢失而显示灰 色,解决方法见【*导入模型后的常见问题-已经说的很清楚了】
点击这个
该模型属于【情况A:即基模不含有动画,动画以 人物@动作.fbx的形式提供】但这些人物@动作我们只使用里面的部分,所以到时候还是需要截取的。但在公司中提供的资源,一般都是弄好的,直接用就行了所以将动作动画的.fbx的avtar骨骼设置为Copy from other,将基模的Avtar拖过去有几个红色报错了
就说明没有映射上,不能使用基模的骨骼,就对这几个改为Creat from this model
带有黄色警告的,代表映射是正确的,但可能稍有偏差,对于这些报警告的,也可以改为Creat from thismodel再预览动画时,可以发现地面的格子是有位移的,说明该动画具有位移-可以实现动画控制运动
(3)模型导入错误解决
【现象:模型表面没有正常的显示,灰色或是紫色】
(1)材质/贴图丢失。这类问题的表现就是模型表面没有图片,但可能的原因有两种,即贴图丢失或材质丢失。
解决方案:找到该模型的MeshRenderer或者是skinMeshRenderer。其一般只有一个,上面挂满该模型的所有材质球,而这个插件一般是单独挂在模型的子物体上的但不是骨骼。如果发现材质球有报空,说明材质丢失。则需要重新指定材质球。如果材质球并没有丢失,那么就是贴图丢失,可以向下翻到材质球设置,指定贴图。
(2)shader丢失。如果发现模型全身紫色,但检查材质设置和贴图设置并没有为空。则说明,引入的素材的shader是自写的,要么导入的时候未导入其shader,要么版本问题不支持。
解决方法:修改该模型所有相关的材质球的shader,用一个合适的Unity原生的暂时替换,先保证正常显示
(3)Animation被锁死为只读。有时,我们准备好了自己的模型,但是没有动画,想要把其他项目的动画拿过来用,但是又想对这个动画进行一些调整【比如:微调结束位置,追加或者删除一些形态键】,然而发现,利用Humanid的重定向特性将其他项目的动画状态机指定给自己模型时。打开Animation面板发现这些都是ReadOnly只读的,不可以修改
解决方法:对其他项目中用到的Animation Ctrl+D复制一份,将这个赋值之后的动画,拖到这个项目人物模型的动画状态机中,这下再打开Animation面板,就发现可以编辑了
(4)动画状态机Animator与运动Animation
设置动画状态机使其运动
对于Rig模式为Generic和Humanid的模型,在放入层级窗口后会自动的挂在Animator组件,并且会根据模型的设置自动的设置好Animator的骨骼属性。但动画状态机本身为空,需要指定。这里有个Apply root motion的单选框,其含义是指,如果动画本身就具有位置的移动的话,并且要使用其位置的移动,就要勾选此单选框。反之,不使用,其移动是通过别的方式控制【如代码,角色控制器】那么就可关闭此单选框
在project菜单下创建AnimatorController,并重命名为 任务@AC的格式,赋值过去,点击该游戏物体打开Animator面板进行编辑引入动画:如果是情况A,那么直接拖拽人物@动作.fbx到该面板即可,【注意:如果是Unity4.x则是将其展开后的AnimationClip拖入而不是人物@动作.fbx本身】,情况B的话,直接回到刚刚的模型,展开,可以看到截取好的动画片段,直接拖入。拖入的第一个将自动与entry相连,作为待机状态
通常来说,通过时间来自动切换时则要勾选HasExitTime单选框,但如果利用的是Conditions条件切换,那么取消该单选框
则是设置过度时间,选中这条线,点击右下的预览播放就可以查看这两个动作切换的效果,修改过度时间来达到想要的效果setting展开后可以对HasExit的时间进行微调,除此之外,Fixed duration单选框【在unity 4.x叫Atomic】代表是不是最小播放单元【原子】的。其含义是该动画可不被打断吗。一般来说只有切换至死亡状态时,或是具有霸体属性不能被打断的技能前摇动作,是不可打断,所以要勾选,其他动画的切换都需要取消该单选框在动画播放的时候,选中该游戏物体,打开Animator面板就可以看到当前动画播放的具体状态
动画状态切换–条件切换【由程序控制】
(1)非循环动作切换较为简单,根据需要,创建translation,非循环动作【一次性动作】通常都是单向线,添加parament,一般使用Trigger,加到conditions中设置条件即可。
(2)循环动作的相互切换。比如以下案例通过键盘的输入,实现待机,向前跑,向后跑之间3者切换【注意!:这里讲解的是最基础的循环动作切换,并未根据游戏物体速度,实现待机-行走-跑步间的切换】
循环动画,一般就是指运动动画,如跑步(含方向,若提供),待机,走路(含方向,若提供).由于涉及到来回切换,所以他们之间都是双向箭头。【anystate可以指向任何动画,其代表任何状态通过anystate转换到需要的状态,但不推荐这样使用,虽然能达到效果,且不使用双向箭头。但正式项目就不用这种方式】,所有的线【箭头】关闭fixduration单选框和has exit time【不取消的后果,切换将将可能延时进行,因为要先播放完当前这一轮动画再切换】
此时添加parament,循环动作一般不使用Trigger。其余的都常用。这3个状态切换可以由3个bool 类型的条件来控制 isIdle isForward isBack,但在获取按键输入时,每一次更新就会涉及到3个Parament的更新,稍显麻烦,由于这里控制的是竖直方向的输入来控制前后移动。所以这里可以设置一个float或者int。通过getAxis或者获取按键输入后改值来实现切换。这里分别使用两种方式演示添加一个int类型的parament,取名vMove(代表竖直方向上的输入)默认值为0,代表默认无输入应该停留在idle状态
【!!!此时Biker的脚本中只进行了动画状态的控制,并没有移动的代码】
在Genric模式下 按W S键后的确做出相应动作,收手后回到Idle没有问题
在Humanid模式下,apply root motion勾选情况下,没有对除Idle之外的其
他动画勾选Bake into Pose,按住W S键可以看出做出相应动作,并且有位移
【很小】。
【Humanid模式下,是可以将动画和运动合起来,更加的协调-这就是刚刚提的区别】
【这里只是演示了以下,但最终没有使用这个方案,原因上面引入时就说了:模型师提供的模型动画所带的位移是有问题的,所以只能妥协不使用他的位移,全部勾选Bake into Pose单选框,或是直接取消勾选Apply root motion】
【见上面的*C 动画控制运动,这里换一套模型来演示,使用Unity官方提供的人物模型】
【提示!!!】Biker这里由于动画本身模型师没有为其设计位移,所以如果要让其运动的话,只能通过其他方式【可以是程序】来实现,而动画状态机的写法也会有所不同。对于跑步-走路的切换,则是根据速度【通常是个Float的Parament】来控制进行的。
而在UnityCharacter场景中,利用的是Humanid的 动画控制运动 特性,其运
动是动画模型中设计好了的,不用程序实现其运动,只用控制其动画状态的转换。对于跑步-走路的切换,则就不是根据速度了【因为这是动画决定的运动
【速度】】,而是根据其他【比如按键-具体情况 见(案例1)】
【重点】animator组件的SetXXX()方法有很多种重载函数。
到目前为止,我们只使用传入(“Parament的字符串”,值)
其中有一个SetXXX(int id,value)的形式,可以将Int类型的数,id指定进去,但事先要定义这个Id添加这句话StringToHash
(5)BlendTree混合树在动画中的使用
当动画较多的时候传统的方式不便管理,比如走路动画可以分为走的快,走的慢,很多种。用传统方式则显得杂乱无章所以这种情况使用BlendTree
右键创建From Blend Tree即可创建,双击混合树即可进入编辑,双击空白区域
则可以退回来
1D:代表所混合的几个动画,对模型Transform的影响因素只有一个【影响因素有3个正是动画切割时候的那3个 旋转 Y方向位移 XZ方向位移】
(案例1进行了对1D混合树的应用)
**理解:**1D的BlendTree其实是一种对动画的融合,可以看这里的蓝色区域当前RunForward被选中,现在高亮的蓝色区域在最右边,这就是代表,当Threshold为1时:完全播放RunForward动画。选中WalkForward,中间蓝色区域就会高亮,阀值为0.5完全播放Walk动画,同理,阀值为0时 完全播放Idle动画。但当阀值介于0-0.5 或是0.5-1时,他就会按照比例来融合两个动画同时播放,逐渐的向下一个状态过渡变化。阀值的大小可以是任意的
可以拖动蓝色区域三角形,来修改阀值的界限,进行微调合适进行变换
传入的Parament必须是一个Float类型的值,且有一个,他的值就是这里的阀值对应的情况,所以通过修改这个Parament来进行对1D混合树动画的切换。 Automate
Threshold代表自动生成阀值,如果需要手动的进行修改,可以取消该单选框
取消后会产生一个新的选项,因为Unity播放动画时可以时时计算速度,所以阀值也可以根 据速度来生成
2D:代表所混合的几个动画,对模型Transform的影响因素有两个,需要两个float 类型的变量
**理解:**红色点表明当前两个Parament输入的情况
而蓝色点代表动画状态,目前有6个状态所以有6个点【中间有两个重在一起了】,而当红点越靠近某个蓝点,则代表动画状态越接近他,蓝点旁边的淡蓝色圆环的大小就代表受这种动画的影响程度。越大就越是他。
在单独完全播放某个动画时,应该只有一个蓝色圆环【即不能受多个动画影响,蓝点之间要拉开一点,避免相互影响-案例1说过】
下面两个设置含义和1D的一样,也可以根据动画本身的速度,角度等,根据速度/角度设置阀值【见(案例1)】
类型–【案例1使用的是中间的那种】
- 2D Simple Directional 该模式下是融合不同方向上的动画,但不能存在同方向上的动画,例如 向前跑 和 向前走
- 2D Freeform Directional 该模式下也是融合不同方向上的动画,然而该模式允许一个方向上有多个动画, 例如 向前跑 和向前走。且必须保证一个Idle动画,就是0,0的位置
- 2D Freeform Cartesian 该模式下所有的动画都是同一个方向上的,这两个Parament代表不同的含义,如角速度线速度,他可以用于类似向前跑,但头朝向左右这种【只是朝向,并没 有向左右运动】
(6)MatchTarget技术
使动作和其他模型相匹配【在案例1中也进行了演示】
作用:事先确定好要匹配的那个点的位置,全局上的坐标在哪,以及角度【需要的话】匹配肯定不是一直进行的,他肯定是出现在某一动画状态,所以一般要先判断动画状态,利用animator.getcurrentstateInfo().isName(“状态名”),然后再确定是模型的那一个部分来匹配,对于人形就是身体,两足,和两手。最后确定是哪个区间内进行匹配,回到这个动画的预览模式下,找到你需要的匹配的那一段,记录下来他的帧数,然后除以总帧数,因为,MatchTarget函数是使用的归一化的时间开始和结束。准备好后就可以进行了
这含义分别是(目标位置,目标角度,模型的那一部分【枚举】,匹配程度【权重,(第一个Vector3分别代表xyz轴匹配的程度,为1表示100%),后面的浮点数则表示角度的权重】,最后两个浮点数表明该动画匹配的起点和终点【开始时并不是一瞬间到目标位置,而是开始插值运算】,是一个归一化的浮点数,需要到动画预览去看)
注意!当处于动画切换的时候,【蓝线的时候】,MatchTarget是无效的,所以在使用之前最好判断当前没有进行状态转换,animator.Istransation(0)==false
(7)动画曲线
这里重点讲解Curves曲线的使用,打开任何一个动画可以看到一个Curves的属性
点击+号可以增添一个曲线,曲线的长度代表整个动画播放的过程,单机曲线可以进行编辑,加关键点,控制图像形状
注意:曲线的名字必须和 parament的名字相同,当相同后,该值不可手动控制【运行时变为了灰色】,而是由播放该动画时候这个曲线来控制他的值
(8)IK动画反向动力学与AvatarMask骨骼遮罩
在案例1的基础上。找到素材资源导入,Log文件夹
将模型放入层级窗口后,依然做常规操作,将其材质恢复好。指定贴图和其法线贴图目标,实现人物走过去,捡起木头,扛在身上。木头在地上旋转【编写脚本实现,全局坐标的Y】,并添加碰撞器,触发类型【勾选上IsTrigger】,通过代码已经实现了,碰撞到木头,就销毁地上这个木头,重新创建一个新的木头,并且作为head的子物体跟随头的运动。此时为了加上手臂的控制【即举着木头】所以还需要导入一个动画HoldLog。传统方式的导入进来,并设置条件让其转换到这个状态是不行的。因为我们的需求时拿到这个木头后,还能勾继续跑,移动。传统方式的话就不能同时进行多个动画。所以、解决方法是创建一个新的层,这个层专门用于播放 搬木头
【注意!:parament对所有层都是通用的】
运行之后发现,没有什么变化,按理说引入了新的一层后,并且那层什么都没有应该处于一个空状态,但其依然和上一次一样没有变化,原因是在,每一层都有一个权重的设定,点开小齿轮
现在将@HoldLog导入到第二层,作为默认动画,该层权重也设为1,原本为
0,点击运行会发现现在只播放HoldLog动画了,且无法控制,返回第一层可以观察到,原来的混合树的确是在运行的。
导致这一现象的原因是:Blend模式,目前为Override重写模式,越在下面【指Layers窗口位置上】的层,就会越覆盖原来层【sortLayer也是这样】,且blend模式默认是重写,重写【可以理解为C#代码的重写但未加base()保留父类该函数的情况】之后上一层的就不可见了,所以现在完全播放第二层的内容。而除Override的另一个选项就是addtive,追加模式,即保留上一层的所有动画,不影响,我只是在其基础上追加一些动作。然而将模式修改为addtive后依然没有效果,这是因为这种模式只用于对上一层没有动画的骨骼进行操作,而上一层已经有了手部上的动作,所以不行。要解决这个问题:使下身动作使用第一层的,上身动作使用第二层。需要用到一个技术AvatarMask【骨骼遮罩】
实现过程:
先把第二层的模式改回为Override重写模式,因为手部的动作不需要保留上一层的。回到Project菜单找到AnimatorController文件夹,在其下创建一个新的文件夹用于保存骨骼遮罩叫做AvatarMasks,右键新建AvatarMask。创建一个upBody代表上身。对其进行编辑如果是人形的Humanid,那么非常方便,展开Humanid选项卡,如图所示:
进行设置【默认全绿】 绿色代表:该动画会对这些骨骼产生影响,红色则代表:该动画不会对这些骨骼产生影响。将这个upbody设置为如下图所示
代表该动画只会对两支手有影响【只重写了手的动作】。并将其指定给动画状态机的第二层此时运行达到我们想要的效果
只有当捡起木头之后才进行这种效果,所以要对其用代码实现进行控制
到第二层创建一个空状态作为默认状态【不用担心由于是重写模式而导致上手臂无法播放原先BaseLayer的动作】新添加一个bool类型的 Parament,IsHoldLog默认false,连双线过去,取消勾选HasExitTime然后在函数CarryLog里面将其设为True,即可实现
最后一个问题:手的位置和木头是不匹配的,手没有放到正确的地方。这个用 反向动力学IK 来解决它和MacthTarget效果类似,都是匹配好位置。但实现原理不一样
IK动画与MatchTarget区别:
MatchTarget实现从一段时间区域内,一个点到另一个点匹配的过程【其中一个点可以是人物模型的枚举】;IK动画用于直接将手或脚与某点的匹配【没有过 程这一说】
实现过程
在Log下创建两个空物体,这两个空物体就是手抓住的两点分别是
LeftHandPos,和RightHandPos,并把他们拖到合适的位置上
回到动画状态机第二层,点击设置按钮,勾选上Ikpass
在Player脚本中,写上监听函数OnAnimatorIK(int layerMask)该函数和其他on函数一样,由Unity自身调用,每帧调用1次,且layermask的值只会是勾选了Ikpass的层的id。【哪一层勾选了,哪一层就调用】
然后调用animator的setIKposition方法将要的位置和骨骼的那一部分传进去,还要设置权重,才会有效
最后进行角度调整,由于木头随头转动,所以手和木头的角度也需要更正,才能更加协调
【!!!】欢迎关注我的个人线上课堂https://www.zuikakuedu.cn,内含JavaWeb与Unity游戏开发实战教程,完全免费!,此教程代码资料也在该网站上