【Unity动画系统】动画层级(Animation Layer)讲解与使用

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

想让玩家持枪行走,但是手里只有行走和持枪站立的动作。

Unity中最方便的解决办法就是使用动画层级animation layer以及替身蒙版avatar mask。

创建一个动画层级

Weight表示权重,0的话则完全不播放,1的话则会播放;

Mask为骨骼蒙版

创建一个Avatar Mask

这个Avatar只会影响选中的部分。

是人形动画则直接使用Humanoid。如果不是,可以用下面的Transform直接选择哪些骨骼节点受影响或不受影响。

Blending中Override是指将当前动画取代上面的动画,而使用一部分动画则是当前动画取代之前部分的动画;而Additive指的是将上面的动画与本身动画混合起来。

勾选后为同步,表示当前层级与哪个层级保持一致。

表示开启IK动画,这里指的是蒙层的IK。

实战:


先在层级中创建一个空状态,表示在默认情况下这一层不播放任何动画。

然后添加需要的动作。

写一个参数Rifle,然后设置其启动的值。

在代码中触发:

bool armedRifle;	//用来判断是否要抬起手public void GetArmedRifleInput(InputAction.CallbackContext ctx){armedRifle = !armedRifle;	//每次都取一次反animator.SetBool("Rifle", armedRifle);	//然后赋值给动画}

利用Animation Layers中的Additive模式把多个动画混合在一起(可用来实现动画的疲劳感)

Additive将现有动画添加到现有动画上,这一层动画不会取代现有动画。

常见场景就是为角色添加疲劳感。

空状态为核心的轮辐轮毂构架(Spoke-hub distribution paradigm)来安排这一层状态机

一般动画判断在代码里不太适合直接使用字符串,包括直接在调用上和不直接使用常量一致,都应先声明变量再添加

创建第三个状态机,然后将其改为Additive

    float currentFatigue;   //现在疲劳值float minFatigue = 0f;  //最低疲劳值float maxFatigue = 10f; //最高疲劳值int fatigueLayerIndex;  //获取动画层级void Start(){fatigueLayerIndex = animator.GetLayerIndex("State");    //获取层级序号名字}void Update(){CalculateFatigue();}void CalculateFatigue(){if(currentSpeed < 1f && currentFatigue >= minFatigue)    //速度小于1,疲劳值大于等于0时,疲劳值减减{currentFatigue -= Time.deltaTime;}else if(currentSpeed > 2f && currentFatigue <= 10) //速度大于2,疲劳值小于等于10时,疲劳值加加{currentFatigue += Time.deltaTime;}else    //最后都不属于的返回{return;}currentFatigue = Mathf.Clamp(currentFatigue, minFatigue, maxFatigue);  //限制最小值与最大值animator.SetLayerWeight(fatigueLayerIndex, currentFatigue / maxFatigue);  //对疲劳权重的修改,修改的层数,修改的权重值}

Unity动画层级(Animation Layer)的Sync和Timing介绍

新键一个层级,有些工程中我们需要将某个层级的复制下来然后修改。

可以直接使用同步Sync,打勾后选择与哪个层级同步。

虽然同步了,但是动画内容都是空的,需要自行添加,blend tree需要选择Create new BlendTree in State。

选择受伤过后的动画加入新的混合树,同样选择以什么方向为计算。

比如打架的行走是普通走路的60%。

3.5是行走混合树的阈值,这里乘以60%然后除以现在的阈值。

新阈值3.5 * 0.6 / 1.737

代码:

    int injuredLayerIndex;  //用来保存动画层的序号float injuredFactor = 0.6f; //角色受伤过后移动速度受到的影响bool isInjured; //用来表明是否受伤private void Start(){injuredLayerIndex = animator.GetLayerIndex("injured");  //获取序号}public void GetArmedInjuredInput(InputAction.CallbackContext ctx){isInjured = !isInjured;if (isInjured){animator.SetLayerWeight(injuredLayerIndex, 1);  //如果受伤则将层数权重设置为1}else{animator.SetLayerWeight(injuredLayerIndex, 0);  //如果受伤则将层数权重设置为0}}

因为没有所以使用Jump

按下空格后

层级同步,如果动画本身长度不同步怎么办?

Unity会将短的那个动画的长度修改为被它所需要同步的层级中。

如果希望由这个层级来决定动画状态的时长?

需要勾选timing。

不过只有当层级的混合模式是override的时候才可以使用

