Unity中的Animator动画详解

2023-11-11

Animator动画导入

模型名+@+动画名的方式,可以直接组装使用动画;
直接将动画资源导入到unity中,一般包含模型、贴图、材质三种。

Animator动画详解

动画类型选择

Rig面板属性

Animation Type 不同的动画类型
None 无状态
Legacy 老版Animation用的模式(无法使用状态机)。
Generic (新版本)人形非人形都可以使用;
Humanoid (新版本)只能人形动画使用;选中后Apply按钮可点击确定是否可以使用;

Configure…按钮点击打开骨骼配置的界面;
骨骼配置界面
Avatar Definition:骨骼获取方式;

Mode面板属性

Mode面板属性 Value
Scale Factor 缩放因子(控制模型大小)
Mesh Compression 网格压缩(用于优化,越高越消耗性能)
Read/Write Enabled 可读可写(模型需发生变化)
Optimize Colliders 优化的一种方式(一般选中默认模式)
Generate Colliders 自动给模型添加Colliders碰撞器

Animation面板属性

在这里插入图片描述
Import Animation :导入动画;
Anim.Compression :优化动画的一种方式;
Rotation Error 、Position Error 、Scale Error :由上选择出现的三种优化类型;值越小越消耗性能,值越大越不精确;
Clips:动画片段,可以剪辑添加动画片段;+ 添加动画片段,-删除相关的动画片段;

动画片段

在这里插入图片描述
点击上面的Clips里面的动画片段,弹出来相对应的动画片段;
start、End:本动画片段的开始结束时间;
Loop Time:本动画片段是否循环;
Loop Pose:循环时动画播放更加平滑(设置为循环动画状态);
Curves:动画曲线;
Events:动画事件回调;(写入的方法名字脚本必须在本物体上)
Mask: 动画遮罩

控制使用 Animator动画

模型添加Animator组件,
在这里插入图片描述
Controller:动画控制器;
Avatar:骨骼配置,相同的骨骼可以共用一套动画;
Apply Root Motion :勾选后会使用模型自身的位移;
update Mode ;
Normal:正常的;
Animate Physics:物理更新;
Unscaled Time:忽略时间,常用语ui动画,不会因为暂停而不播放;
Culling Mode : 剔除模式;(优化的一种)
Always Animate :总是播放,不管我的相机是否照射到动画,本动画一直 会播放;
Cull Update Transforms : 相机外,剔除动画动作,但是留下位移;
Cull Completely: 相机外剔除动画动作位移;

创建动画控制器,添加需要播放的动画片段

Create ->Animator Controller创建动画控制器;
打开动画控制器,把相应的动画片段放到动画控制器中;

在这里插入图片描述Any State: 任何状态;(到的目标状态任意状态都可以到目标的状态)
Entry:退出状态;
Exit:进入状态;
Layers:动画层;
Parameters:本动画层的的数据层;

创建动画状态

1:让动画直接拖入到Animator 面板中去;可以直接用;
2:在Anmimator面板中点击右键,Create State->Empty;
在这里插入图片描述
New State :动画片段名字,可修改自己需要的名字;
Motion:动画片段,可选择需要的动画片段;
Speed:播放动画片段速度;
Motion Time:
Mirror:镜像设置;
Cycle Offset:偏移量,动画起始帧多少去播放;
Foot Ik:动力学;
Write Defaults :写入默认值;
Transitions (动画片段过渡到其他动画片段的过渡设置)
如果有片段,动画点击后显示动画片段;如下图
在这里插入图片描述
Solo:勾选后,只会在所有 勾选Solo 中切换,其他默认等同 勾选Mute ;
Mute:勾选后,不会切入到该状态 ;
Has Exit Time :本动画片段是否能被打断;
Conditions:过渡需要的条件;可以选择Parameters里面的创建的数据以及数据相关的判断条件
窗口是动画的衔接,可以控制俩个动画的衔接程度,按钮左右滑动来控制俩个动画的重叠程度,从而让俩个动画衔接更自然;

Parameters面板


+ :添加属性的类型;共有Floath、int、bool、Trigger、四种类型;
bool 和Trigger的区别:Trigger类似于bool,但是设置后会自动复位,可以认为我设置为true后会自动设置为自身为false;比如攻击动画,需要攻击动画播放一次就自动回来,就可以选用Trigger;

设置动画层内部状态

鼠标右键点击某一个动画片段;
在这里插入图片描述Make Transition:添加过渡;
Set as Layer Default State :设置为默认状态(一般是idel的动画);
Copy/Paste:复制或者粘贴;
Create new BlendTree in State :在本动画状态机里创建个BlendTree;
Delete :删除本动画状态;

