Unity --- 动画脚本
迪丽瓦拉
2025-05-28 14:36:12
0

1.什么是动画?(在Unity中)

首先如果游戏物体想要在场景中动起来的话,就必须使其对应组件中的属性发生合适的变化,而将属性的变化过程保存下来后形成的就是动画

以后如果想播放动画的话,只需要调用这段保存下来的属性变化就可以了


二.基础知识部分

 

 

 

 点击Create后,我们创建的是动画的物理文件,以后播放动画也是调用这个物理文件

添加了用于形成动画的,会发生变化的属性后,旁边就会出现时间线和四个点 

0:00 表示的是0秒0帧,0:10表示的不足一秒但有10帧,1:00表示的是1秒0帧

也就是说Unity中认为1秒等于60帧(满60进1) 

1.制作好动画片段之后要将动画片段载入到Animation组件中的动画片段载入处后,才会在游戏开始后进行播放 

 

1.这样两个点的组合叫做关键帧,选择好对应的关键帧后,我们就能去调节用于形成动画的组件的属性,然后Unity会自动帮我们生成从第一个关键帧的属性变化到到最后一个关键帧的属性的动画

(PS: 一个动画片段最少要有两个关键帧,同时如果不再关键帧处设置被调整属性的值的话,则默认该属性值为0) 

2.双击时间线上想要添加关键帧的位置后,Unity就会在那个位置上自动生成一个关键帧

(PS:通过滚动鼠标滚轮能够对时间线进行缩放)

3.选择关键帧,按左键还能有更多的选项

4.点击录制按钮(红色圆后)才能使得关键帧的设置生效

5.如果要调节中间帧对应的参数的话 --- 步骤如下:

1.选中要调节的中间帧,此时在时间线处会在该中间帧上方出现一个白色区域

2.点击该白色区域后就能够对中间帧进行准确的修改了


 

三.动画脚本部分

1.第一个方法 --- OnMouseDown()

 1.在一个脚本中写了这个方法后,然后将这个方法挂载到一个游戏物体上(放到一个对象集群中),在游戏开始后,我们点击这个游戏物体就会执行这个方法。

2.在编程中 --- 如果只有两种状态的话(如开和关),可以使用bool类型变量来表示;如果涉及到三种及三种以上的状态的话,最好使用枚举类型来表示 --- 这样的话更加直观且不会弄混

3.

 属性介绍

 

 

1.上面这两个都是方法,一个是用来直接播放动画(play)的,还有一个是用于实现两个动画之间的过渡的(CrossFade)--- 既可以叫淡入淡出也可以叫交叉过渡

2.play方法就像命令,调用后就会播放动画(不给参数的话就会直接播放所有的动画,如果想播放单独某个动画的话,需要将动画的名称的以字符串的方式传给这个动画)

 这两个方法之间的区别就是你用play方法播A动画,如果在A动画还没有播完的时候就再次调用play方法播放B动画的话,则A动画会被直接中止并立刻播放另一个动画

而第二个方法则是可以实现播放完A动画后再去播放B动画 (queued --- 源单词queue --- 排队)

这两个同理,第一个方法也是立刻切换,只不过切换的过程中会有一个平滑的处理,而第二个则是会再播完后再平滑的切到另一个动画 

关于speed这个属性 --- 为1的时候表示正常的速度,0的时候为停止,大于1则越来越快

为负数1的时候则是以正常速度倒着播,小于负1的话则是以越来越快的速度倒着播 

1.要注意的是!这个“数组”的“数组名”要用你当前创建的,指向你要控制的动画组件的引用的名称 

2.实际开发的时候不要傻傻的把动画名直接填进去,这样的后果就是以后如果修改了动画片段的名称的话就会导致所有的动画名称都需要进行修改,更加聪明的办法是创建一个公共字符串变量,填变量即可,这样子的话一修改变量名其它的就都会跟着一起变了。

1.通过这种方式控制倒着播和正着播有个问题,首先从正着播,即speed = 1开始说起

首先我们要介绍一个属性 --- animation的 time 属性 ,该属性规定的是当前动画开始播放的时间起点

2.如果我们没有设置time属性的话,则默认为动画播放时间起点 time = 0

而speed > 0 时则动画是从 时间起点time 播放到 正放终点 即动画的结尾,即animation.lenght属性(该属性表示的是动画的总时间长度)

speed < 0 时则动画是从 time 播放到 反放终点,即动画时间为0时

而又因为 time 默认为0,所以如果我们直接将speed设为 -1 ,然后开始播放动画的话,就会导致播放的流程是从动画时间为0的位置播放到动画时间为0的位置 ,则会出现没有动画播放的情况,并没有如我们所愿实现一个平滑的倒着播放的效果

3.所以speed调成负数后,我们还需要将time改为动画片段的终点(结尾)即 animation.length,才能够实现一个平滑的倒着播放的效果,最终代码如下图

public class AnimationDemo : MonoBehaviour
{private Animation temp ;public string animationplay = "door";private void Start(){temp = this.GetComponent();}//首先需要设定门的状态 -- 此处默认为关 --- 用bool值来表示public bool doorState = false;private void OnMouseDown(){if(doorState == false){temp[animationplay].speed = 1;//从动画的最开始播放 --- 正播temp[animationplay].time = 0;doorState = true;}else{temp[animationplay].speed = -1;//从动画的结尾开始播放 -- 倒播temp[animationplay].time = temp[animationplay].length;doorState = false;}temp.Play(animationplay);}
}

 如果只用上面这段代码来实现开关门的话还会导致一个问题 --- 如果用户在动画未播放完的时候立刻又点了一下门的话就会导致动画播放错误(原因:time变了),所以为了保持播放的健壮性,我们还需要加个判定

public class AnimationDemo : MonoBehaviour
{private Animation temp ;public string animationplay = "door";private void Start(){temp = this.GetComponent();}//首先需要设定门的状态 -- 此处默认为关 --- 用bool值来表示public bool doorState = false;private void OnMouseDown(){if(doorState == false){if(temp.isPlaying == false) {temp[animationplay].speed = 1;temp[animationplay].time = 0;doorState = true;}}else{if(temp.isPlaying == false){temp[animationplay].speed = -1;temp[animationplay].time = temp[animationplay].length;doorState = false;}}temp.Play(animationplay);}
}

这个判定要通过另一个属性来实现 --- animation.isPlaying 

1.这是一个bool类型变量,每一个动画片段都有它,前面的time等同理

2.通过这个属性 + if 判断我们就能够实现在没播放动画的时候执行操作,播放动画的时候不执行操作,而不会出现播放一个动画的时候点一下立马切去播放另一个动画的问题了

3.isPlaying这个属性在播放动画时会自动变为true,播放完动画后会变为 false

1.第一个animation表示的是当前游戏物体正在播放的动画片段

2.第二个animations表示的是当前游戏物体能够播放的所有动画片段,其中size表示动画片段的个数,element(元素)表示的是动画片段数组,展示的是所有动画片段元素

如果想要通过控制游戏物体播放多个不同的动画片段的话,我们就需要将动画片段存到这个动画数组中,不然的话是无法通过代码调用动画片段来实现动画的切换的

选中动画片段,在inspector界面处我们还可以切换动画的播放模式

1.ping pong 模式表示的是动画先从头到尾播放一遍再从尾到头播放一遍,并不断如此循环往复。

2.clamp forever 固定到永远 --- 只正 / 反播放一次动画,然后就一直播放该动画的最后一帧(相当于播放完动画后就保持不动了,不会再播放其它的动画了)

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...