【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是将动画添加到其他层级的动画结果上去,而一般静止动画除了第一帧和最后一帧,中间是没有动画的,而这时候就不可能把动画添加到原来动画上去。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux安装Python3.9环境

大家好&#xff0c;今天给大家分享一下在Linux系统中安装Python3环境&#xff0c;Linux系统中自带的Python2尽量不要删除&#xff0c;删除后可能会导致系统出现问题。 关于Linux常用命令&#xff0c;可以参考&#xff1a;作为测试人员的Linux常用命令 一、下载Python3安装包 …

Unity射击游戏开发教程:(11)制造敌人爆炸

增加爆炸效果 爆炸一切都变得更好!尤其是当你消灭敌人时。在这篇文章中,我将讨论如何在敌人被击中时为其添加爆炸动画。 在敌人的预制件中,您将需要创建一个新的动画。查看控制动画的动画器,默认情况下将从进入动画到敌人爆炸动画。这意味着,一旦敌人被实例化,敌人爆炸…

基于Opencv的车牌识别系统(毕业设计可用)

系统架构 图像采集&#xff1a;首先&#xff0c;通过摄像头等设备捕捉车辆图像。图像质量直接影响后续处理的准确性&#xff0c;因此高质量的图像采集是基础。 预处理&#xff1a;对获取的原始图像进行预处理&#xff0c;包括灰度化、降噪、对比度增强和边缘检测等。这些操作旨…

【Oracle直播课】5月19日Oracle 19c OCM认证大师课 (附课件预览)

Oracle 19c OCM认证大师培训 - 课程体系 - 云贝教育 (yunbee.net) 部分课件预览 OCM部分课件预览 Oracle Database 19c Certified Master Exam (OCM) 认证大师 25 天 / 150课时 什么是Oracle 19c OCM&#xff1f; Oracle Certified Master (OCM)是Oracle认证大师&#xff0c;…

汇编语言——比较两个字符串STRING1和STRING2所含字符是否完全相同,若相同则显示MATCH, 不相同则显示NO MATCH

CMPS 串比较指令&#xff1a; CMPS SRC, DST CMPSB &#xff08;字节&#xff09; CMPSW &#xff08;字&#xff09; 执行操作&#xff1a; ((SI)) - ((DI)) 根据比较结果置条件标志位&#xff1a;相等 ZF1&#xff1b;不等 ZF0 字节操作&#xff1a;(SI)←(SI)1, (DI)←(DI…

VMware虚拟网卡网络适配器出现黄色感叹号

问题发生&#xff1a;VMware在使用Ubuntu的过程中突然卡死&#xff0c;强制关闭开启后就发生了网络无法连接 找到电脑的设备管理发现VMware的适配器出现黄色感叹号 解决方法&#xff1a; 下载软件ccleaner 扫描问题&#xff0c;懒得去找就修复了所有的问题 最后发现适配器…

Ansible简介版

目录 架构 环境部署 一、Ansible安装部署 1.yum安装Ansible 2.修改主机清单文件 3.配置密钥对验证 4.ansible-doc 5.看被控主机 二、常用模块 1.Command模块 2.Shell模块 3.Cron模块 1.添加 2.删除 4.User模块 5.Group模块 1.创建组 ​编辑 ​编辑 ​编辑…

【redis】redis持久化分析

目录 持久化Redis持久化redis持久化的方式持久化策略的设置1. RDB&#xff08;快照&#xff09;fork(多进程)RDB配置触发RDB备份自动备份手动执行命令备份&#xff08;save | bgsave&#xff09;flushall命令主从同步触发动态停止RDB RDB 文件恢复验证 RDB 文件是否被加载 RDB …

c# - - - winform程序四个角添加圆角效果

winform 给窗体四个角添加圆角效果。 在窗体 Load 事件中添加如下代码&#xff1a; // 创建了一个圆角矩形的路径&#xff0c;并将其设置为控件的形状 System.Drawing.Drawing2D.GraphicsPath path new System.Drawing.Drawing2D.GraphicsPath(); int radius 30; path.AddAr…

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记13 - STM32的SDIO学习5 - 卡的轮询读写擦

