jpskill.com
🛠️ 開発・MCP コミュニティ

godot

Godot Engineのエキスパートとして、GDScriptやシーン/ノード構造などを活用し、2D/3Dゲーム開発を支援、デスクトップやモバイルなど多様なプラットフォームへの書き出しを、ロイヤリティフリーで実現するSkill。

📜 元の英語説明(参考)

You are an expert in Godot Engine, the free and open-source game engine for 2D and 3D games. You help developers build games using GDScript (Python-like language), Godot's scene/node architecture, physics, animation, UI, shaders, and export to desktop, mobile, web, and consoles — with a lightweight editor that runs on any machine and a permissive MIT license with no royalties.

🇯🇵 日本人クリエイター向け解説

一言でいうと

Godot Engineのエキスパートとして、GDScriptやシーン/ノード構造などを活用し、2D/3Dゲーム開発を支援、デスクトップやモバイルなど多様なプラットフォームへの書き出しを、ロイヤリティフリーで実現するSkill。

※ jpskill.com 編集部が日本のビジネス現場向けに補足した解説です。Skill本体の挙動とは独立した参考情報です。

⚡ おすすめ: コマンド1行でインストール(60秒)

下記のコマンドをコピーしてターミナル(Mac/Linux)または PowerShell(Windows)に貼り付けてください。 ダウンロード → 解凍 → 配置まで全自動。

🍎 Mac / 🐧 Linux
mkdir -p ~/.claude/skills && cd ~/.claude/skills && curl -L -o godot.zip https://jpskill.com/download/14952.zip && unzip -o godot.zip && rm godot.zip
🪟 Windows (PowerShell)
$d = "$env:USERPROFILE\.claude\skills"; ni -Force -ItemType Directory $d | Out-Null; iwr https://jpskill.com/download/14952.zip -OutFile "$d\godot.zip"; Expand-Archive "$d\godot.zip" -DestinationPath $d -Force; ri "$d\godot.zip"

完了後、Claude Code を再起動 → 普通に「動画プロンプト作って」のように話しかけるだけで自動発動します。

💾 手動でダウンロードしたい(コマンドが難しい人向け)
  1. 1. 下の青いボタンを押して godot.zip をダウンロード
  2. 2. ZIPファイルをダブルクリックで解凍 → godot フォルダができる
  3. 3. そのフォルダを C:\Users\あなたの名前\.claude\skills\(Win)または ~/.claude/skills/(Mac)へ移動
  4. 4. Claude Code を再起動

⚠️ ダウンロード・利用は自己責任でお願いします。当サイトは内容・動作・安全性について責任を負いません。

🎯 このSkillでできること

下記の説明文を読むと、このSkillがあなたに何をしてくれるかが分かります。Claudeにこの分野の依頼をすると、自動で発動します。

📦 インストール方法 (3ステップ)

  1. 1. 上の「ダウンロード」ボタンを押して .skill ファイルを取得
  2. 2. ファイル名の拡張子を .skill から .zip に変えて展開(macは自動展開可)
  3. 3. 展開してできたフォルダを、ホームフォルダの .claude/skills/ に置く
    • · macOS / Linux: ~/.claude/skills/
    • · Windows: %USERPROFILE%\.claude\skills\

Claude Code を再起動すれば完了。「このSkillを使って…」と話しかけなくても、関連する依頼で自動的に呼び出されます。

詳しい使い方ガイドを見る →
最終更新
2026-05-18
取得日時
2026-05-18
同梱ファイル
1

📖 Skill本文(日本語訳)

※ 原文(英語/中国語)を Gemini で日本語化したものです。Claude 自身は原文を読みます。誤訳がある場合は原文をご確認ください。

Godot Engine — オープンソースのゲームエンジン

あなたは、2Dおよび3Dゲーム向けのフリーでオープンソースのゲームエンジンである Godot Engine のエキスパートです。GDScript (Pythonライクな言語)、Godot のシーン/ノードアーキテクチャ、物理演算、アニメーション、UI、シェーダーを使用して開発者がゲームを構築するのを支援し、デスクトップ、モバイル、Web、およびコンソールにエクスポートします。軽量なエディタはあらゆるマシンで動作し、ロイヤリティなしの寛容な MIT ライセンスが付属しています。

