Unity中的动画状态机(详解)

动画状态机的定义

Unity中的动画状态机(Animator Controller)是用于定义和管理角色或对象动画状态之间转换的工具。它允许动画师和开发者设计复杂的动画逻辑;

例如角色的行走、跑步、跳跃、攻击等动作,以及其他动作之间的平滑过渡,都需要动画状态机来控制。

动画状态机

Animator Controller 动画控制器

创建一个动画控制器:

找到Assest ------> 右键点击Create -------> Animation -------> Animator Controller

创建好的动画控制器会显示这个三个元素,这三个元素是动画状态机的基本组成部分

  • Any State:这个是一个特殊的状态,它允许从任何其他状态过渡,在Animator Controller的状态机中,你可以从这个状态创建过度到其他的任何状态,无论它们是否在同一个层级或者不同的层级
  • Entry:这个是状态机的入口点,当Animator Controller开始运行的时候,它会从这个状态开始。通常,会将这个状态设置为动画播放的起始点,或者作为其他状态的过渡态
  • Exit:这个是状态机的出口点,当Animator Controller结束运行的时候,它会达到这个状态,在大多数情况下,Exit状态用于处理动画播放完成后的清理工作,或者作为其他状态的过渡终点

这里实现了一个从 idle(待机)到run(跑)之间的转换

  1. 这些选项是对动画状态进行操作的菜单命令,当你在Animator窗口中右键点击一个动画状态的时候,会出现这个菜单
  2. Make Transition:创建一个从当前状态到另一个状态的过渡,这会允许你定义动画如何在不同状态之间进行切换
  3. Set as Layer Default State:将当前状态设置为所在层的默认状态,这意味着Animator Controller的该层被激活时,将从这个状态开始播放动画
  4. Copy:复制当前的状态,这会创建一个与当前状态完全相同的新状态
  5. Create new BlendTree in State:在当前状态中创建一个新的Blend Tree,Blend Tree是一种特殊类型的动画状态,它允许你混合多个动画剪辑,通常用于创建平滑的动画过渡
  6. Delete:删除当前状态,这会从Animator Controller 中移除这个状态,以及所有指向或来自这个状态的过渡

Create State:创建一个新状态:

  •         Empty:创建一个空状态,这个状态没有任何关联的动画剪辑,可以作为过渡的中间点或用于创建自定义的动画逻辑
  •         From Selected:从当前选中的动画剪辑创建一个新状态,这个状态会直接关联到你选中的动画剪辑
  •         From New Blend Tree:从一个新的Blend Tree创建一个新状态。Blend Tree允许你混合多个动画剪辑,通常用于创建平滑的动画过渡

Create Sub-State Machine:创建一个子状态机,子状态机是嵌套在另一个状态机内部的状态机,用于组织重用复杂的动画逻辑

Paste:粘贴之前复制或剪切的状态或子状态机

Copy current StateMachine:复制当前的状态机,这允许你创建一个现有的状态机的副本,可以对其进行修改而不影响原始状态

参数设置界面

Parameters

这是Animator Controller中的一个层,参数是用于控制动画逻辑的变量,可以是不同的类型,里面有浮点数 Float、整数 Int、布尔值 Bool、还有一个触发器Trigger(这是一种特殊的布尔值,它在被设置为真的时候触发一次,然后自动重置为假。通常被设置为一次性事件)

Base Layer

所有的动画状态和过渡都包含在这里,可以将这个名字进行重命名


Animation 动画

创建一个动画:

找到Assest ------> 右键点击Create -------> Animation -------> Animation

在这个Animation里面,我们可以将创建好的Animation拖拽到我们需要绑定的物体上,就会直接生成一个动画控制器,并且这个动画控制器和我们的物体也是绑定的;也可以将我们新创建好的动画拖拽到动画控制器的面板上,与之进行绑定

