GPTのをコピペして補足を入れる
ステップ1:Hello World(Godot 4.4 日本語UI)
① プロジェクトを作成
Godot を起動 → 新規プロジェクト → プロジェクト名と保存場所を設定 → 作成して編集。
最初に「シーンを作成」が出たら ユーザーインターフェース を選択すると、ルートノードが Control になります。
② Label と Button を配置
シーンドック(左側)でルートの Control を右クリック → 子ノードを追加。
ノード一覧から Label(ラベル) を追加。
インスペクタ(右側)の テキスト に Hello World と入力。
上部ツールバーの レイアウト ボタン → 中央 を選ぶと画面中央に配置されます。
- レイアウトボタンではなくなったらしい ビューの右にある〇に+のようなアイコンから「アンカーのプリセット」が設定できるのでそれを使う
(任意)ラベル設定 > フォント > サイズ を 24 などに大きくすると見やすいです。
- Control > Theme Overrides > FontSize で変更できた
同じ手順で Button(ボタン) を追加。
インスペクタの テキスト に Change! と入力。
レイアウト → 上中央に配置 を選んでから、少し下にドラッグして Label の下に置きます。
③ スクリプトを作成
ルートの Control を選択。
上部の紙アイコン(スクリプトをアタッチ)をクリック。
- 左上のメニューの検索窓の右にある紙アイコン
そのまま 作成 を押すと Control.gd が生成されます。
以下のコードに差し替えます:
extends Control
@onready var label: Label = $Label
var click_count: int = 0
func _on_button_pressed() -> void:
click_count += 1
label.text = "Hello Godot! x%d" % click_count
④ シグナルを接続
シーンドックで Button を選択。
「シーンドック」 は Godot エディタ左側にあるパネルのことです。
シーンに配置されているノードの階層(ツリー構造)を表示する場所で、Unity でいう 「ヒエラルキー」 に相当します。
具体的に言うと:
ルートノード(たとえば Control や Node2D)が一番上に表示される
その下に「子ノード」を追加していくとツリー状に並ぶ
ノードの追加、削除、名前変更、ドラッグで親子関係の変更などができる
例:Hello World プロジェクトでのシーンドック
Control
├─ Label
└─ Button
一番上の Control がルートノード(シーンの親)
Label と Button がその子ノード
ポイント
右クリック → 子ノードを追加 で新しいノードを加える
ドラッグ&ドロップでノードを別の親の下に移動できる
ノードを右クリックして「名前を変更」すると $Label → $MyLabel のようにスクリプトで参照名が変わります
👉 まとめると
「シーンドック = 今のシーンにあるノードの一覧」
「Unity の Hierarchy とほぼ同じ」と覚えると理解しやすいです。
右側の ノード タブを開く(インスペクタの隣)。
シグナル一覧から pressed() をダブルクリック。
「メソッドに接続」ダイアログが出るので、受信先をルートの Control のままにして 接続 を押す。
→ 自動で _on_button_pressed() 関数がスクリプトに作られます。
(既に書いてある場合はその関数と統合してください)
⑤ 実行して確認
画面上の三角ボタン(▶、または F6)を押してシーンを実行。
ボタンをクリックすると、ラベルが
Hello Godot! x1
Hello Godot! x2
...
と変化すれば完成!
補足:プロジェクト全体のメインシーンに設定する場合は、
上メニューの プロジェクト → プロジェクト設定 → 実行 → メインシーン で今のシーンを指定します。
すると F5 で起動できるようになります。
スクリプトの解説
完成したスクリプト
extends Control
@onready var label: Label = $Label
var click_count: int = 0
func _on_button_pressed() -> void:
click_count += 1
label.text = "Hello Godot! x%d" % click_count
📝 解説
1. extends Control
このスクリプトが Control ノード(UI用のノード)にくっついている ことを表しています。
つまり「このスクリプトは Control の動きを拡張するよ」という意味です。
2. @onready var label: Label = $Label
@onready
シーンが「準備完了」した時点で変数を初期化する修飾子。
$Label を探すのはシーンのノードが読み込まれてからでないと失敗するので、このおまじないが必要。
var label: Label
label という変数を用意。型は Label(文字を表示するノード)。
= $Label
$ノード名 で、同じシーン内の子ノードを取得できます。
今回はシーンドックにある「Label」という名前のノードを参照。
👉 つまり「シーン内の Label ノードを変数 label に覚えておく」という処理。
3. var click_count: int = 0
click_count という整数型(int)の変数を作り、最初の値を 0 にしています。
ボタンを押した回数を数えるために使います。
4. func _on_button_pressed() -> void:
func は「関数(処理のまとまり)」を定義するときのキーワード。
_on_button_pressed は「ボタンが押されたときに自動で呼ばれる関数」。
シグナル接続で指定したから、この名前の関数が呼ばれるようになっています。
- > void は「戻り値がない関数」という意味(おまじないみたいなものです)。
5. click_count += 1
click_count の値を 1 増やす。
click_count = click_count + 1 と同じ意味。
6. label.text = "Hello Godot! x%d" % click_count
label.text → ラベルに表示する文字列。
"Hello Godot! x%d" → %d が「数字の入る場所」という意味。
% click_count → その %d に click_count の数字を入れる。
👉 ボタンを押すたびに「Hello Godot! x1」「Hello Godot! x2」…と更新されます。
🌟 まとめ
extends → スクリプトの対象ノードを決める
@onready var → シーン読み込み後にノードを取得する
シグナル関数 → ボタンが押されたとき自動で呼ばれる
変数操作 & ラベル更新 → 回数を増やして文字を変える
スクリプトの解説(丁寧版)
処理の流れ(時系列)
- 実行ボタン(F6)を押す
- 現在のシーンをロード開始。
- シーン読み込み → ノードを組み立て
- ルート Control、子 Label/Button がメモリ上に生成され、シーンドックの構造が出来上がる。
- ready フェーズ(“準備OK”の合図)
- @onready 付き変数の初期化がここで実行される。
- @onready var label: Label = $Label
→ ここで $Label(子ノードの Label 参照)を取得し、label に保存。
- @onready var label: Label = $Label
- 変数 click_count はすでに 0 に初期化済み。
- @onready 付き変数の初期化がここで実行される。
- 初期表示
- Label のテキストはインスペクタで設定した「Hello World」。
- ゲームはメインループに入り、入力待ちの状態に。
- ユーザーがボタンを押す
- Button が pressed() シグナル を発火。
- 事前に接続しておいた先(受信側)=ルート Control の関数
_on_button_pressed() が自動で呼ばれる。
- ハンドラで処理(_on_button_pressed() 内)
- click_count += 1 で回数をカウントアップ。
- label.text = "Hello Godot! x%d" % click_count
→ 文字列を作って Label に代入。 - 結果、画面の Label が更新されて「Hello Godot! x1」…となる。
- 以降、押すたびに 5~6 を繰り返す
- x2, x3, ... と表示が更新される。
データ/シグナルの関係(図解)
[Button]
|
| pressed() シグナル
v
[_on_button_pressed() in Control]
|
| 1) click_count += 1
v
[click_count 変数]
|
| 2) "Hello Godot! x%d" % click_count
v
[Label.text を更新]
- 登場人物
- Control:シーンの親。スクリプトが付いている本体
- Label:文字を表示するUI
- Button:押すと pressed() が飛ぶUI
- click_count:押した回数の保存場所(整数)
コードの意図(行ごとおさらい)
extends Control
- このスクリプトは Control ノード用。UI の親としてふるまう。
@onready var label: Label = $Label
- ready 後に実行される初期化。
- シーンドック上の 子ノード「Label」 を探して変数 label に保持。
- 型注釈 : Label により、label.text などの補完・型チェックが効く。
var click_count: int = 0
- カウント用の整数を 0 でスタート。
func _on_button_pressed() -> void:
click_count += 1
label.text = "Hello Godot! x%d" % click_count
- ボタンの pressed() によって呼ばれる関数(シグナルの受け口)。
- 回数を足して、ラベルのテキストを更新。
よくある疑問&落とし穴
- @onready はなぜ必要?
→ ノード参照($Label)は、シーンのノードが全部用意されてからでないと取得に失敗し得ます。
@onready は「準備完了後に初期化する」ための安全策。
- $Label の代わりに?
- get_node("Label") as Label でもOK。
- シーン内でユニーク名にしているなら %Label も可(上級者向け補足)。
- 押しても動かない
- Button の pressed() シグナルが ルート Control に接続されているか
(右側「ノード」タブ → シグナル一覧を確認)。
- Button の pressed() シグナルが ルート Control に接続されているか
- Label が見つからない エラー
- シーンドックで名前を変更していないか?(変えたなら $新しい名前 に直す)
デバッグのコツ(困ったら)
- ハンドラの先頭に print("pressed", click_count) を入れて、押したらログに出るか確認。
- label == null(label == null 相当)は if label: でチェック可能。
- シグナルの右クリック → 切断/接続 でつなぎ直すと配線ミスが消えることがあります。
ちょい応用(動作は同じ、書き方だけ別)
コードでシグナル接続する(エディタでの接続を使わない場合):
extends Control
@onready var label: Label = $Label
@onready var button: Button = $Button
var click_count: int = 0
func _ready() -> void:
button.pressed.connect(_on_button_pressed) # ← ここで接続
func _on_button_pressed() -> void:
click_count += 1
label.text = "Hello Godot! x%d" % click_count
- シーンスクリプトだけで完結させたいときに便利です。