【unity小技巧】使用Unity的Animation Layer和Avatar Mask把多个不同动画组合使用,实现人物不同部位播放不同的动画

文章目录

  • 前言
  • [如何使用Unity的Animation Layer和Avatar Mask把多个动画组合使用](#如何使用Unity的Animation Layer和Avatar Mask把多个动画组合使用)
  • [游戏角色的疲劳感是如何制作的?利用Animation Layers中的additive模式把多个动画混合在一起](#游戏角色的疲劳感是如何制作的?利用Animation Layers中的additive模式把多个动画混合在一起)
  • [如何制作角色的受伤状态?Unity动画层级(Animation Layer)的Sync和Timing介绍](#如何制作角色的受伤状态?Unity动画层级(Animation Layer)的Sync和Timing介绍)
  • 新问题,那就是角色在受伤的状态下拿不起枪来了
  • 参考
  • 完结

前言

在游戏制作中有一种需求非常常见,那就是把两个或者多个动画组合在一起,比如我需要玩家持枪行走,但是我手里只有玩家持枪战力的动画,以及空手行走的动画,那么我就必须把这两个动画组合到一起使用,针对这种动画缝合怪的需求,在Unity中最方便的解决方案,就是使用动画层级Animation Layer以及替身蒙版Avatar Mask

如何使用Unity的Animation Layer和Avatar Mask把多个动画组合使用

比如我需要玩家持枪行走,但是我手里只有玩家持枪站立的动画以及空手行走的动画

那么我就必须把这两个动画组合到一起使用

在y中最方便的解决方案就是使用动画层级animation layer以及替身蒙版avatar mask

如果我们当前使用了humanoid动画

那么我们就配置上面这里的humanoid

点击这些身体部位

绿色表示会播放动画

红色表示不会播放

点击周围可以一次性全选或一次性反选

我们要播放的是手部动画

所以选择这里的胳膊和手以及这两个IK

如果我们当前播放的不是humanoid动画,则可以展开下面的transforms来选择哪些骨骼节点受影响

哪些骨骼节点不受影响,我们可以在这里拖入这些骨骼所对应的avatar,然后点击这里获得它的骨骼结构

配置动画层级,为覆盖模式

新增持枪动画

可以看到当Rifle=true时,双手变成了持枪动画

游戏角色的疲劳感是如何制作的?利用Animation Layers中的additive模式把多个动画混合在一起

当我们要为当前的角色动画添加某种特色而又不希望取代现有动画时可以考虑使用additive模式

最常见的例子就是为角色添加"疲劳感"

那就让我们来着手为当前这个游戏角色增加一点疲劳感

新增疲劳层级,放置气喘吁吁的动画,通过控制这个权重值实现不同的疲劳程度

拖动一下weight,可以看到随着weight的增加,角色喘气的幅度越来越大了

那么我们再通过脚本为角色添加疲劳值的概念吧

站立不动的时候疲劳值会降低每秒降低"1"点,行走时疲劳值不变,奔跑时疲劳值增加

随着我们的奔跑,疲劳值在提升,喘气的幅度也在提升

停下来之后可以看到喘气的幅度由大变小直到消失

如何制作角色的受伤状态?Unity动画层级(Animation Layer)的Sync和Timing介绍

玩家角色在游戏过程中总是会受到各种各样的伤害

那么很多游戏就会用角色外观来直接表达玩家当前所受到的伤害程度,就是用一整套不同的受伤动画代替原有的动画

那么在一个新的layer里复制一整套原有层级的状态机,就是一个非常好的解决方案

比如我们现在就新建一个层级取名叫injured,用来表现角色受伤后的所有动画状态,然后在原来的层级这里全选所有的状态,然后按control c复制回到injury这一层

按control v粘贴,如果默认初始状态有变化的话,我们就重新选择一下

这样我们就得到了一个和原来层级一模一样的动画层级

但是这样做有一个问题,那就是随着开发的进行,原本的层级可能会有变化

那么此时就需要修改对应的injured layer中内容,如果变化过于频繁的话,则极有可能给开发者带来混乱

所以unity为我们在这里提供了一个同步功能,我们只需要在这里选择injured这一层,需要和哪个层级同步就可以了

那么在接下来的开发过程中,无论被指定的这一层级结构如何改变,injured layer都始终会与它保持一致

那么现在就让我们正式的新建一个层级来表现角色受伤情况下的移动情况

我们需要替换全身的动画,所以不需要avatar mask,blending模式我们选择override,IK pass我们勾选上

把weight调整到零

但是层级的同步仅仅是同步动画状态和动画状态间的转换关系,并不会同步blend tree的内容

所以在injured layer这里的这个locomotion状态是空的

我们需要新建里面的blend tree我们把之前在mixamo上下载好的受伤待机、受伤行走、和受伤奔跑动画片段放进去

根据他们自身的位移情况计算一下阈值

我们可以看出受伤后移动的速度确实会比没受伤的动画要慢很多

那么我们就假设当前这个游戏里角色受伤后移动速度会变成原来的百分之六十

我们之前设计的行走速度是1.5

那么这里就应该是1.50.6/0.966

我们在这里把阈值改成1.5
0.6

跑步也是

那么这里就应该是3.50.6/1.577374
我们把阈值改成3.5
0.6=2.1

效果

问题,比如受伤行走动画比原来行走动画可能播放时间短,按理说受伤行走动画应该是无法完美同步覆盖行走动画的才对,那么unity是如何解决这个问题的呢?

在默认情况下,sync layer中的动画状态的时长会被缩放至它所需要同步的层级中对应动画状态的时长

也就是说这里的受伤行走动画会被拉长与行走动画时间一样

如果我想反过来同步动画播放时长要怎么做呢?

一旦勾选了timing动画状态的播放时长就由他和被他同步的层级共同决定了

那么到底哪个层级的决定权更大一些呢

看这里的权重,当权重为一时,全都听当前这一层的,当权重为零时,全都听被同步的这一层的

新问题,那就是角色在受伤的状态下拿不起枪来了

在动画层级中位于下面的层级拥有更高的优先级,injured这一层拥有最高的播放优先级,它会代替的其他的所有动画

如果权重为一,那么代替的程度就为百分百,代替的部位呢则是全身

那么要解决我们之前遇到的问题就很简单了

我们把它拖上来,放到第二这个位置上

这样持枪动画的优先级就比上面两个要高了

参考

https://www.bilibili.com/video/BV1gT4y1k7EZ

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~

相关推荐
DreamByte3 分钟前
Python Tkinter小程序
开发语言·python·小程序
覆水难收呀12 分钟前
三、(JS)JS中常见的表单事件
开发语言·前端·javascript
阿华的代码王国16 分钟前
【JavaEE】多线程编程引入——认识Thread类
java·开发语言·数据结构·mysql·java-ee
谢泽浩18 分钟前
Unity 给模型贴上照片
unity·游戏引擎
z2014z19 分钟前
Unity Resource System 优化笔记
unity·游戏引擎
繁依Fanyi22 分钟前
828 华为云征文|华为 Flexus 云服务器部署 RustDesk Server,打造自己的远程桌面服务器
运维·服务器·开发语言·人工智能·pytorch·华为·华为云
王维志25 分钟前
Unity 高亮插件HighlightPlus介绍
unity·游戏引擎
weixin_4866811438 分钟前
C++系列-STL容器中统计算法count, count_if
开发语言·c++·算法
基德爆肝c语言38 分钟前
C++入门
开发语言·c++
怀九日44 分钟前
C++(学习)2024.9.18
开发语言·c++·学习·面向对象·引用·