勾选了Timing后动画状态的播放时长就由它和被它同步的层级共同决定。哪个层级的决定权更大呢?看权重,当当前层级权重为1 时,听当前层级的,权重为0时,听被同步层级的,一半的话取平均值

总结:层级同步动画必须一致,关于与谁一致,看timing与weight的设置。

使用Unity动画层级后很多动画无法正常播放?Layer优先级与Additive的工作原理

动画层级优先级越往下越高。

如果Blending是override,如果权重是1,那么会将上面的全部覆盖掉;如果是某些部位,那么完全覆盖掉当前部位的动作。

如果是Additive,它不代表会代替某些动画, 它的最高级的优先级表示不存在任何一个override的层级可以完全覆盖掉当前的动画。

Additive的具体行为是把当前层级所播放的动画加到之前层级的结果上去,当前这里的avatar mask表示只影响躯干的部位;

weight表示它会把本身动画以多少比例添加到之前的结果上去,0表示不添加、1表示完全添加。

比如喘气弯腰最大幅度是六十度,那么权重为1时,那么就在原有动画基础上弯腰60度;权重为0.5时,那么就在原有动画基础上弯腰30度。

当一个动画只有静止的动作(如持枪),最好使用Override,因为Additive是将动画添加到其他层级的动画结果上去,而一般静止动画除了第一帧和最后一帧,中间是没有动画的,而这时候就不可能把动画添加到原来动画上去。

按照规则合理的配置层级属性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/320771.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PXE高效批量网络装机

一.PXE概述 PXE批量部署的优点 规模化&#xff1a;同时装配多台服务器自动化&#xff1a;安装系统、配置各种服务远程实现&#xff1a;不需要光盘、U盘等安装介质 PXE&#xff08;Preboot eXcution Environment&#xff09; 预启动执行环境&#xff0c;在操作系统之前运行 …

【从零开始学架构 前言】整体的学习路线

本文是《从零开始学架构》的第一篇学习笔记&#xff0c;在工作6年左右的这个时间点需要有一些先行的理论来指导即将面临的复杂实践&#xff0c;以便在真正面临复杂实践的时候能有所参照。 主要从以下几个方面和顺序来进行学习 架构基础&#xff1a;从架构设计的本质、历史背景…

最详细的IP SSL证书介绍及申请渠道

JoySSL官网 注册码230918 在互联网的广阔舞台上&#xff0c;每个参与其中的设备都需要一个独一无二的标识——IP地址&#xff0c;以实现精准的通信和数据交换。随着网络安全重要性的日益凸显&#xff0c;如何验证和信任这些IP地址的真实性成为了一个核心问题。正是在这样的背景…

(数据分析方法)相关性分析

目录 一、定义 二、相关关系分类 三、数据可视化(散点图) 四、相关分析 4.1 量化指标 4.1.1 相关系数 4.1.1.1 皮尔森&#xff08;Pearson&#xff09;相关系数 4.1.1.2 斯皮尔曼&#xff08;Spearman&#xff09;相关系数 4.1.1.3 肯达尔&#xff08;Kendall&#xff…

JavaScript中的RegExp和Cookie

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; 文章目录 &#x1f506;RegExp &#x1f3b2; 1 什么是正则表达式 &#x1f3b2;2 创建…

【go项目01_学习记录04】

学习记录 1 集成 Gorilla Mux1.1 为什么不选择 HttpRouter&#xff1f;1.2 安装 gorilla/mux1.3 使用 gorilla/mux1.4 迁移到 Gorilla Mux1.4.1 新增 homeHandler1.4.2 指定 Methods () 来区分请求方法1.4.3 请求路径参数和正则匹配1.4.4 命名路由与链接生成 1 集成 Gorilla Mu…

springboot+vue+elementui实现校园互助平台大作业、毕业设计

目录 一、项目介绍 二、项目截图 管理后台 1.登录&#xff08;默认管理员账号密码均为&#xff1a;admin&#xff09; 2. 用户管理 ​编辑 3.任务管理 互助单&#xff08;学生发布&#xff09; 行政单&#xff08;教师发布&#xff09; ​编辑 审核&#xff08;退回需…

【无标题】不锈钢轴承能耐高温多少度:开启润滑技术新纪元

江苏鲁岳SIAIF品牌的不锈钢耐高温轴承的具体耐高温性能会因轴承的型号、材料、制造工艺等因素而有所不同。然而&#xff0c;一般来说&#xff0c;不锈钢轴承的耐高温性能较高&#xff0c;可以在高温环境下正常工作。 根据相关资料&#xff0c;SIAIF不锈钢耐高温轴承可以在-60℃…