相关代码

1.bool isHuman { get; } 是否是人形动画;
2.bool isInitialized { get; } 检测动画是否初始化成功;
当没有控制器时会提示Not initialized,此时调用isInitialized返回False,反之返回True;

3.int layerCount { get; }动画层数;

4.float speed { get; set; }动画的整体速度,影响其中的每一个动画剪辑;

5.bool stabilizeFeet { get; set; } 过渡和混合时,脚自动稳定;

6.static int StringToHash(string name) 注意这个是静态方法,通过字符串取得参数的hash值;

7.CrossFade(…) 系列接口;混合过渡并且播放
第四个参数normalizedTime要说一下,是0-1的范围,表示目标动画剪辑从哪里开始播放;

animator.CrossFade("Jump", 0.2f, 0, 0.5f);

调用后从中间一半0.5处开始播放

8.CrossFade(…) 系列接口;混合过渡并且播放
混合并且按照实际时间进行。这里的实际时间是指Time.time的时间;

CrossFade是按照动画的自身时间进行混合。如果动画10秒,混合持续时间0.2,会在2秒后混合完成
CrossFadeInFixedTime是按照实际时间进行混合。如果动画10秒,混合持续时间0.2,会在0.2秒后混合完成
使用CrossFade或CrossFadeInFixedTime混合时,如果混合时间大于动画自身长度,动画自身会被滞留在最后一帧,直到混合结束

9.AnimatorTransitionInfo GetAnimatorTransitionInfo(int layerIndex);
获得当前动画的过渡信息

10.T GetBehaviour() 和 T[ ]GetBehaviours()
返回挂载在AnimatorController上的行为脚本StateMachineBehaviour
通常StateMachineBehaviour之间的交互会经常用到。

11.Transform GetBoneTransform(HumanBodyBones humanBoneId)
[人形动画]获取骨骼的Transform对象,参数是枚举形。
如果被临时删除了或者没有绑定这个关节,会返回空;

ebug.Log("GetBoneTransform: " + animator.GetBoneTransform(HumanBodyBones.LeftFoot));
//print GetBoneTransform: joint_FootLT (UnityEngine.Transform)

12.AnimatorClipInfo[] GetCurrentAnimatorClipInfo(int layerIndex);

获得当前层正在播放的剪辑数组,并且获取到的时间长度(clip.length)不受Animator速度影响。
如果想获取全部原始剪辑,可以用runtimeAnimatorController.animationClip;

13.AnimatorStateInfo GetCurrentAnimatorStateInfo(int layerIndex);
获得当前所处的动画状态
返回的结构中.length是动画总长度,normalizedTime是归一化的动画当前时间;
注意取到的length属性会受到Animator速度缩放影响;
在这里插入图片描述

另外,取到的归一化时间normalizedTime在播放循环动画时,会无限增长
(如果要获取不受缩放影响的原始剪辑,可以用runtimeAnimatorController.animationClip或者GetCurrentAnimatorClipInfo,区别在于一个能取到全部,一个只能取到当前播放的);

13***.bool HasState(int layerIndex, int stateID);
配合Animator.StringToHash可以直接转换成stateID;
***

Debug.Log(animator.HasState(0, Animator.StringToHash("Idle")));
//print True

14.bool IsInTransition(int layerIndex);
是否正处于过渡,很常用的一个接口,如果忽视了过渡的判断,就会有意想不到的bug

if(!animator.IsInTransition(0) && animator.GetCurrentAnimatorStateInfo(0).IsName("Idle"))
{
    //Do something.
}

14.Play(…)系列接口
需要注意normalizedTime参数,区间在0-1之间,直接影响到目标动画剪辑从哪个时间点开始播放

15.void Rebind();
重新绑定动画器的所有动画的属性和网格数据。
有时根骨骼坐标会被锁定,重置坐标后,调用该方法即可解决。

15.void ResetTrigger(…);
重设该触发参数为False;
如果是当前状态播放结束再跳转的话,会用到这个方法,在结束之前可以重置回False;

16.GetSet各类型参数系列(SetFloat,SetBool,SetInteger,SetTrigger)
最常用的接口
但需要注意下float类型数据,可以单独设置阻尼,具体看这篇
https://www.cnblogs.com/hont/p/5086101.html

17.void SetBoneLocalRotation(…);
[人形动画]设置某个骨骼的本地旋转

18.void Vector3 GetIKHintPosition(AvatarIKHint hint) & SetIKHintPosition(AvatarIKHint hint, Vector3 hintPosition)
[人形动画]获取/设置IK Hint位置;