KEIL 5.38的ARM-CM3/4 ARM汇编设计学习笔记13 - STM32的SDIO学习5 - 卡的轮询读写擦 一、前情提要二、目标三、技术方案3.1 读写擦的操作3.1.1 读卡操作3.1.2 写卡操作3.1.3 擦除操作 3.2 一些技术点3.2.1 轮询标志位的选择不唯一3.2.2 写和擦的卡状态查询3.2.3 写的速度 四、代…

跟TED演讲学英文:What moral decisions should driverless cars make by Iyad Rahwan

What moral decisions should driverless cars make? Link: https://www.ted.com/talks/iyad_rahwan_what_moral_decisions_should_driverless_cars_make Speaker: Iyad Rahwan Date: September 2016 文章目录 What moral decisions should driverless cars make?Introduct…

【笔试训练】day20

1.经此一役小红所向无敌 默认小红血量无限。直接计算出经过几轮攻击后&#xff0c;会出现人员伤亡。 对于对立来说他最多承受n轮光的攻击&#xff0c;对于光来说&#xff0c;他最多承受立得m轮攻击。 所以在经过min(n,m)轮回合之后&#xff0c;他们两个人至少死一个。活下来的…

已解决Error: Could Not Find a Version That Satisfies the Requirement XXX

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

大数据面试题(十):Hive的高频面试考点(二)

文章目录 Hive的高频面试考点 一、请说明Hive中 sort by ,order by ,cluster by ,distribute by各代表什么意思

Java多线程优化接口响应

同步查询 Override public MallOrder getById1(Long id) {long startTime System.currentTimeMillis();MallOrder mallOrder new MallOrder();mallOrder.setId(1L);mallOrder.setShopId(3L);mallOrder.setCustomerId(78L);mallOrder.setGoodsId(664L);mallOrder.setOrderTime…

java基础07(二维数组 方法)

目录 一. 二维数组 1. 声明 2. 初始化 3. 取值 赋值 4. 遍历 5. 一些细节 二. 方法 1. 方法的定义 1.1 无返回值方法 1.2 有返回值方法 2. 方法的调用 3. 动态参数 4. Overload 方法重载 一. 二维数组 二维数组的本质其实就是一维数组&#xff0c;只不过每个元素又是…

PCB光控打孔机第二版程序(一)

/*PCB机程序 XY同时启动 L9751 CODE61068 2018 6 19 08:00 固定位置释放吸盘*/ /*修正寻点第十二条结束调用计算坐标L5091&#xff0c;自动运行Y计算L6280 6281***/ /*** 开外部中断2关闭定时器2XY轴输出信号&#xff0c;自动运行循环检测外部中断高电平重启XY轴输出信号 增加寻…

node安装

1. node.js是用来干什么的&#xff1f; 简单来说&#xff0c;Node.js 是一个多功能的 JavaScript 运行环境&#xff0c;就像jdk是java的运行环境一样&#xff0c;不过node还提供了类似于tomcat一样的服务器功能&#xff0c;可以像后端一样运行起来拥有单独的地址和端口。 1.1…

Skywalking的重要功能详解

学习本篇文章之前首先要了解一下Sky walking的基础知识 分布式链路追踪工具Sky walking详解 一&#xff0c;Sky walking监控数据库 在admin服务中&#xff0c;连接数据库查询user表中所有数据 引入依赖 <dependency><groupId>mysql</groupId><artifactI…

Redis高级(Redis持久化,Redis主从模式,Redis哨兵模式,Redis分片集群)

目录 一、单机Redis 1. 问题说明 2. 安装Redis 1 解压安装Redis【备用】 2 配置Redis 3 启动Redis 3. 小结 二、Redis持久化 1. 持久化机制介绍 2. RDB模式 3. AOF模式 4. RDB和AOF对比 5. 小结 三、Redis主从模式 1. 介绍 2. 搭建Redis主从架构【备用】 3. 主…