主要な機能

シーンとノードシステム

# Godotのアーキテクチャ: すべてはツリー内のノード
# シーン = 再利用可能なノードツリー (プレハブのようなもの)

# Player.gd — CharacterBody2D ノードにアタッチ
extends CharacterBody2D

@export var speed: float = 200.0          # インスペクタで編集可能
@export var jump_force: float = -400.0
@export var gravity: float = 980.0

@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D
@onready var coyote_timer: Timer = $CoyoteTimer

var was_on_floor: bool = false

func _physics_process(delta: float) -> void:
    # 重力
    if not is_on_floor():
        velocity.y += gravity * delta

    # コヨーテタイム (端から離れた直後に少しジャンプできる)
    if was_on_floor and not is_on_floor():
        coyote_timer.start()
    was_on_floor = is_on_floor()

    # ジャンプ
    var can_jump = is_on_floor() or not coyote_timer.is_stopped()
    if Input.is_action_just_pressed("jump") and can_jump:
        velocity.y = jump_force
        coyote_timer.stop()

    # 水平方向の移動
    var direction = Input.get_axis("move_left", "move_right")
    if direction:
        velocity.x = direction * speed
        sprite.play("run")
        sprite.flip_h = direction < 0
    else:
        velocity.x = move_toward(velocity.x, 0, speed * 0.2)
        sprite.play("idle")

    move_and_slide()

シグナル (イベントシステム)

# シグナルは Godot のオブザーバーパターン — デカップリングされた通信

# Coin.gd
extends Area2D

signal collected(value: int)              # 型付きパラメータを持つカスタムシグナル

@export var value: int = 10

func _on_body_entered(body: Node2D) -> void:
    if body.is_in_group("player"):
        collected.emit(value)             # シグナルを発行
        # ジューシング: スケールアップしてから消える
        var tween = create_tween()
        tween.tween_property(self, "scale", Vector2(1.5, 1.5), 0.1)
        tween.tween_property(self, "modulate:a", 0.0, 0.2)
        tween.tween_callback(queue_free)

# GameManager.gd — シグナルに接続
func _ready() -> void:
    for coin in get_tree().get_nodes_in_group("coins"):
        coin.collected.connect(_on_coin_collected)

func _on_coin_collected(value: int) -> void:
    score += value
    score_label.text = "Score: %d" % score

ステートマシン

# StateMachine.gd — ジェネリックな再利用可能なステートマシン
extends Node
class_name StateMachine

@export var initial_state: State
var current_state: State

func _ready() -> void:
    for child in get_children():
        if child is State:
            child.state_machine = self
    current_state = initial_state
    current_state.enter()

func _physics_process(delta: float) -> void:
    current_state.physics_update(delta)

func _unhandled_input(event: InputEvent) -> void:
    current_state.handle_input(event)

func transition_to(target_state_name: String) -> void:
    var target = get_node(target_state_name)
    if target and target is State:
        current_state.exit()
        current_state = target
        current_state.enter()

# State.gd — ベースとなるステートクラス
extends Node
class_name State

var state_machine: StateMachine

func enter() -> void: pass
func exit() -> void: pass
func handle_input(_event: InputEvent) -> void: pass
func physics_update(_delta: float) -> void: pass

# IdleState.gd
extends State
func enter() -> void:
    owner.animated_sprite.play("idle")
func physics_update(delta: float) -> void:
    if Input.get_axis("move_left", "move_right") != 0:
        state_machine.transition_to("Run")
    if Input.is_action_just_pressed("jump") and owner.is_on_floor():
        state_machine.transition_to("Jump")

シェーダー

// water_shader.gdshader — コードとしてのビジュアルシェーダー
shader_type canvas_item;

uniform float wave_speed: hint_range(0.5, 5.0) = 2.0;
uniform float wave_amplitude: hint_range(0.001, 0.1) = 0.02;
uniform float wave_frequency: hint_range(1.0, 20.0) = 10.0;
uniform vec4 water_tint: source_color = vec4(0.2, 0.4, 0.8, 0.6);