19.float GetIKHintPositionWeight(AvatarIKHint hint) & void SetIKHintPositionWeight(AvatarIKHint hint, float value)
[人形动画]获取/设置IK Hint位置权重;

20.Vector3 GetIKPosition(AvatarIKGoal goal) & void SetIKPosition(AvatarIKGoal goal, Vector3 goalPosition)
[人形动画]获取/设置IK位置;

21.float GetIKPositionWeight(AvatarIKGoal goal) & void SetIKPositionWeight(AvatarIKGoal goal, float value)
[人形动画]获取/设置和获取IK位置权重;

22.Quaternion GetIKRotation(AvatarIKGoal goal) & void SetIKRotation(AvatarIKGoal goal, Quaternion goalRotation)
[人形动画]获取/设置IK旋转;

23.float GetIKRotationWeight(AvatarIKGoal goal) & void SetIKRotationWeight(AvatarIKGoal goal, float value)
[人形动画]获取/设置IK旋转权重;

IK相关操作请参考这篇:https://www.cnblogs.com/hont/p/5096855.html

24.void SetLayerWeight(int layerIndex, float weight)
设置层权重

24.void SetTarget(AvatarTarget targetIndex, float targetNormalizedTime)
[人形动画]在动画播放前得到播放后的坐标和旋转。

25.void StartPlayback()
开始回放

26.void StartRecording(int frameCount)
开始录制
注意参数中的frameCount是需要录制长度的帧数
如果参数小于1,则不会限制录制时间

27.void StopPlayback()
停止回放

28.void StopRecording()
停止录制
录制与回放具体 https://www.cnblogs.com/hont/p/5095237.html

29.void Update(float deltaTime)
Animator直接开放出了Update接口,如果你只是想更新动画信息而不前进播放动画,deltaTime参数可以设为0;
在做下一个状态指向判断时,非常有效;

30.AnimatorClipInfo[] GetNextAnimatorClipInfo(int layerIndex)
返回下一个状态的剪辑信息,如果没有下一个状态返回该结构体的默认值
经过测试,修改过播放信息并不会立即执行,会在Animator刷新时更新该值,或者手动调用Animator的Update更新该值

31.AnimatorStateInfo GetNextAnimatorStateInfo(int layerIndex)
返回下一个状态的信息,如果没有下一个状态返回该结构体的默认值
经过测试,修改过播放信息并不会立即执行,会在Animator刷新时更新该值,或者手动调用Animator的Update更新该值

注意事项

