如何在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
相关产品推荐
相关产品推荐