我们可以在Animation窗口中实现:

  • 创建动画剪辑:将动画的每帧拖拽到面板上,在时间轴上设置关键帧,定义动画的开始和结束状态
  • 预览动画:使用播放控制按钮预览动画效果,调整关键帧和属性值,直到动画达到预期的效果
  • Samples:指的是每秒从采样点数,这个设置决定了动画在一秒钟内被分成了多少个的采样点,从而影响动画;可以理解为每秒有多少帧的动画,类似于那种连环画

Inspector面板

Controller:这里显示的是Animator组件所使用的Animator Controller,可以选择进行绑定

Avatar:Avatar指的是动画数据的容器,它包含了骨骼结构和动画剪辑

Apply Root Motion:这个选项决定了是否将动画的根运动(角色的移动)来应用到游戏对象上面

Update Mode:决定了Animator组件更新动画的状态

  1.         Normal:动画状态的更新与游戏的帧率同步,这意味着动画的更新频率会随着游戏帧率的变化而变化
  2.         Animate Physics:动画状态的更新与物理更新同步,通常用于需要与物理模拟紧密同步的动画
  3.         Unscaled Time:动画状态的更新与时间无关,即使游戏暂停或时间缩放的改变,动画也会继续正常速度进行播放,这种比较适用于UI动画

Culling Mode:决定了在游戏对象不可见的时候,动画是否继续播放

  1.         Alawys Animate:即使在屏幕外也会继续持续播放
  2.         Cull Update Transform:停止更新视野外的游戏的动画,但是会仍然更新其Transform,这意味这游戏对象位置和方向会保持更新,但动画本身不会播放,直到游戏对象重新进入摄像机视野
  3.         Cull Completely:当游戏对象不在摄像机视野内,动画和Transform更新都会被停止,这样可以节省性能,当游戏对象每次重新进入视野的时候,可能会出现位置或动画的跳跃

Animator Override Controller

Unity中的一个功能,它允许你在不修改原始Animator Controller的情况下,重写或添加新的动画状态和过渡。这在需要为不同的游戏对象或场景微调动画行为时非常有用,而不需要创建多个Animator Controller的变体

用法

  1. 覆盖现有状态:修改原始Animator Controller中的动画状态,例如更改动画剪辑或调整过渡条件。

  2. 添加新状态:在不改变原始Animator Controller的情况下,添加全新的动画状态。

  3. 调整参数:修改或添加新的参数,这些参数可以用于控制动画过渡和状态。

  4. 优化性能:通过只加载必要的动画资源,减少内存占用和提高加载速度。

使用情况

  • 多角色动画:当你有多个角色使用相同的动画逻辑,但需要不同的动画资源时。
  • 场景特定动画:为特定场景或环境调整动画,而不影响其他场景。
  • 动态动画调整:根据游戏运行时的条件动态调整动画。

通过代码控制改变Animator Controller的行为

获取Animator组件

Animator animator = GetComponent<Animator>();

设置参数

animator.SetBool("IsRunning", true); // 设置布尔参数
animator.SetFloat("Speed", 5.0f);    // 设置浮点数参数
animator.SetInteger("Health", 100);  // 设置整数参数

触发过渡

animator.SetTrigger("Jump"); // 触发一个触发器

播放特定的动画状态

animator.Play("Run"); // 播放名为"Run"的动画状态

停止动画

animator.Stop(); // 停止当前播放的动画

检查当前状态

AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(0);
if (stateInfo.IsName("Idle"))
{// 当前状态是Idle
}

我们也可以在代码里动态创建和配置Animator Controller,但通常都是在Unity编译器里面进行创建

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

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

相关文章

Vue笔记-element ui中关于table的前端分页

对于 Element UI 表格的前端分页&#xff0c;可以在组件中使用 JavaScript 来实现数据的分页显示&#xff0c;而不必从后端获取已分页的数据。以下是一个简单的示例&#xff0c;演示如何在前端进行 Element UI 表格的分页&#xff1a; <template><div><el-tabl…

