当前位置:   article > 正文

Unity 让物体同时播放两种动画_unity animator同时播放两个动画

unity animator同时播放两个动画

        在用Unity开发工程中,会遇到需要让一个物体同时播放两种动画的情况,举个简单的例子: 一只小鸟,这只小鸟会拍翅膀,这只小鸟也会按一定的轨迹飞行。   实现这个需求有几种思路:

1. 用动画控制器控制小鸟拍翅膀的动画,编写脚本控制小鸟的飞行轨迹;

2. 在一个动画中同时K上 拍翅膀相关的帧 和 运动轨迹相关的帧;

3. 给这只小鸟加一个父节点,小鸟自身的控制器会控制鸟拍翅膀的动画,其父节点上挂一个控制器,用来控制器运动轨迹;

4. 采用动画混合层的方式,由小鸟自身的动画控制器 直接控制 小鸟拍翅膀及其运动轨迹的动画。 

本文将会对第 4 种思路进行简要介绍。

1)新建一个Unity工程,导入相关资源,图中的“Bird”已经挂好动画控制器,并且其“BaseLayer” (第0层)中新建一个 拍翅膀动画 => “Fly”动画。此时,小鸟已经具备拍翅膀的表现了。 

接着,我们需要新建一个动画层,来实现其飞行轨迹动画的叠加:

2). 点击下图中左上角的 “ + ”号,下方便会出现一个新的层 “New Layer ” 也就是动画层1了(BaseLayer 是动画层0),此时可以对这个层重命名。



3) 在新建的层中点击右上角的设置按钮 ,打开该层的设置面板,在设置面板中把 weight 的值 设置成1 (当weight 为0 时,该层的动画不起作用,随着weight的值增大,动画权重增大(类似于动画速度增加),当weight为1时,表示该层中的动画均为正常速度播放)。

4)在该层中K上控制小鸟移动的动画 =>  “Move"。



此时,基本功能已经实现,启动Unity 你便会发现,物体已经具备两种动画表现。


在这里可以扩展一些知识, 如何单独停止第一层(即新建层)动画,并在一定时候后继续该层在停止时刻的动画? ----有两种方法可以供大家参考。

第一种方法也是常用的方法是 用代码设置该层的权重 weight =0 。新建一个脚本“Bird” ,挂载到小鸟物体上,加入如下代码:

当按下键盘上按键”Q“时,新建层的动画会停止,只保留”BaseLayer“层的动画。

这种方向可以有效地停止掉骨骼动画。 像CS类射击游戏中,通过混合动画,Base层中主要控制角色手部开枪射击等动画,在新建的混合层中控制脚步移动的动画,这种情况可以用上述的方法停止掉新建的混合动画层。   然而,对”移动旋转缩放 “ 类动画不能用这种方法!

本文需求中小鸟的这种  ”拍翅膀“ + ”拍翅膀“ 组合而成的动画,不能用设置权重weight的方式去停止动画 , 这是因为当你把新建的混合层动画权重设置成0时,物体会回到移动动画第一帧的位置,并不是在原点待命!


对于”骨骼动画“ + ”移动动画“ 这类的,我们可以这样解决:

1)在新建的混合层中添加一个空的动画State ,命名可随意为,并把write defaults 这个选项勾去掉;


2)在常用于播放动画的 animator.Play() 方法中有5个重载,其中有一个重载方法是可以自行决定动画从哪里开始播放的,调用此方法我们需要知道两个关键的数值:

stateNameHash 和 normalizedTime。

3)在停止动画前 先获取 ”Move“ 动画当前已经播放了多少(该值为0 到1 ,1 为100%,0.1为10%),即“normalizedTime”。获取代码如下,相关解释已经备注在代码里:


4)获取混合层中当前动画的 名字所对应的哈希值 => nameHash. 



5)此时准备工作已经完成,下面贴出全部代码。小鸟飞行过程中按下 键盘”W“键,小鸟会保持“拍翅膀”状态 原地停止3秒,3秒后继续飞行。

 

其实在物体有固定移动路线时,给物体添加一个父节点,物体自身K骨骼动画,父节点K带动物体移动的动画也是可行的,停掉移动动画只需要禁用父节点的动画控制器即可,再次启动也就是把父节点的控制器再次启动,动画也能继承停止时刻的状态继续播放,在逻辑控制上简单很多,但是随意给物体添加一个父节点有时有打乱物体之间的结构规律,所以并不推荐这样做。 

到此,功能已基本实现。

(有什么错误的地方也请各位大大不吝指出~~~)


声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号