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

手順②:プレイヤー(親)を用意する

  1. シーンを作成し、ルートを CharacterBody2D にします。
  2. CollisionShape2DSprite2D を設定します。
  3. 横スクロール用の床(StaticBody2Dなど)がシーン内にあることを確認してください。

手順③:コンポーネントを2つアタッチする

プレイヤー(CharacterBody2D)の子ノードとして、以下の2つを追加・アタッチします。

  1. KeyboardMover (前回作成したもの。左右移動用)
  2. GravityComponent (今回作成したもの。落下用)
  3. JumpController (今回作成したもの。ジャンプ用)

シーン構成図:

Plaintext

Player (CharacterBody2D)
 ├── Sprite2D
 ├── CollisionShape2D
 ├── KeyboardMover (Node)   <-- 左右移動担当
 ├── GravityComponent (Node) <-- 落下担当
 └── JumpController (Node)   <-- ジャンプ担当

手順④:パラメータ調整と実行

  • KeyboardMover: 横スクロール用に、Action UpAction 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

このように、「ジャンプ」という機能だけを切り出しているため、移動コードや攻撃コードに干渉せず、安全に改造できるのが最大の強みです。