unity2D学习笔记-角色动画


Hierarchy中创建一个Sprite作为载体,然后把素材中的状态拖入Inspector中Sprite Renderer的Sprite。
本文重点是角色移动和动画。

角色移动

角色移动当然不至于把脚本写上……只是目前我对于如何获得信息(比如位置信息啦,输入信息(移动啦))这些一头雾水。所以记录一下怎么通过代码获得信息。
移动的输入(按什么键)是可以在Project Settings/Input自定义的。

我跟的教程左右移动的方法是用刚体施加向左或向右的力,而不是transform(直接对刚体作用)。
在game界面移动的时候会出现卡顿,按照下述方法解决了:

正确的解决移动卡顿问题应该在Tilemap上添加 Composite Collider2D 组件,勾选 Tilemap Collider2D 组件中的 Use Composite,将自动添加上的 Rigidbody2D 组件的 Body Mode 改为 Static。

原因作者在视频中解释的,是因为unity模拟的“推背感”(?)。

跳跃使用的也是velocity施加力。
目前移动过程中有这些问题:

  1. 加速过程不太明显,动作不够顺畅
  2. 跳跃时会卡顿(有时候可以跳起来,有时候跳不起来;有延迟),在空中会停滞(没有连跳);
  3. 在水平移动的时候y值会变;
  4. 方向键和空格同时按的时候会出现问题,有时会跳起来,有时跳不起来,有时会延迟跳;

动画效果(重点!!!!!)

之前一直搞不明白的原因是把组件和window的菜单弄混……就像当时分不清tilemap和Tile palette,哪些挂在物体上,哪些是编辑素材的菜单。动画也一样。

创建:Animator与Animation

首先插一条Animator和Animation的区别:Unity 动画系统 Animation 和 Animator 联系与区别

如果只是控制一个动画的播放我们则用Animaton组件,如果是很多动画之间相互转换则使用Animator组件

Animator是组件,挂靠在物体(Player)上。Animator需要一个Controller,根据官方的说法:

Animator 组件需要引用 Animator Controller,后者定义要使用哪些动画剪辑,并控制何时以及如何在动画剪辑之间进行混合和过渡。

Animator Controller不是一个(类似于材质、位置那样的)说明名称,而是一个类型、一个“部件”:在assets中创建一个Animator Controller用来管理动画效果。对于一个Animator Controller(例如Player)可以管理多种效果(静止、跑、跳跃);反过来说,一个主体的多种动画效果通过一个Animator Controller来管理。
而上面也提到,Animator是管理多个动画的,对单个动画(静止/跑/跳跃)进行编辑需要Animation。
对Animation进行编辑需要先在Hierarchy中选中主体(例如Player),然后create(Animation与Player进行了链接,并且Animation自动添加到Animator面板)。
管理播放速度,直接拖拽帧,或者调整Samples(采样频率)。

状态转换

此时只有先创建的idle有连接,其他组件间没有连接
要创建连接,直接选中组件右键make transition。然后在parameter中调整参数;然后选择一个过程(箭头)添加条件;再去掉退出时间和转换时间。
在这里插入图片描述
在这一步并没有把主体状态与动画联系起来,只是创建判断条件。如何把参数传给Animator?通过Player的脚本:

  1. 首先类似于Ridigbody2D传给script一样,在script里声明一个Animator变量anim,然后就可以将Player组件中的Animator拖拽到变量中;
  2. 将script中horizontal相关的数据传给running(上图控制条件的参数):在此脚本中,使用的是velocity,即,判断键盘输入左右,然后给velocity赋值,使刚体施加力给Player,实现左右移动。其实对于物体来说每一帧都是静止的,只是太多帧组合所以实现了移动,因此无法读取瞬时速度,也就不能通过速度传参给Animator;
  3. anim引用SetFloat传参(在parameter创建条件时running是float变量):第一个参数为animator的判断参数running,第二个参数是要读取的数据(这里使用的是GetAxisRaw(“Horizontal”),只有-1,0,1三个值),加上绝对值。

跳跃

跳跃实际上是由跳起和下落两个动作组成。
在这里插入图片描述到目前位置,可以实现跳跃,但是跳跃没有动画效果。添加好animation后,在代码中表现:

  1. anim.SetBool(“jumping”, true);jumping是parameter创建的变量,true是从script赋的值;
  2. 当从jump到fall时,不仅要把falling设置为true,还要把jumping设置为false;

从fall到idle

这一步需要用到碰撞地面ground所以单独拿出来说。

  1. 在Script中声明一个LayerMask的变量,命名为ground;类似于声明刚体,在unity的Inspectors中将ground设置为对应层,作为脚本和unity的接口;
  2. 使用coll.IsTouchingLayers(ground)将碰撞情况传给代码判断,这里的ground是一个桥梁、中介,不是图层本身(如上面的“jumping”);
  3. 在函数开头给idle赋值为false。效果
    相关代码
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值