godot-fundamentals について
Godot Fundamentalsは、既存のGodotプロジェクトを扱う開発者向けのスキルです。プロジェクトの規約を尊重しながら、シーン、ノード、リソース、型付きGDScript、入力、エディターの作業と検証を案内します。
主な機能
- 01プロジェクト設定と既存規約の確認
- 02ノード選択とシーン構成
- 03リソースの作成と割り当て
- 04型付きGDScriptと入力処理
- 05インポート、パス、変換の問題診断
活用シーン
- 01既存プロジェクトに再利用可能なシーンを追加
- 02エクスポート参照と入力アクションを接続
- 03ノード不足や変換の誤りを調査
- 04シーンとプロジェクトの動作を検証
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ pbzona/ godot-skills --skill godot-fundamentalsインストール後、Claude Code で/godot-fundamentalsを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/editor-debugging.mdnodes-scenes-resources.mdtyped-gdscript-input.md詳細
Godot の基本
スタータープロジェクトのレイアウトを押し付けず、プロジェクトで既に使われている Godot の規約に従って実装します。
対象範囲
次の作業でこのスキルを使用します。
Node、Node2D、Node3D、Controlの派生ノードを選択し、配置する。- 再利用可能なシーンを作成し、
PackedSceneリソースをインスタンス化する。 - 組み込みまたはカスタムの
Resourceデータを定義し、割り当てる。 - シーンノードに型付き GDScript を追加し、ライフサイクルコールバックを適切に使用する。
- 名前付き入力アクションを設定し、入力コールバックを選択する。
- シーン、ファイルシステム、インスペクター、出力、デバッガー、リモートシーンツリーを操作する。
- プロジェクト、インポート、ノードパス、トランスフォーム、シーン実行に関する基本的な問題を診断する。
SOLID に基づくリファクタリング、イベントアーキテクチャ、コマンド、オブジェクトプールの導入にはこのスキルを使用しないでください。プログラミングパターンのスキルを使用します。グローバル状態の所有権、マネージャーのライフタイム、シーン遷移、セーブの境界を決める用途には使用しないでください。ゲームアーキテクチャのスキルを使用します。ジャンル固有のゲームプレイや高度なレンダリングは対象外です。
編集前の確認
project.godotの場所を特定します。現在のディレクトリがプロジェクトルートだと決めつけないでください。config/featuresと既存のツールを確認し、Godot 4.x の正確なバージョンを特定します。そのバージョンより後に導入された API は避けてください。- プロジェクト設定を変更する前に、
[application]、[autoload]、[input]、[display]、関連する[rendering]の設定を確認します。 - 周辺の
.gd、.tscn、.tres、.resファイルを確認します。フォルダー構成、命名、インデント、静的型付けのレベル、ノードの命名、シグナル接続のスタイルを合わせます。 - 対象となるシーンツリーを把握します。ルートの型、親子の所有関係、インスタンス化されたサブシーン、編集可能な子ノード、エクスポートされた参照、一意な名前のノード、ローカルとグローバルのトランスフォームを確認します。
- プロジェクトで通常使用する実行、テスト、リント、フォーマットのコマンドを確認します。可能であれば、変更前の基準となる実行結果を取得します。
- 生成された
.godot/のインポート/キャッシュ内容は編集しないでください。代わりにソースアセットまたはインポート設定を変更します。
project.godot がない場合は、Godot 固有のファイルを作成する前に、プロジェクトを初期化するか確認してください。
実装ワークフロー
- 動作を、観察可能な一文で表します。
- 要件に合う動作を持つ、最も限定的な組み込みノードを選びます。
- 対象がノード、再利用可能なシーン、リソース内のデータのどれに当たるかを決めます。
- それに依存するコードを書く前に、シーン階層を構築します。
- デザイナーが管理する値は型付きの
@exportプロパティとして公開し、安定した子ノードへの参照は型付きの@onreadyプロパティとして保持します。 - 物理キー定数ではなく、名前付きの入力マップアクションを使用します。
- 動作を実現する、最小限の型付きスクリプトを実装します。
- 編集したシーンを単独でテストし、その後、プロジェクトのエントリーシーンを実行します。
基本的な判断基準
ノードとシーン
- まず動作を基準に選択します。テクスチャが表示されるからといって、ルートを自動的に
Sprite2Dにする必要はありません。また、クリック可能なオブジェクトだからといって、必ずしも物理ボディが必要なわけではありません。 - トランスフォーム可能な 2D グループ化ルートには
Node2D、3D にはNode3D、レイアウト主導の UI にはControl、シーン内で空間を持たない調整には通常のNodeを使用します。 - ノードの枝が独立したアイデンティティを持つ場合、再利用される場合、または単独でのテストに適している場合は、シーンにします。
- ランタイムの子ノードの追加と削除は、最も近いシーンの所有者に任せます。通常のゲームプレイノードを
SceneTree.rootに直接追加するのは避けてください。 - 親に依存するワールド空間のトランスフォームを割り当てる前に、インスタンスをツリーに追加します。
- 通常のシーンツリーコールバックでは、
queue_free()を優先します。所有者が解放された後は、保持しているノード参照はすべて無効として扱ってください。
extends Node2D
@export var pickup_scene: PackedScene
@onready var pickups: Node2D = %Pickups
func spawn_pickup(at: Vector2) -> void:
if pickup_scene == null:
push_error("Assign Pickup Scene before spawning a pickup.")
return
var pickup := pickup_scene.instantiate() as Node2D
if pickup == null:
push_error("The configured pickup scene must have a Node2D root.")
return
pickups.add_child(pickup)
pickup.global_position = at
リソース
- インスペクターでの編集、再利用、またはライブシーンノードから独立したシリアライズが有用なデータには、リソースを使用します。
- 複数のシーンで同じ定義を共有する場合は、外部
.tresを使用します。データが1つのシーンまたはリソースだけに属する場合は、組み込みサブリソースを使用します。 - リソースは共有参照として扱います。共有定義リソースにインスタンスごとに変更される状態を格納しないでください。
- スクリプトの解析時に判明している固定の依存関係には
preload()を使用します。実行時にパスが選択される場合に限り、load()またはスレッド読み込みを使用します。 - 後で永続化される可能性があるデータには、安定した識別子を使用します。表示名やファイルパスは、適切な識別子ではありません。
入力とコールバック
- 物理演算に関わる移動では、
_physics_process()内で押下中のアクションをポーリングします。 - UI に最初にイベントを処理する機会を与える場合は、離散的なゲームプレイイベントを
_unhandled_input()で処理します。 - 物理演算に依存しない、フレーム駆動の表示処理には
_process()を使用します。 - 手動で設定するレートには
deltaを掛けます。CharacterBody2D.velocityはすでに秒あたりの値なので、move_and_slide()の前にdeltaを掛けないでください。 - 意図的に使用しないコールバック引数には、接頭辞として
_を付けます。
extends CharacterBody2D
@export_range(0.0, 1200.0, 1.0) var speed: float = 240.0
func _physics_process(_delta: float) -> void:
var direction := Input.get_vector(
&"move_left", &"move_right", &"move_up", &"move_down"
)
velocity = direction * speed
move_and_slide()
ノード参照
- デザイナーが依存関係を設定する場合は、エクスポートされた型付き参照を優先します。
%StableNameは、ノードがシーン固有として明示的に指定されている場合にのみ使用します。- 同じシーンが所有する、非公開で安定した子ノードには、短い
$Child/Pathを使用します。 - フレームごとのコールバックでシーンツリー全体を繰り返し検索しないでください。
- 再利用可能なシーンの境界をまたぐ、壊れやすい相対パスを作成しないでください。
検証
プロジェクトですでに設定されている実行ファイルとコマンドを使用します。プロジェクトにコマンドがない場合は、検出された Godot 実行ファイルを使い、次のようなコマンドで基本的なインポートと解析の確認を実行できます。
godot --headless --editor --path <project-root> --quit
次に、関連するすべての動作を検証します。
- エディターが、パーサー、リソース不足、または無効なノードに関する警告なしでインポートを完了すること。
- 影響を受けるシーンが
F6相当の動作で実行され、意図せずメインシーンに依存していないこと。 - プロジェクト全体が、設定されたメインシーンから実行されること。
- 新しい Input Map アクションがすべて存在し、意図した各デバイスのバインドが動作すること。
- インスタンス化と再親子化の後も、ローカル座標変換とグローバル座標変換が正しく保たれること。
- エクスポートされたリソースとノード参照が、すべてのシーンインスタンスに割り当てられていること。
- Output パネルと Debugger パネルに、新たなエラーが表示されないこと。
- Remote シーンツリーで、インスタンスが意図した所有者の下に表示され、想定どおりのタイミングでツリーから削除されること。
- 既存の自動テストが引き続き成功すること。
実行した確認項目と、自動化できなかったエディターのみの確認項目を正確に報告してください。
失敗の原因
- メインプロジェクトからのみシーンが動作する: 再利用可能なシーンが、所有権の境界を越えて参照しています。依存関係をエクスポートするか、明示的なセットアップメソッドを用意してください。
Node not found: パス、一意名のフラグ、またはシーン階層が変更されています。実際の.tscnを確認し、代替パスを推測しないでください。- アクションが反応しない: Input Map にアクションがない、アクション名の綴りが間違っている、UI がイベントを消費した、またはノードの処理モードが無効か一時停止中です。
- インスタンス同士が影響し合う: 共有リソースに変更可能な状態が保存されています。実行時の状態をインスタンスに移すか、意図的にリソースを複製してください。
- 生成後の位置が正しくない: ローカル座標とグローバル座標が混在しているか、親子関係を設定する前にトランスフォームが設定されています。
- 子ノードへのアクセスが null になる:
_ready()より前にアクセスした、子ノードが任意になっている、またはスクリプトが異なる構造のシーンにアタッチされています。 - フレームレートによって物理挙動が異なる: 移動に
_process()を使用したか、deltaを一貫せず適用しています。 - エディターに古いアセットが表示される: ソースのインポート設定を迂回したか、生成されたキャッシュファイルを編集しました。
参考資料
コメント
Markdown 対応