Unity复刻Flappy Bird:如何实现空格键触发鸟类跳跃动画
Unity复刻Flappy Bird:如何实现空格键触发鸟类跳跃动画
兄弟,你的思路已经走对一半啦!我当初第一次做Flappy Bird复刻的时候,也卡在动画触发这块,给你一步步捋清楚怎么把空格键和鸟的跳跃动画完美绑定:
第一步:先把Animator的状态过渡设置好
首先得在Animator窗口里把动画的状态逻辑搭起来:
- 先准备两个动画剪辑:一个是鸟待飞的Idle状态(比如翅膀自然下垂的静态帧),另一个是拍翅跳跃的Flap动画(翅膀往上扇动的短动画)
- 把这两个状态拖进Animator窗口,右键Idle状态选「Set as Layer Default State」,设为默认启动状态
- 右键Idle,选「Make Transition」连到Flap状态,再给Flap连回Idle
- 点击这两条过渡箭头,在Inspector面板里取消勾选「Has Exit Time」——这个很重要,不然动画会有延迟,按空格后不会立刻拍翅
- 给Animator添加参数:如果想按你的布尔值思路来,就加个布尔参数
IsFlapping;嫌手动重置麻烦的话,用Trigger类型参数(比如FlapTrigger)更省心,我后面两种情况都给你说
第二步:完善你的BirdScript脚本
你已经写了基础变量,现在把动画触发的逻辑补进去就行,先给你补全代码,再逐句解释:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BirdScript : MonoBehaviour { public Rigidbody2D BirdRigidBody; public float flapStentgh; public LogicScript logic; public bool AliveBird = true; public Animator BirdAnimator; void Start() { // 初始化动画状态,确保刚启动时是Idle BirdAnimator.SetBool("IsFlapping", false); } void Update() { if (Input.GetKeyDown(KeyCode.Space) && AliveBird) { // 给刚体加跳跃力,这部分你原来的逻辑是对的 BirdRigidBody.velocity = Vector2.up * flapStentgh; // 两种触发动画的方式二选一: // 方式1:用布尔参数(你最开始的思路) BirdAnimator.SetBool("IsFlapping", true); // 启动协程延迟重置布尔值,让动画播完切回Idle StartCoroutine(ResetFlapState()); // 方式2:用Trigger参数(更省心,不用手动重置) // BirdAnimator.SetTrigger("FlapTrigger"); } } // 用协程重置布尔值,时间和你的Flap动画时长对应 IEnumerator ResetFlapState() { // 比如你的拍翅动画是0.2秒播完,就设0.2f,自己根据动画调 yield return new WaitForSeconds(0.2f); BirdAnimator.SetBool("IsFlapping", false); } // 碰撞死亡的逻辑里别忘了处理动画 private void OnCollisionEnter2D(Collision2D collision) { if (AliveBird) { AliveBird = false; logic.gameOver(); // 死亡时重置动画状态,避免鸟死了还在拍翅 BirdAnimator.SetBool("IsFlapping", false); // 要是做了死亡动画,这里可以加BirdAnimator.SetTrigger("IsDead"); } } }
最后补几个关键的小细节
- 回到Unity编辑器,选中你的鸟对象,在BirdScript组件里,把Animator组件拖到BirdAnimator的变量框里,不然脚本找不到动画组件
- 要是用布尔参数,协程里的等待时间一定要和你的Flap动画时长匹配,不然动画没播完就切回Idle,会显得很生硬
- 测试的时候如果动画没触发,先检查Animator的过渡条件是不是设对了:比如布尔参数是
IsFlapping == true,Trigger的话直接选对应的Trigger参数就行
备注:内容来源于stack exchange,提问作者nada
相关产品推荐
相关产品推荐

