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

如何在Godot(C#)中实现KinematicBody2D的扇动飞行效果?

实现Flappy Bird风格的扇动飞行效果(KinematicBody2D)

你的代码问题在于直接修改Position是瞬间移动,没有模拟真实的物理下落和扇动冲量——Flappy Bird的飞行逻辑是:按下按键时给鸟一个向上的瞬时冲量,之后鸟会在重力作用下持续加速下落,而不是匀速上下移动。

修正思路

  • 用Velocity变量管理移动速度,替代直接修改Position
  • 持续施加重力,让鸟自然加速下落
  • 按下按键时重置向上的速度(给冲量),而不是持续上升
  • 用MoveAndSlide()处理KinematicBody2D的移动,符合Godot的物理逻辑

修正后的代码

using Godot;
using System;

public class Bird : KinematicBody2D
{
    // 可调参数,根据手感修改
    [Export] private float gravity = 980f;
    [Export] private float flapImpulse = -350f;
    [Export] private float maxFallSpeed = 500f;

    private Vector2 _velocity;

    public override void _Ready()
    {
        _velocity = Vector2.Zero;
    }

    public override void _PhysicsProcess(float delta)
    {
        // 施加重力
        _velocity.y += gravity * delta;
        // 限制最大下落速度,避免下落过快
        _velocity.y = Mathf.Min(_velocity.y, maxFallSpeed);

        // 处理扇动输入(只在按下瞬间生效)
        if (Input.IsActionJustPressed("ui_up"))
        {
            _velocity.y = flapImpulse;
        }

        // 应用移动
        _velocity = MoveAndSlide(_velocity, Vector2.Up);
    }
}

额外优化(视觉增强)

如果要模拟扇动时的旋转效果,让动作更逼真,可以在_PhysicsProcess里添加旋转逻辑:

// 根据下落速度调整旋转角度,模拟抬头/低头姿态
float rotationTarget = Mathf.Clamp(_velocity.y / maxFallSpeed, -0.3f, 0.5f);
Rotation = Mathf.Lerp(Rotation, rotationTarget, delta * 8f);

内容的提问来源于stack exchange,提问作者George

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 13:40:34