从零开始学习Unity学习笔记:Day05 角色的跳跃逻辑&动画效果

本文介绍了在Unity中实现角色跳跃控制的逻辑,包括使用Input.GetButtonDown检测跳跃事件,以及在FixedUpdate中应用力来实现跳跃。同时,讲解了如何设置动画器组件,创建动画剪辑,以及通过Animator参数控制动画状态的切换,实现角色不同状态的动画效果。

这部分内容是我结合了M_Studio老师自己的另一个 “补丁”视频 进行了重新整理,所以内容可能和教程里的视频不完全对应,原教程里的视频也是M_Studio老师自己在学习过程中录制的早期视频,存在一些问题,这里尝试修正一下,如果有什么问题还请大家在评论区反馈,我看到一定会改过来的,感谢大家支持!
控制角色跳跃的逻辑整体思路上和控制角色水平移动的类似:
  1. 定义一个成员表示角色单位时间/单次移动的距离(速度);
  2. 周期性检查用户输入,判断是否需要改变角色运动状态,如果需要就将角色的刚体组件的velocity属性重新赋值。
  3. “周期性检查”是借助Unity提供的 Update() 或 FixedUpdate() 方法来实现的。
但是,跳跃与水平移动不同之处在于:跳跃按键按下后,只会让角色“跳一下”,不会持续使得角色保持上升的状态,即便要实现如二段跳之类的操作(希望角色可以连着“跳两下”),那也要求玩家按下、松开、再按下按键。也就是说跳跃不是一个 连续触发 的动作,而是一种突发 事件 。

事件性输入的检测

根据 官方文档 ,之前使用的 Input.GetAxis 方法 仅适用于 控制像水平移动这样连续触发的动作,如果要处理像跳跃这样的突发 事件 ,应当使用以下三种方法来获取按键情况。
注:下文中 buttonName 参数通常为输入管理器中的某个轴的名称,例如 "Jump" (跳跃)。
  • Input.GetButton(buttonName) :当按住 buttonName 时,返回 true 。
  • 该函数可以用于类似自动开火的场景:只要按住按键,该函数就一直返回 true ,直到松开按键才返回 false 。请只在实现触发操作的事件(例如武器开火)时使用该函数。
  • Input.GetButtonDown(buttonName) :仅在用户按下 buttonName 的这一帧期间返回 true 。
  • 无论是否释放了按键,在再次按下按键之前,该方法都不会返回 true 。
  • Input.GetButtonUp(buttonName) :仅在用户释放 buttonName 的第一帧返回 true 。
  • 无论是否按住按键,在再次释放按键之前,该方法都不会返回 true 。
【注意】后两者需要在 Update() (而不是 FixUpdate() )中调用该方法,因为每帧都会重新检测按键状态。
从经验来看,大多数游戏的跳跃动作应当采用的是 Input.GetButtonDown 这样的检测方式。
由于检测按键的 Input.GetButtonDown 方法要求我们在 Update() 函数中使用,而相应的跳跃移动逻辑又需要操作物理引擎,根据上一节的知识,我们知道操作物理引擎的逻辑应当在 FixUpdate() 函数中编写。这就需要一个“桥梁”或者说“信号”来让 Update() 函数通知 FixUpdate() 中的代码按键被按下。因此,代码的框架大概是这样:
    