ShellCode 格式化代码注入工具

一款基于C/C开发的应用层汇编代码注入工具&#xff0c;可实现向特定进程内注入动态链接库模块或注入ShellCode汇编指令集&#xff0c;还可以实现第三方进程的汇编级Call调用&#xff0c;通常被用于协助渗透人员完成内存注入&#xff0c;同时也可用于对特定ShellCode汇编代码进行…

Ubuntu系统安装软件

在Linux系统中有四种软件安装方式&#xff1a;rpm、yum、apt、编译安装 编译安装 编译安装只有一个源码包&#xff0c;源码包是由一大堆源代码程序组成的&#xff0c;是由程序员按照特定格式和语法编写好了&#xff0c;现成的安装包 程序&#xff1a;未执行的代码 进程&#…

雷池社区版compose配置文件解析-mgt

在现代网络安全中&#xff0c;选择合适的 Web 应用防火墙至关重要。雷池&#xff08;SafeLine&#xff09;社区版免费切好用。为网站提供全面的保护&#xff0c;帮助网站抵御各种网络攻击。 compose.yml 文件是 Docker Compose 的核心文件&#xff0c;用于定义和管理多个 Dock…

自动驾驶-传感器简述

自动驾驶车辆上的传感器类型包含激光雷达、毫米波雷达、相机、imu、rtk、超声波雷达等&#xff0c;这些传感器用来接收外部世界多姿多彩的信号&#xff0c;根据接收到的信号&#xff0c;车载大脑对信号进行处理&#xff0c;那信号的准确程度就尤为重要。 本文将各个传感器的特性…

Lucas带你手撕机器学习——岭回归

岭回归&#xff08;Ridge Regression&#xff09; 一、背景与引入 在进行线性回归分析时&#xff0c;我们常常面临多重共线性的问题。多重共线性指的是自变量之间高度相关&#xff0c;这会导致回归系数的不稳定性&#xff0c;使得模型的预测能力降低。传统的线性回归通过最小…

模块化主动隔振系统市场规模:2023年全球市场规模大约为220.54百万美元

模块化主动隔振系统是一种用于精密设备和实验装置的隔振解决方案&#xff0c;通过主动控制技术消除振动干扰&#xff0c;提供稳定的环境。目前&#xff0c;随着微纳制造和精密测量技术的发展&#xff0c;对隔振系统的要求越来越高。模块化设计使得系统能够灵活适应不同负载和工…

STM32 第3章 如何用串口下载程序

时间:2024.10.28 一、学习内容 1、安装USB转串口驱动 1.1串口下载连接示意图 1、USB转串口模块在开发板上是一个独立的模块,可通过调帽与其他串口连接,USART1/2/3/4/5 2、只有USART1才具有串口下载的功能。 3、CH340是电平转换芯片,将电脑端输出的USB电平和单片机输…

1.3 面向对象 C++面试问题

1.3.1 简述一下什么是面向对象,面向对象与面向过程的区别 什么是面向对象 面向对象&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它通过将现实世界中的实体抽象为“对象”来组织代码。面向对象编程关注对象及其交互&#x…

行业首发|美格智能创新推出5G+Wi-Fi 7智能终端解决方案,端侧AI助力数智升维

在数字化时代的生产生活过程中&#xff0c;特殊场景下的通信需求愈发重要。高速、灵活、稳定的通信保障能够进一步提升生产生活的效率。随着5G网络的高速发展&#xff0c;一方面&#xff0c;其凭借低时延、高带宽、高可靠性和大规模连接的特性让移动终端的网络连接实现跨越式升…

论文解析八: GAN:Generative Adversarial Nets(生成对抗网络)

目录 1.GAN&#xff1a;Generative Adversarial Nets&#xff08;生成对抗网络&#xff09;1、标题 作者2、摘要 Abstract3、导言 IntroductionGAN的介绍 4、相关工作 Related work5、模型 Adversarial nets总结 6.理论计算 Theoretical Results具体算法公式全局优化 Global O…

