Godot 4のコンポーネント指向開発シリーズ「JumpController (ジャンプ機能)」です。
これは横スクロールアクション(サイドビュー)のゲームで必須となるジャンプ機能を、ノードを貼り付けるだけで実装するものです。
このコンポーネントは、親ノード(プレイヤー)が「地面にいるか」を自動で判定し、ジャンプボタンが押された瞬間に上方向の力を加えます。
目次
1. コンポーネントのコード (Full Code)
以下のコードをコピーして、JumpController.gd という名前で保存してください。
class_name JumpController
extends Node
## 親ノード(CharacterBody2D)にジャンプ機能を追加するコンポーネント
## 前提: 親ノードには別途「重力」の処理が必要です。
# --- 設定パラメータ ---
@export_group("Jump Settings")
@export var jump_velocity: float = -400.0 ## ジャンプ力(負の値で上方向)
@export var jump_action: String = "ui_accept" ## ジャンプボタンのアクション名(デフォルトはSpace/Enter)
# --- 内部変数 ---
var _parent: CharacterBody2D
func _ready() -> void:
# 親ノードを取得し、型チェック
_parent = get_parent() as CharacterBody2D
if not _parent:
push_error("JumpController: 親が CharacterBody2D ではありません。")
set_physics_process(false)
func _physics_process(_delta: float) -> void:
# ジャンプ入力があり、かつ「床に接地している」場合のみジャンプ
if Input.is_action_just_pressed(jump_action) and _parent.is_on_floor():
_parent.velocity.y = jump_velocity
2. 使い方チュートリアル
ジャンプを成立させるには、**「重力」とセットで考える必要があります。今回は「GravityComponent(重力)」**もセットで紹介し、すぐに遊べる状態にします。
手順①:重力コンポーネントも用意する(必須!)
ジャンプした後に地面に戻ってくるため、以下の短いコードを GravityComponent.gd として保存してください。
class_name GravityComponent
extends Node
## 親ノードに重力を与え続けるコンポーネント
@export var gravity: float = 980.0
func _physics_process(delta: float) -> void:
var parent = get_parent() as CharacterBody2D
# 空中にいる場合のみ重力を加算
if parent and not parent.is_on_floor():
parent.velocity.y += gravity * delta
手順②:プレイヤー(親)を用意する
- シーンを作成し、ルートを
CharacterBody2Dにします。 CollisionShape2DとSprite2Dを設定します。- 横スクロール用の床(StaticBody2Dなど)がシーン内にあることを確認してください。
手順③:コンポーネントを2つアタッチする
プレイヤー(CharacterBody2D)の子ノードとして、以下の2つを追加・アタッチします。
KeyboardMover(前回作成したもの。左右移動用)GravityComponent(今回作成したもの。落下用)JumpController(今回作成したもの。ジャンプ用)
シーン構成図:
Plaintext
Player (CharacterBody2D)
├── Sprite2D
├── CollisionShape2D
├── KeyboardMover (Node) <-- 左右移動担当
├── GravityComponent (Node) <-- 落下担当
└── JumpController (Node) <-- ジャンプ担当
手順④:パラメータ調整と実行
KeyboardMover: 横スクロール用に、Action UpとAction Downの設定を空にするか、無視するように設定すると自然です(今回のKeyboardMoverは8方向用ですが、重力があれば空中制御として機能します)。JumpController:Jump Velocityを-500などに変えると、ハイジャンプになります。
実行(F6)して、左右移動キーで動き、スペースキー(ui_accept)でジャンプできれば成功です!
3. このコンポーネントのメリット・応用
複数のジャンプタイプを作れる
例えば、以下のようにパラメータを変えた別の JumpController を用意すれば、キャラによってジャンプ性能を変えるのが一瞬で終わります。
- 戦士キャラ:
Jump Velocity = -300(重いジャンプ) - 忍者キャラ:
Jump Velocity = -600(高いジャンプ)
ロジックの拡張が容易(ダブルジャンプなど)
このスクリプトを継承(または改造)して、「空中にいても1回だけジャンプを許可する」という変数を足せば、簡単にダブルジャンプ機能になります。
# 改造のヒント: ダブルジャンプ
var jump_count = 0
var max_jumps = 2
func _physics_process(delta):
if _parent.is_on_floor():
jump_count = 0 # 着地でリセット
if Input.is_action_just_pressed(jump_action) and jump_count < max_jumps:
_parent.velocity.y = jump_velocity
jump_count += 1
このように、「ジャンプ」という機能だけを切り出しているため、移動コードや攻撃コードに干渉せず、安全に改造できるのが最大の強みです。