bool isJumping = false ; void Update ( ) { if ( Input . GetButtonDown ( "Jump" ) ) { isJumping = true ; // 通知FixedUpdate中的代码按键被按下 } } void FixedUpdate ( ) { if ( isJumping ) { // 这里写“操作物理引擎完成跳跃动作”的代码 isJumping = false ; // 重置按键被按下的状态,防止重复执行 } }

起飞!跳跃之力!

中二病又犯了……
当然,跳跃动作的实现可以像往常一样直接修改刚体组件的 velocity (速度)属性来实现。但是,由于跳跃是一种突发事件,所以这里可以以另一种方式来操作Sprite的刚体组件:为其添加一个向上的力(Add Force)。
    
// rigidBody是2D刚体组件 void FixedUpdate ( ) { if ( isJumping ) { rigidBody . AddForce ( new Vector2 ( 0 , jumpForce ) , ForceMode2D . Impulse ) ; isJumping = false ; } }
AddForce 方法接受两个参数,第一个参数要施加的力(水平分量,垂直分量),第二个参数是可选的,用于指定这个力的添加模式,它有两种取值:
  • ForceMode2D.Force :这一模式会让施加的力 持续 一个FixedUpdate的调用周期,用于实现特定的物理效果,例如火箭推进器的推力。在不指定 AddForce 方法的第二个参数时采用的是这个模式。
  • ForceMode2D.Impulse :这一模式用于施力时间 极短 (不考虑力的施加时间)的情况,例如爆炸或者碰撞。
ForceMode2D.Impulse 模式看起来比较符合跳跃动作的情况,所以这里选择了这个模式。

添加动画组件

为了让Sprite动起来,甚至在不同的场景下有不同的动画效果,我们需要为Sprite添加 动画器 (Animator)组件。根据 官方文档 :该组件可以将动画分配给场景中的游戏对象。它需要引用一个 动画器控制器 (Animator Controller)来决定要使用哪些动画剪辑,并控制何时以及如何在动画剪辑之间进行混合和过渡。
如文档所述,像往常一样添加好动画器组件后,需要在项目窗口中创建一个动画器控制器:
给控制器命名好后,把它拖动到动画器组件的控制器(Controller)设置项上即可。
建议把动画相关的文件建立在同一个文件夹内。

添加动画剪辑

要真正设置新的动画,我们需要在菜单栏打开窗口-动画,打开这个动画窗口。
在层级窗口中选择一个刚才添加好动画器控制器的Sprite,即可看到动画窗口中出现了创建按钮,点击创建即可为动画创建一个 动画剪辑 (Animation Clip)。
每一种状态(例如原地不动、奔跑、跳跃等)对应的动画都需要创建不同的动画剪辑。
建议为每一个Sprite创建一个单独的文件夹放置其动画剪辑。
在设置好素材的导入选项(比如每单位像素数)后,选择好项目窗口的素材(按Ctrl+A可以全选当前文件夹下的所有内容,也可以按住Ctrl多选需要的内容)拖拽到动画窗口里,即可看到素材在动画时间轴的样子:
可以拖动蓝色的竖条来控制所选素材的持续时间:
也可在动画窗口右侧的“三点”菜单中打开 Show Sample Rate (显示采样速率):
然后在出现的 样本 (其实是“单位时间采用次数”的意思)设置项中设置数值,数值越小,播放速度越慢:
第一个创建好的动画剪辑将成为这个Sprite的默认动画。
可以在如下图所示的这个位置为这个动画器控制器添加第二个动画剪辑:
后续创建的操作和之前一样。

动画状态的过渡转移

为了让Sprite根据场景的不同来切换到不同动画剪辑,我们需要设置动画的转移条件。
在菜单栏的窗口-动画中打开动画器(Animator)窗口:
可以看到刚才添加的动画剪辑:
在一个剪辑上右键,选择 创建过渡 (Make Transition),然后点击另一个剪辑,即可创建从前者到后者的一个过渡(显示为白色的箭头)(这里Runing和Idle之间需要相互建立双向的两个过渡)。选择这个过渡,即可在检查器窗口看到许多设置项。
我们主要关注这里的Conditions(条件)。这里的条件主要是通过动画器的参数(Parameters)来设置的:
点击动画器窗口的参数,然后选择这里的加号,可以创建不同类型的参数。这些参数可以在脚本中被修改,动画器也可以根据这些参数来决定动画的切换,换句话说,这些参数就是脚本和动画器之间的“信号桥梁”。
这里我们创建一个Float型的参数 running 来确定Idle剪辑和Running剪辑之间的切换:
决定角色从原地不动状态切换到奔跑状态的原因自然是水平速度大小不再是0了(注意是大小,不含方向),因此在角色的脚本中,我们引入如下的代码:
    
public Animator animator ; // 像引入刚体组件一样引入动画器组件 // ... void Update ( ) { // ... // 设置动画器的running参数(浮点型)为水平方向的速度大小 animator . SetFloat ( "running" , Mathf . Abs ( rigidBody . velocity . x ) ) ; }
然后像刚体组件一样在Unity把动画器组件挂载到脚本上:
这样,动画器中的参数 runing 就代表水平速度的大小。接下来,设置过渡的条件,例如从Idle切换到Runing的条件可以设置为:
从Runing切换到Idle的条件可以设置为:
此外,要注意的是,动画器还允许我们设置过渡的切换方式,默认是有一个切换过渡时间的,这里我们不需要这个切换过渡,直接立即切换就好了,所以需要在 Settings (设置)这里进入如下设置:
在检视器窗口的下方预览部分,可以点击播放查看过渡的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值