1:如果是人形动画,需要将动画都设置为HumAnoid模式;
2:关掉位移方式;1:Animator 下的Apply Root Motion 关闭;则不会有位移上的变化;2:动画如果是人形动画,则还可以选择此动画下面的Animation的相关设置(如下图);可以实现保留部分位移;
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity中的Animator动画详解 的相关文章

  • Unity 资源加载卸载过程

    什么时候才是UnusedAssets 看一个例子 Object obj Resources Load MyPrefab GameObject instance Instantiate obj as GameObject Destroy in
  • Unity单元测试流程

    文章目录 环境 流程 1 创建一个存放 单元测试程序集 的目录 2 打开 Test Runner 窗口 3 选择单元测试模式 4 创建单元测试程序集 5 创建测试脚本 6 运行测试 环境 Unity 2020 3 3f1 流程 1 创建一个
  • 【Unity&C#&随机数】随机数

    一个简单的随机数获得 0或1 使用了这样的代码 想要获得0或者1 if Input anyKeyDown float i 1 if i 1 i Random Range 0 Rang i i lt 0 5 0 1 Debug Log Cou
  • Unity 安卓打包

    Unity打包的方式有很多种 自动打包和手动打包 今天小弟就鼓捣鼓捣unity手动打包 如果想动态打包的话 可以去看其他大佬的帖帖哈 unity打包先配置环境 下载unity的时候可以顺道把unity的安卓包下载下来 如果忘了也没事 可以从
  • Unity 粒子特效、材质发光 HDR ShaderGraph图文教程[完成lit发光设置]

    效果如图 准备工作 在hdr模式下 关闭Directional Light 相机设置 移动球挂一个点光源作为子节点 设置自行调节 0 创建移动球的材质及shader shader gt 在Project Create Shader Grap
  • Unity动画控制器animator.CrossFade

    需要特别注意 1 CrossFade虽然可以不用任何逻辑来链接而直接跳转 但是CrossFade只能覆盖其他动画 当当前动画播放完毕而没有跳出这个动画时再次调用CrossFade将会失败 造成动画依旧停在原位 参数animator Cros
  • Unity动画系统详解

    目录 动画编辑器 编辑器面板 动画复用 前言 人形重定向动画 Humanoid 通用动画 Generic 旧版本动画 Legacy 动画控制器 系统状态 切换条件 状态机脚本 IK动画 反向动力学 BlendTree 混合树 Animato
  • UnityVR--组件3--Line Renderer--线性渲染

    目录 线性渲染组件简介 绘制线条Line Renderer组件介绍 绘制拖尾Trail Renderer组件介绍 应用1 使用Line Renderer绘制线段 应用1实现 使用系统工具或自定义工具绘制线段 应用2 Trail Render
  • Unity中UI框架的使用1-添加面板、显示Loading页面

    其中BasePanel和Canvas都是挂在面板的预制物上的 1 导入我们的UI框架 本篇文章中有用的是两个UIPanelType NUIManager和NBasePanel 会放在文章最后供大家使用 2 先将我们做好的Panel设置成预制
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • Unity打开工程时卡住的问题

    自从Unity升级了一个版本后 Unity打开工程卡住的问题越来越严重了 具体表现为 选择工程后 Unity窗口消失 但进程还在 有时候等个几分钟能出来 有时候等10分钟都不见得能出来 直观感受上看 似乎是Unity加载工程的时候某一步卡了
  • unity: C#的Action Event Delegate的异同

    目录 一 Action 二 Event 三 Action和Event区别 四 Delegate 总结 Action Event Delegate的异同 前言 Action Event和Delegate都是C 语言中的重要概念 分别用于管理函
  • 【Unity】按Esc进入操作菜单

    本文章是基于如下视频的自我总结 https www youtube com watch v JivuXdrIHK0 步骤如下 1 在Canvas 界面添加一个Panel Panel中添加一个按钮 调整按钮的大小为合适大小 调整字体的大小为合
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • Unity万向节死锁解决方案(2023/12/4)

    1 万向节死锁无法解决 这是因为它的特性就是如此 就像玻璃杯就是玻璃 这不可否认 别钻牛角尖昂 2 大多数情况下欧拉角足够用 例如 CF 摄像机不可能绕z轴旋转 x轴旋转也不会超过九十度 因为那样人物的腰子会被扭断 塔防游戏 保卫萝卜 吃鸡
  • unity小球跟随音乐节奏放大缩小和改变颜色

    放在小球身上 设置对应组件即可 using System Collections using System Collections Generic using Unity VisualScripting using UnityEngine
  • 微信游戏如何开发

    中懿游游戏软件开发 微信游戏开发通常涉及使用微信小游戏平台进行开发 微信小游戏是一种在微信平台上运行的轻量级游戏 用户可以在微信中直接体验 无需下载安装 以下是在微信平台上开发小游戏的一般步骤 1 注册微信开发者账号 访问 微信开放平台 注
  • 【Unity】运行时创建曲线(贝塞尔的运用)

    Unity 运行时创建线 贝塞尔的运用 1 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线 2 原理介绍 2 1 曲线的创建 unity建立网格曲线可以参考 Unity程序化网格体 的实现方法 主要分为顶点 三角面 U
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变