Linux基本指令(下下)

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 本篇博客续我之前的Linux指令&#xff08;下&a…

数据库提权

1.此时实验需要用到的软件&#xff1a; &#xff08;1&#xff09;phpStudy该程序包集成最新的ApachePHPMySQL phpMyAdminZendOptimizer,一次性安装,无须配置即可使用,是非常方便、好用的PHP调试环境.该程序不仅包括PHP调试环境,还包括了开发工具、开发手册等.总之学习PHP只需…

C#队列(Queue)的基本使用

概述 在编程中&#xff0c;队列&#xff08;Queue&#xff09;是一种常见的数据结构&#xff0c;它遵循FIFO&#xff08;先进先出&#xff09;的原则。在C#中&#xff0c;.NET Framework提供了Queue<T>类&#xff0c;它位于System.Collections.Generic命名空间下&#x…

基于.NET WinForms 数据CURD功能的实现

使用开发工具 VS 2022 C#&#xff0c;数据库MS SQL SERVER 2019 &#xff0c;基于NET WinForms&#xff0c;实现数据记录的创建(Create)、更新(Update)、读取(Read)和删除(Delete)等功能。主要控件包括&#xff1a;DataGridView&#xff0c;SqlDataApater &#xff0c; DataTab…

MATLAB绘制蒸汽压力和温度曲线

蒸汽压力与温度之间的具体关系公式一般采用安托因方程&#xff08;Antoine Equation&#xff09;&#xff0c;用于描述纯物质的蒸汽压与温度之间的关系。安托因方程的一般形式如下&#xff1a; [\log_{10} P A - \frac{B}{C T}] 其中&#xff0c; (P) 是蒸汽压&#xff08…

OpenNJet下载安装及入门实战教程

一、什么是OpenNJet OpenNJet是一款开放原子开源基金会孵化及运营的开源项目。OpenNJet采用C语言实现。是一款高性能、轻量级的WEB应用及代理软件。    OpenNJet 应用引擎是高性能、轻量级的WEB应用与代理软件。作为云原生服务网格的数据平面&#xff0c;NJet具备动态配置加载…

02_SpringBoot程序快速启动

目录 打包命令启动启动成功测试结果 打包 点击package打包命令&#xff0c;会生成target目录&#xff0c;目录下会有生成的jar包 命令启动 打开cmd命令窗口&#xff0c;进入子项目的target目录下,输入命令后&#xff0c;回车… java -jar .\note-boot-core-1.0-SNAPSHOT.j…

【强训笔记】day11

NO.1 思路&#xff1a;枚举&#xff0c;设一号大礼包的数量为x&#xff0c;二号大礼包的数量为y&#xff0c;用循环枚举一号大礼包的个数得到二号大礼包的数量&#xff0c;使得某一时刻axby的值最大。 代码实现&#xff1a; #include<iostream>using namespace std;lo…

耐高温轴承:免维护技术的里程碑,润滑领域迎来新篇章

选择适合的耐高温轴承产品型号需要考虑多个因素&#xff0c;包括使用环境、温度要求、负荷大小、转速高低、润滑方式等。以下是一些选择耐高温轴承产品型号的建议&#xff1a; 江苏鲁岳根据使用环境和温度要求选择轴承材料&#xff1a;不同的轴承材料具有不同的耐高温性能。例…

AI原生实践:测试用例创作探索

测试用例作为质量保障的核心&#xff0c;影响着研发-测试-发布-上线的全过程&#xff0c;如单元测试用例、手工测试用例、接口自动化用例、UI 自动化用例等&#xff0c;但用例撰写的高成本尤其是自动化用例&#xff0c;导致了用例的可持续积累、更新和迭代受到非常大制约。长久…

10.Java对象内置结构

文章目录 Java对象内置结构1.Java对象的三个部分1.1.对象头1.2.对象体1.3.对齐字节 2.对象结构中核心字段的作用2.1.MarkWord(标记字)2.2.Class Pointer(类对象指针)2.3.Array Length(数组长度)2.4.对象体2.5.对齐字节 3.Mark Word的结构信息3.1.不同锁状态下的Mark Word字段结…

【Redis】RDB持久化和AOF 持久化

分布式缓存 单点 Redis 的问题 数据丢失&#xff08;持久化&#xff09;并发能力不如集群&#xff08;主从集群、读写分离&#xff09;Redis宕机导致服务不可用&#xff08;Redis哨兵&#xff09;存储能力差&#xff08;分片集群&#xff09; Redis 持久化 RDB 持久化 什么…