You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 12:50:31