随机推荐

  • Revit API无法翻转用纵坐标方式标注的尺寸

    代码如上所述 纵坐标方式的尺寸类型 其实是有翻转符号的 但是无法被调用 我看本站里有人用过 但使用的是CommandHandlerService 可Revit 2020API似乎没有提供这样的API 不知道我错过了什么
  • Mysql-substr函数应用

    substr函数格式 俗称 字符截取函数 格式1 substr string str int a int b 格式2 substr string str int a 解释 格式1 1 str 需要截取的字符串 2 a 截取字符串的开始位置
  • Python pandas

    pandas是为了解决数据分析任务而创建的 纳入了大量的库和标准数据模型 提供了高效地操作大型数据集所需的工具 pandas 是第三方库 1 pandas中的数据结构 1 Series 一维数组 类似于Python中的基本数据结构 list
  • Hibernate 启动问题: A ResourcePool could not acquire a resource from its primary factory or source.

    太长不看版 Driver问题导致 详细版 Background 使用Hibernate连接Oracle 需求要The version of Oracle should be upgraded from 12c to 19c So I hav
  • 第七章:摄像机标定和 3D 重构

    第七章 摄像机标定和 3D 重构 本章节你将学习摄像机标定 姿态估计 对极集合和立体图像的深度图等OpenCV摄像机标定和3S重构的相关内容 更多内容请关注我的GitHub库 TonyStark1997 如果喜欢 star并follow我
  • jenkins学习笔记第四篇实现jemeter报告预警功能

    关于jenkins上集成jemeter实现脚本自动执行 脚本执行失败但是项目还是构建成功 这个问题的缘由来自于jenkins在集成jemeter时 它只关注项目运行所需的环境 项目内执行的shell等语句语法没有错误 并不关注jmeter脚
  • 使用FastJson的Object对象转成字符串类型时自动过滤Null值问题

    问题描述 在使用fastJson解析数据时 生成了一个新的jsonObject对象 最后我把新的jsonObject转成字符串 之后发现fastJson自动过滤了Null值 很懵逼 解决办法 JSON toJSONString newJso
  • 如何识别 ChatGPT 的真假

    ChatGPT 面世惊艳 无数普通人都想试试看 这个传闻中超级厉害的人工智能到底是怎么回事 一时间 很多网站 群聊中 都冒出来各式各样的打着 ChatGPT 名义 挂着 ChatGPT 头像的人工智能对话机器人 但试着一聊 就会发现其中真真
  • 读 沉思 第三次 有感

    第三次沉思 一 忘记在哪里看到了这本书的推荐 就买了 决定这学期细细品味这本书 第三次沉思 这本书是著名物理学家 斯蒂芬 温伯格 2021年7月23日与世长辞 关于科学 物理 宇宙 社会观评 个人遐想的文集 很值得细细品味 2022年4月9
  • C语言易错选择判断题

    选择题 1 设有如下定义 struct sk int a float b data p 若有p data 则对data中的成员a的正确引用是 B A p data a B p a C p gt data a D p data a 解析 本题
  • 异常:org.springframework.http.converter.HttpMessageConversionException: Type definition error:

    org springframework http converter HttpMessageConversionException Type definition error simple type class org apache iba
  • 手动为k8s的kubelet生成有效期30年的证书

    这个东西的作用有 1 在新部署k8s集群时 就生成30年证书 这样就不用1年后为kubelet更换证书 2 在证书快到期时 手动生成新证书 替换原证书 不需要替换key 这样只需要重启 服务器或kubelet服务 就能使用新证书 不用等到证
  • Python绘制三角函数图(sin\cos\tan)并标注特定范围

    根据我们指定的条件检索函数中的元素 import matplotlib pyplot as plt import numpy as np a np linspace 0 2 np pi 50 b np sin a plt plot a b
  • 总结sanic博客

    使用sanic openapi 博客计划 1 阅读sanic的源码和案例 已经做注解 https github com huge success sanic 2 使用sanic openapi优化api界面 https github com
  • 口语理解任务源码详解系列(二)利用seq2seq-attention模型实现

    利用seq2seq attention模型实现 写在前面 在前文介绍了项目的数据集构建 传送门 本文利用seq2seq attention实现 实现细节请参考论文 Attention Based Recurrent Neural Netwo
  • S7协议抓包分析(附pcap数据包)

    一 S7协议概述 1 S7协议简介 S7comm S7 通信 是西门子专有协议 可在西门子 S7 300 400 系列的可编程逻辑控制器 PLC 之间运行 它用于 PLC 编程 PLC 之间的数据交换 从 SCADA 监控和数据采集 系统访
  • 算法:单圈绝对值编码器处理成多圈的

    硬件描述 单圈编码器的分辨率是4096 功能描述 将单圈数据处理处理成多圈数据 起始圈数是1000圈 long GetCurrentAbsTotalValue long lValue long m absEncTotal 计算编码器总时间片
  • STM32与USB3300共同实现USB OTG HS的CDC串口通信速度测试

    项目场景 STM32和上位机传统通信方式就是串口 IIC SPI等 IIC和SPI一般不常用 串口是用的最多的通信方式 然而串口一般用于输出调试信息这种对传输速度没要求的场景 那种大容量数据快速传输的场景 串口显得捉襟见肘 STM32自带U
  • Siebel是什么意思

    简介 Siebel是电子商务软件的突出供应商 其客户关系管理 CRM 企业资源管理 ERM 以及合作关系管理 PRM 应用设计用于实现企业这些方面的自动化以及允许企业在互联网和零售或电话中心网络等其它渠道来执行和调节相关任务 Sieble的
  • Unity中的Animator动画详解

    Unity中的Animator动画详解 Animator动画导入 Animator动画详解 动画类型选择 Rig面板属性 Mode面板属性 Animation面板属性 动画片段 控制使用 Animator动画 创建动画控制器 添加需要播放的