void fragment() {
    vec2 uv = UV;
    // 波の効果のためにUVをアニメーション
    uv.x += sin(uv.y * wave_frequency + TIME * wave_speed) * wave_amplitude;
    uv.y += cos(uv.x * wave_frequency + TIME * wave_speed * 0.7) * wave_amplitude;

    vec4 tex = texture(TEXTURE, uv);
    COLOR = mix(tex, water_tint, water_tint.a);
}

エクスポートとデプロイメント

## エクスポートターゲット
- Windows, macOS, Linux (デスクトップ)
- Android, iOS (モバイル)
- Web (HTML5/WebAssembly)
- コンソール: Switch, PlayStation, Xbox (サードパーティの移植経由)

## コマンドライン
godot --export-release "Windows Desktop" game.exe
godot --export-release "Web" index.html
godot --headless --script tools/build.gd   # CI 用のヘッドレス

インストール

# https://godotengine.org/download/ からダウンロード
# シングル実行ファイル、インストーラ不要、~40MB
# Godot 4.x: Vulkan レンダラー (Forward+ および Mobile)
# Godot 3.x: OpenGL (ローエンド/Web に最適)

ベストプラクティス

  1. シーンの構成 — 小さな再利用可能なシーン (Player, Enemy, Coin) を構築し、レベルシーンにインスタンス化します。
  2. 直接呼び出しよりもシグナル — ノード間の通信にはシグナルを使用します。シーンの結合度を低く保ち、再利用可能にします。
  3. クエリ用のグループ — ノードをグループ ("enemies", "interactable") に追加します。get_tree().get_nodes_in_group() でクエリします。
  4. ステートマシン — プレイヤー、敵、および UI の状態にはステートマシンパターンを使用します。大規模な if/else チェーンよりもクリーンです。
  5. チューニング用の @export@export でパラメータを公開します。デザイナーはコードに触れることなくインスペクタで値を調整できます。
  6. グローバル変数用のオートロードGameManagerAudioManagerSaveSystem にオートロードシングルトンを使用します。アクセス
📜 原文 SKILL.md(Claudeが読む英語/中国語)を展開

Godot Engine — Open-Source Game Engine

You are an expert in Godot Engine, the free and open-source game engine for 2D and 3D games. You help developers build games using GDScript (Python-like language), Godot's scene/node architecture, physics, animation, UI, shaders, and export to desktop, mobile, web, and consoles — with a lightweight editor that runs on any machine and a permissive MIT license with no royalties.

Core Capabilities

Scene and Node System

# Godot's architecture: everything is a node in a tree
# Scenes = reusable node trees (like prefabs)

# Player.gd — attached to a CharacterBody2D node
extends CharacterBody2D

@export var speed: float = 200.0          # Editable in Inspector
@export var jump_force: float = -400.0
@export var gravity: float = 980.0

@onready var sprite: AnimatedSprite2D = $AnimatedSprite2D
@onready var coyote_timer: Timer = $CoyoteTimer

var was_on_floor: bool = false

func _physics_process(delta: float) -> void:
    # Gravity
    if not is_on_floor():
        velocity.y += gravity * delta

    # Coyote time (jump briefly after leaving edge)
    if was_on_floor and not is_on_floor():
        coyote_timer.start()
    was_on_floor = is_on_floor()

    # Jump
    var can_jump = is_on_floor() or not coyote_timer.is_stopped()
    if Input.is_action_just_pressed("jump") and can_jump:
        velocity.y = jump_force
        coyote_timer.stop()

    # Horizontal movement
    var direction = Input.get_axis("move_left", "move_right")
    if direction:
        velocity.x = direction * speed
        sprite.play("run")
        sprite.flip_h = direction < 0
    else:
        velocity.x = move_toward(velocity.x, 0, speed * 0.2)
        sprite.play("idle")

    move_and_slide()

Signals (Event System)

# Signals are Godot's observer pattern — decoupled communication

# Coin.gd
extends Area2D

signal collected(value: int)              # Custom signal with typed parameter

@export var value: int = 10

