Menu
CoddyTech

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
インライン ifvar 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、elseif hp <= 0: die() elif hp < 20: print("Low HP") else: print("OK")
1 行の ifif 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)
mapscores.map(func(x): return x * 2)
filterscores.filter(func(x): return x > 15)
reducescores.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 チートシートは無料ですか?
はい。この GDScript チートシートは完全に無料で、登録も不要です。ブックマークしておけば、シグナル、match のパターン、配列メソッドの正確な構文を確認したいときにいつでも戻ってこられます。
このチートシートは Godot 4 と Godot 3 のどちら向けですか?
Godot 4 向けです。2 つのバージョンには、コピーしたコードが動かなくなる違いがあります。Godot 4 では 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 をオンラインで練習できますか?
はい。GDScript プレイグラウンドを開けば、このチートシートのスニペットをブラウザで実行できます。プレイグラウンドはスクリプトをノードに結び付けるので、_ready() の中のコードが 1 回実行されます。体系的に学びたいときは、Coddy の無料のインタラクティブな GDScript コースで、変数や関数からクラスやシグナルまで一歩ずつ進められます。
Coddyのプログラミング言語のイラスト

CoddyでGDScriptを学ぼう

始める