GDScript チートシート
最終更新
基本と出力
スクリプトはノードの型を継承し、その関数は Godot が呼び出してくれます。
| 操作 | 構文 |
|---|---|
| スクリプトをノードの型に結び付ける | extends Node |
| ノードの開始時に実行するコード | func _ready() -> void:
print("Hello, World!") |
| 区切りなしで値を出力 | print("HP: ", hp) |
| スペース区切りで値を出力 | prints("a", "b", 3) |
| コメント | # This is a comment |
| ドキュメントコメント | ## Shown in the editor's help |
| 複数行の文字列 | var text := """Line one
Line two""" |
| エラーを報告 | push_error("Health is negative") |
| 警告を報告 | push_warning("Old save file") |
変数、定数、型
型は省略できます。付けるとエディタのチェック、補完が効き、コードも速くなります。
| 操作 | 構文 |
|---|---|
| 変数 (動的型) | var score = 0 |
| 静的型付きの変数 | var speed: float = 200.0 |
| 静的型を推論 | var lives := 3 |
| 定数 | const MAX_HP = 100 |
| 列挙型 (enum) | enum State { IDLE, RUN, JUMP } |
| enum の値を使う | var state: State = State.IDLE |
| ベクトルと色の値 | var pos := Vector2(10, 20)
var tint := Color(1, 0, 0) |
| 空のオブジェクト参照 | var target: Node = null |
| 文字列、int、float に変換 | str(42), int("42"), float("3.5") |
| float から int へ (小数点以下を切り捨て) | int(3.9) # 3 |
| 型をチェック | value is int, node is Sprite2D |
| 型にキャスト | var sprite := node as Sprite2D |
演算子
おなじみの算術演算に加え、論理演算には英単語を使います。
| 操作 | 構文 |
|---|---|
| 加算、減算、乗算、除算 | a + b, a - b, a * b, a / b |
| 整数除算 (int / int) | 7 / 2 # 3 |
| 剰余 | 7 % 3, fmod(7.5, 2.0) |
| べき乗 | 2 ** 10 # 1024 |
| 複合代入 | x += 1, x -= 1, x *= 2, x /= 2 |
| 比較 | ==, !=, <, >, <=, >= |
| 論理演算 | a and b, a or b, not a |
| 論理演算 (記号の形) | a && b, a || b, !a |
| インライン if | var label := "win" if score > 10 else "lose" |
| コレクションに含まれるか | "sword" in inventory |
| ビット演算 | a & b, a | b, a ^ b, ~a, a << 1, a >> 1 |
制御フロー
Python と同じくブロックはインデントで決まります。Godot は標準でタブを使ってインデントします。
| 操作 | 構文 |
|---|---|
| if、elif、else | if hp <= 0:
die()
elif hp < 20:
print("Low HP")
else:
print("OK") |
| 1 行の if | if hp <= 0: die() |
| 範囲をループ | for i in range(5):
print(i) # 0 to 4 |
| 開始、終了、ステップ付きの範囲 | for i in range(10, 0, -2):
print(i) # 10, 8, 6, 4, 2 |
| n 回繰り返す | for i in 3:
print(i) # 0, 1, 2 |
| 配列をループ | for item in items:
print(item) |
| 型付きのループ変数 (Godot 4.2+) | for n: String in names:
print(n.to_upper()) |
| while ループ | while hp > 0:
hp -= 10 |
| ループを抜ける、または 1 回飛ばす | break, continue |
| 空ブロックのプレースホルダー | pass |
パターンマッチ (match)
match はパターンに合った最初の分岐を実行します。フォールスルーはありません。
| 操作 | 構文 |
|---|---|
| 値でマッチ | match state:
State.IDLE:
print("idle")
State.RUN:
print("run") |
| 1 つの分岐で複数の値 | match key:
"w", "up":
move_up() |
| デフォルトの分岐 (ワイルドカード) | match n:
0:
print("zero")
_:
print("other") |
| 値を名前に束縛 | match cmd:
"quit":
get_tree().quit()
var other:
print("Unknown: ", other) |
| 配列パターン | match pos:
[0, 0]:
print("origin")
[var x, 0]:
print("on the x axis at ", x) |
| 末尾は任意の配列 | match args:
["move", ..]:
print("move command") |
| 辞書パターン | match item:
{"type": "coin", "value": var v}:
gold += v |
| when によるガード (Godot 4.4+) | match score:
var s when s >= 90:
print("A")
var s when s >= 75:
print("B")
_:
print("C") |
関数とラムダ
関数も値です。変数に入れたり、引数に渡したり、引数を束縛したりできます。
| 操作 | 構文 |
|---|---|
| 型付きの引数と戻り値 | func add(a: int, b: int) -> int:
return a + b |
| 戻り値なし | func reset() -> void:
score = 0 |
| デフォルト引数 | func greet(who := "player") -> void:
print("Hi, ", who) |
| static 関数 | static func double(x: int) -> int:
return x * 2 |
| 1 行のラムダ | var square := func(x): return x * x |
| Callable を呼び出す | square.call(4) # 16 |
| 値としての関数 | var on_done := reset
on_done.call() |
| 引数を束縛 | var add_ten := add.bind(10)
print(add_ten.call(5)) # 15 |
| 複数行のラムダ | var greet_all := func(names: Array) -> void:
for n in names:
print("Hi, ", n) |
| タイマーを待つ | await get_tree().create_timer(1.0).timeout |
| コルーチンを待つ | var data = await fetch_data() |
文字列
文字列メソッドは新しい文字列を返し、元の文字列は変更しません。
| 操作 | 構文 |
|---|---|
| % でフォーマット | "%s has %d HP" % [name, hp] |
| 小数点以下 2 桁 | "%.2f" % 3.14159 # "3.14" |
| 名前付きプレースホルダーでフォーマット | "{a} vs {b}".format({"a": 1, "b": 2}) |
| + で連結 | "Score: " + str(score) |
| 長さ | text.length() |
| 大文字、小文字 | text.to_upper(), text.to_lower() |
| 分割 | "a,b,c".split(",") # ["a", "b", "c"] |
| 要素を結合 | ", ".join(["a", "b", "c"]) |
| 前後の空白を削除 | " hi ".strip_edges() # "hi" |
| テキストを置換 | text.replace("cat", "dog") |
| 位置を検索 | text.find("lo") # -1 if missing |
| 先頭、末尾の一致 | text.begins_with("Hi"), text.ends_with("!") |
| 部分文字列 | text.substr(0, 5) |
| 含まれるか | "ell" in "Hello" # true |
配列
配列は伸び縮みします。型付き配列はその要素型しか受け付けません。
| 操作 | 構文 |
|---|---|
| 配列リテラル (型の混在可) | var items = [1, "two", 3.0] |
| 型付き配列 | var scores: Array[int] = [10, 20, 30] |
| インデックスで読む (負の値は末尾から) | scores[0], scores[-1] |
| 末尾に追加 | scores.append(40), scores.push_back(40) |
| インデックスの位置に挿入 | scores.insert(0, 5) |
| 最後の要素を取り出して削除 | var last = scores.pop_back() |
| 値またはインデックスで削除 | scores.erase(20), scores.remove_at(0) |
| 含まれるか、インデックスを検索 | scores.has(30), scores.find(30) |
| 長さ、空かどうか | scores.size(), scores.is_empty() |
| ソート | scores.sort() |
| 独自のルールでソート | enemies.sort_custom(func(a, b): return a.hp < b.hp) |
| map | scores.map(func(x): return x * 2) |
| filter | scores.filter(func(x): return x > 15) |
| reduce | scores.reduce(func(acc, x): return acc + x, 0) |
| スライス (終端は含まない) | scores.slice(1, 3) |
辞書
キーと値のペアです。キーはどの型でも使えますが、文字列が一般的です。
| 操作 | 構文 |
|---|---|
| 辞書リテラル | var stats = {"hp": 100, "mp": 30} |
| 型付き辞書 (Godot 4.4+) | var prices: Dictionary[String, int] = {"sword": 50} |
| キーを読み書き | stats["hp"], stats["xp"] = 50 |
| デフォルト値付きで読む | stats.get("luck", 0) |
| キーがあるか | stats.has("hp"), "hp" in stats |
| キーを削除 | stats.erase("mp") |
| キーと値の一覧 | stats.keys(), stats.values() |
| 要素数 | stats.size() |
| 別の辞書をマージ (true で上書き) | stats.merge({"luck": 5}), stats.merge(bonus, true) |
| キーをループ | for key in stats:
print(key, " = ", stats[key]) |
クラスとアノテーション
どのスクリプトもクラスです。アノテーションは @ で始まります。
| 操作 | 構文 |
|---|---|
| クラスにグローバル名を付ける | class_name Player
extends CharacterBody2D |
| コンストラクタ | func _init(start_hp := 100) -> void:
hp = start_hp |
| インスタンスを作成 | var p := Player.new() |
| 内部クラス | class Item:
var name := ""
var price := 0 |
| このメソッドの親の実装を呼ぶ | func _ready() -> void:
super()
print("child ready") |
| 親の別のメソッドを呼ぶ | super.take_damage(10) |
| static 変数 (Godot 4.1+) | static var count := 0 |
| インスペクターに表示 | @export var speed := 300.0 |
| スライダーの範囲付きで表示 | @export_range(0, 100) var volume := 50 |
| 準備完了時に子ノードを取得 | @onready var sprite: Sprite2D = $Sprite2D |
| セッターとゲッター | var hp := 100:
set(value):
hp = clampi(value, 0, 100)
get:
return hp |
| エディタ内でスクリプトを実行 | @tool |
シグナル
シグナルはファーストクラスです。宣言したら、そのまま emit、connect、await できます。
| 操作 | 構文 |
|---|---|
| シグナルを宣言 | signal died |
| 型付き引数のシグナル | signal health_changed(old_hp: int, new_hp: int) |
| 発信 (emit) | died.emit() |
| 引数付きで発信 | health_changed.emit(100, 80) |
| メソッドに接続 | player.died.connect(_on_player_died) |
| ラムダを接続 | button.pressed.connect(func(): print("Clicked")) |
| 追加の引数を渡す | button.pressed.connect(_on_pressed.bind("start")) |
| 1 回だけ発火 | timer.timeout.connect(_on_timeout, CONNECT_ONE_SHOT) |
| 切断 | player.died.disconnect(_on_player_died) |
| 接続を確認 | player.died.is_connected(_on_player_died) |
| シグナルを待つ | await player.died |
ノードとライフサイクル
Godot がノードに対して呼び出すコールバックと、シーンツリーに対して自分で呼び出す処理です。
| 操作 | 構文 |
|---|---|
| オブジェクトの生成時 (ツリーに入る前) | func _init() -> void:
print("created") |
| ノードと子ノードの準備完了 | func _ready() -> void:
print("ready") |
| 毎フレーム | func _process(delta: float) -> void:
position.x += 100.0 * delta |
| 物理演算のティックごと | func _physics_process(delta: float) -> void:
velocity.y += 980.0 * delta
move_and_slide() |
| UI が処理しなかった入力 | func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("jump"):
jump() |
| パスでノードを取得 | get_node("Sprite2D"), $Sprite2D |
| スペースを含むパス、ユニーク名 | $"UI/Health Bar", %HealthBar |
| 入力アクションを確認 | Input.is_action_pressed("move_right") |
| シーンのインスタンスを作成 | var enemy := preload("res://enemy.tscn").instantiate()
add_child(enemy) |
| ノードを安全に削除 | queue_free() |
| 親と子 | get_parent(), get_children() |
| シーンを切り替える | get_tree().change_scene_to_file("res://main.tscn") |
Godot でゲームを作るときに必要になる GDScript の構文を 1 ページにまとめました。この GDScript チートシートは Godot 4 のクイックリファレンスです。変数と静的型、演算子、制御フローと match、関数とラムダ、文字列、配列と辞書、クラス、シグナル、そして Godot が毎フレーム呼び出すノードのコールバックを収録しています。
ここに載っているのはすべて Godot 4 の構文なので、Godot 3 の書き方ではなく @export、@onready、died.emit()、await が登場します。必要なものをスクリプトにコピーするか、言語のスニペットを GDScript プレイグラウンドでその場で試してください。_ready() の中に書けばブラウザで実行でき、Godot のインストールは不要です。
GDScript チートシート よくある質問
この GDScript チートシートは無料ですか?
このチートシートは Godot 4 と Godot 3 のどちら向けですか?
export と onready キーワードの代わりに @export と @onready アノテーションを、emit_signal("died") と文字列ベースの connect の代わりに died.emit() と died.connect(callable) を、yield の代わりに await を、.method() の代わりに super() を使います。4.1+、4.2+、4.4+ と書かれた行は、そのバージョン以上の Godot が必要です。GDScript の = と := の違いは何ですか?
var x = 5 は動的な変数を作り、あとからどんな型の値でも入れられます。var x := 5 は値から型 (ここでは int) を推論して固定するので、あとで文字列を代入するとエラーになります。var x: int = 5 は型を明示的に指定します。静的型を使うと、エディタでエラーが分かり、補完が賢くなり、コードも速くなります。GDScript のシグナルはどう動きますか?
signal died でシグナルを宣言し、died.emit() で発信し、別のノードから player.died.connect(_on_player_died) で受け取ります。メソッドの代わりにラムダを接続したり、.bind() で追加の引数を束縛したり、await player.died でシグナルが発火するまで関数を一時停止したりもできます。GDScript は Python に似ていますか?
for ... in、if/elif/else、そして and、or、not といった英単語を使います。ただし GDScript は Godot のために作られた独自の言語です。省略可能な静的型、シグナル、@export などのアノテーションがあり、$ でノードに直接アクセスできます。GDScript をオンラインで練習できますか?
_ready() の中のコードが 1 回実行されます。体系的に学びたいときは、Coddy の無料のインタラクティブな GDScript コースで、変数や関数からクラスやシグナルまで一歩ずつ進められます。