func _on_body_entered(body: Node2D) -> void:
    if body.is_in_group("player"):
        collected.emit(value)             # Emit signal
        # Juice: scale up then disappear
        var tween = create_tween()
        tween.tween_property(self, "scale", Vector2(1.5, 1.5), 0.1)
        tween.tween_property(self, "modulate:a", 0.0, 0.2)
        tween.tween_callback(queue_free)

# GameManager.gd — connects to signal
func _ready() -> void:
    for coin in get_tree().get_nodes_in_group("coins"):
        coin.collected.connect(_on_coin_collected)

func _on_coin_collected(value: int) -> void:
    score += value
    score_label.text = "Score: %d" % score

State Machine

# StateMachine.gd — Generic reusable state machine
extends Node
class_name StateMachine

@export var initial_state: State
var current_state: State

func _ready() -> void:
    for child in get_children():
        if child is State:
            child.state_machine = self
    current_state = initial_state
    current_state.enter()

func _physics_process(delta: float) -> void:
    current_state.physics_update(delta)

func _unhandled_input(event: InputEvent) -> void:
    current_state.handle_input(event)

func transition_to(target_state_name: String) -> void:
    var target = get_node(target_state_name)
    if target and target is State:
        current_state.exit()
        current_state = target
        current_state.enter()

# State.gd — Base state class
extends Node
class_name State

var state_machine: StateMachine

func enter() -> void: pass
func exit() -> void: pass
func handle_input(_event: InputEvent) -> void: pass
func physics_update(_delta: float) -> void: pass

# IdleState.gd
extends State
func enter() -> void:
    owner.animated_sprite.play("idle")
func physics_update(delta: float) -> void:
    if Input.get_axis("move_left", "move_right") != 0:
        state_machine.transition_to("Run")
    if Input.is_action_just_pressed("jump") and owner.is_on_floor():
        state_machine.transition_to("Jump")

Shaders

// water_shader.gdshader — Visual shader as code
shader_type canvas_item;

uniform float wave_speed: hint_range(0.5, 5.0) = 2.0;
uniform float wave_amplitude: hint_range(0.001, 0.1) = 0.02;
uniform float wave_frequency: hint_range(1.0, 20.0) = 10.0;
uniform vec4 water_tint: source_color = vec4(0.2, 0.4, 0.8, 0.6);

void fragment() {
    vec2 uv = UV;
    // Animate UV for wave effect
    uv.x += sin(uv.y * wave_frequency + TIME * wave_speed) * wave_amplitude;
    uv.y += cos(uv.x * wave_frequency + TIME * wave_speed * 0.7) * wave_amplitude;

    vec4 tex = texture(TEXTURE, uv);
    COLOR = mix(tex, water_tint, water_tint.a);
}

Export and Deployment

## Export Targets
- Windows, macOS, Linux (desktop)
- Android, iOS (mobile)
- Web (HTML5/WebAssembly)
- Consoles: Switch, PlayStation, Xbox (via third-party porting)

## Command Line
godot --export-release "Windows Desktop" game.exe
godot --export-release "Web" index.html
godot --headless --script tools/build.gd   # Headless for CI

Installation

# Download from https://godotengine.org/download/
# Single executable, no installer, ~40MB
# Godot 4.x: Vulkan renderer (Forward+ and Mobile)
# Godot 3.x: OpenGL (better for low-end/web)

Best Practices

  1. Scene composition — Build small reusable scenes (Player, Enemy, Coin); instance them in level scenes
  2. Signals over direct calls — Use signals for node communication; keeps scenes decoupled and reusable
  3. Groups for queries — Add nodes to groups ("enemies", "interactable"); query with get_tree().get_nodes_in_group()
  4. State machines — Use a state machine pattern for player, enemy, and UI states; cleaner than massive if/else chains
  5. @export for tuning — Expose parameters with @export; designers tune values in the Inspector without touching code
  6. Autoloads for globals — Use autoload singletons for GameManager, AudioManager, SaveSystem — accessible everywhere
  7. AnimationPlayer — Use AnimationPlayer for everything: sprite frames, position, modulate, function calls, particles
  8. GDScript for gameplay — GDScript is fast enough for 99% of game logic; use C++ via GDExtension only for performance-critical systems