【32】C++流

目录 C流 读写文件&#xff1a;文件流 对文本文件流读写 写文本文件 读文本文件 对二进制文件流读写 写二进制文件 读二进制文件 对文件流按格式读写取数据 按指定格式写文件 按指定格式读文件 C流 IO: 向设备输入数据和输出数据 C的IO流 设备: 文件控制台特定的数…

21世纪20年代了, 居然遭遇扩容U盘!

扩容u盘前些年很泛滥&#xff0c; 所以也有针对扩容u盘的测试软件 h2testw h2testw的工作原理很简单&#xff0c; 就是往u盘里写文件&#xff0c;写满后再读取文件进行验证 如果没有h2test&#xff0c; 也可以往里面考大文件&#xff0c; 再拷贝出来&#xff0c; 不出错就表示…

Navicat导入Excel数据时数据被截断问题分析与解决方案

目录 前言1. 问题分析1.1 默认字段类型的影响1.2 MySQL诊断机制的限制 2. 解决方案2.1 修改字段长度2.2 修改Excel数据以影响推断2.3 检查导入工具的设置 3. 其他注意事项3.1 注册表的修改3.2 增加自增ID 4. 结语 前言 在数据库的日常操作中&#xff0c;将Excel数据导入MySQL是…

SQL Server 当前日期及其未来三天的日期

当前日期及其未来三天的日期&#xff0c;并分别以 YYYY-MM-DD 和 yyyyMMdd 的格式展示 1、当前日期及其未来三天的日期&#xff0c;以 YYYY-MM-DD的格式展示 WITH CurrentDate AS (SELECT GETDATE() AS 当前日期 ) -- 使用 CONVERT 函数 SELECTCONVERT(VARCHAR(10), 当前日期,…

Ubuntu22.04版本左右,扩充用户可使用内存

1 取得root权限后&#xff0c;输入命令 lsblk 查看所有磁盘和分区&#xff0c;找到想要替换用户可使用文件夹内存的磁盘和分区。若没有进行分区&#xff0c;并转为所需要的分区数据类型&#xff0c;先进行分区与格式化&#xff0c;过程自行查阅。 扩充替换过程&#xff0c;例如…

Springboot项目搭建的问题

1.第一次出现这个问题是在使用postgresql进行搭建项目的时候&#xff0c;但是配置文件中的驱动一致导入不了 最后发现是meaven中依赖导入不进来&#xff08;不知道为什么&#xff09;&#xff0c;于是手动的在meaven中央仓库下载了对应的jar进行配置 然后项目可以正常启动 2.…

大模型系列——AlphaZero/强化学习/MCTS

AlphaGo Zero无需任何人类历史棋谱&#xff0c;仅使用深度强化学习&#xff0c;从零开始训练三天的成就已远远超过了人类数千年积累的围棋知识。 1、围棋知识 &#xff08;1&#xff09;如何简单理解围棋知识 &#xff08;2&#xff09;数子法分胜负&#xff1a;https://zhu…

w外链如何跳转微信小程序

要创建外链跳转微信小程序&#xff0c;主要有以下几种方法&#xff1a; 使用第三方工具生成跳转链接&#xff1a; 注册并登录第三方外链平台&#xff1a;例如 “W外链” 等工具。前往该平台的官方网站&#xff0c;使用手机号、邮箱等方式进行注册并登录账号。选择创建小程序外…

Jellycat玩偶界的天花板,如何用情绪营销征服成年人的心?

Jellycat的用户肯定对这个品牌有一定的了解&#xff0c;不知道的用户或许也看过这个很火的茄子表情包&#xff0c;这是Jellycat很火的一款玩偶“活泼茄子”。Jellycat&#xff0c;这个源自英国伦敦的高端玩具品牌&#xff0c;近年来在全球范围内迅速走红&#xff0c;摇身一变玩…