【Godot】GDScript文法入門 - 変数・関数・制御構文・配列/辞書の基礎

作成: 2026-07-09

Godotでゲームを動かす言語GDScriptの基本文法を初心者向けに解説。変数と型、関数、if/for/while/match、配列と辞書まで、実際に動く小さな例とともにひとつずつ学びます。

Godotを始めて最初にぶつかる壁が「スクリプト」ではないでしょうか。英語と記号だらけのコードを見て、そっとエディタを閉じたくなった——そんな経験があっても大丈夫です。ゲームを動かすのに、GDScriptのすべてを覚える必要はありません。

Godotでゲームのロジックを書く言語が GDScript です。この記事では、コードを書き始めるうえで「これだけは知っておきたい」基礎——変数と型、関数、if/for/while/match、そして配列と辞書——に絞って、実際に動く小さな例とともにひとつずつ解説します。

GDScriptの基礎を積み上げて学ぶイメージ。変数・関数・制御構文・配列の基礎ブロックをひとつずつ積み上げていく

この記事でわかること

  • 変数と型 ——値を入れておく「箱」の使い方(var / const
  • 関数 ——処理をまとめて再利用する(func / 引数 / 戻り値)
  • 制御構文 ——if / for / while / match の分岐と繰り返し
  • 配列と辞書 ——ArrayDictionary で複数のデータをまとめる

Sponsored

変数と型

変数 とは、数値や文字列などの値を入れておく「箱」です。GDScriptでは var で箱を作り、= で値を入れます。

変数は値を入れる箱、型は箱の種類であることを表す図。intの箱には整数、floatの箱には小数、boolの箱にはオンオフ、Stringの箱には文字列、Vector2�の箱には座標を入れる

箱には 型(データの種類) があります。Godotでよく使う基本の型はこちらです。

説明
int整数var score := 100
float小数var speed := 5.5
bool真偽値(true / falsevar is_alive := true
String文字列(" で囲む)var name := "Hero"
Vector22D座標・方向var pos := Vector2(10, 20)

型の付け方:var・型推論・const

変数の宣言にはいくつか書き方があります。 型を付けておく と、間違った値の代入を防げて安全です。

var health: int = 100      # 型を明示する書き方
var speed := 5.5           # :=(型推論): 右辺からfloatと自動で決まる
var name = "Hero"          # 型なしでも動くが、型付きが安全

const MAX_HP := 999        # constは「変更できない値」。定数名は大文字が慣例

:=型推論つきの代入 で、右辺の値から型が自動で決まります。var speed := 5.5var speed: float = 5.5 と同じ意味で、短く書けるのでよく使われます。値が変わらないもの(最大HPなど)は const にしておくと、うっかり書き換える事故を防げます。型そのものをもっと深く知りたくなったら GDScriptの静的型付け が参考になります。

Sponsored

関数

関数 は、特定の処理をひとまとめにしたものです。一度作れば、同じ処理を何度でも呼び出して再利用できます。GDScriptでは func で定義します。

関数は入力を受け取り処理して結果を返す機械であることを表す図。add(a, b)という機械に引数の10と5を入れると、戻り値の15が出てくる

イメージは「材料(引数)を入れると、加工された結果(戻り値)が出てくる機械」です。

func _ready() -> void:
    say_hello()                 # 関数を呼び出す
    var result := add(10, 5)    # 引数を渡し、戻り値を受け取る
    print("10 + 5 = ", result)  # → 10 + 5 = 15

# 引数も戻り値もない関数(-> void は「値を返さない」印)
func say_hello() -> void:
    print("こんにちは!")

# int型の引数を2つ受け取り、int型を返す関数
func add(a: int, b: int) -> int:
    return a + b                # returnで値を返す
  • 引数 :関数に渡す材料。名前: 型 の形で書き、複数ならカンマで区切ります
  • 戻り値-> 型 で返す値の型を書きます。何も返さないなら -> void
  • デフォルト引数func greet(name: String = "Hero") のように 省略時の値 を決められます

_ready()_process() も、Godotが特定のタイミングで自動的に呼ぶ特殊な関数です(ライフサイクル 参照)。

制御構文:if・for・while・match

プログラムの流れを操るのが 制御構文 です。「if は分かれ道、for/while はぐるぐる繰り返し、match は値ごとの仕分け」とイメージすると掴みやすいです。

制御構文の働きの比較図。ifは条件で道が分岐する分かれ道、forは指定回数くり返すループ、matchは値に応じて複数の出口へ仕分ける分岐マシン

if:条件分岐

「もし〜なら…する」の分岐です。2つ目以降の条件は elif、どれにも当てはまらない場合は else です。

var score := 85

if score >= 80:
    print("素晴らしい!")
elif score >= 60:
    print("合格です")
else:
    print("もう少し")

for・while:繰り返し

for は「決まった回数・要素ぶん」繰り返します。while は「条件が真の間」繰り返します。

for i in range(3):       # 0, 1, 2 の3回
    print("カウント: ", i)

for enemy in enemies:    # 配列の要素を1つずつ(後述)
    enemy.take_damage(10)

var hp := 3
while hp > 0:            # hpが0より大きい間くり返す
    hp -= 1

match:値ごとの仕分け

1つの値を複数のパターンと照らし合わせて分岐します。状態名などの分岐は、if/elif を並べるより読みやすくなります。

match state:
    "idle":
        print("待機")
    "run":
        print("走る")
    _:                   # _ はどれにも一致しなかったときの受け皿
        print("その他")
Sponsored

配列と辞書

敵が10体いるとき、enemy1enemy2…と変数を10個作るのは大変です。 複数のデータをまとめて扱う のが配列(Array)と辞書(Dictionary)です。

配列と辞書の違いの図。配列は0,1,2...と番号で並んだトレイで順番にアクセス、辞書はhp/atk/nameといったラベル付きの棚で名前でアクセスする

配列(Array は、値を 順番 に並べた入れ物です。0 から始まる番号(インデックス)でアクセスします。

var items := ["剣", "盾", "薬"]
print(items[0])          # → 剣(0番目)
items.append("兜")       # 末尾に追加
for item in items:       # 全要素をひとつずつ
    print(item)

辞書(Dictionary は、 名前(キー)と値 をペアで持つ入れ物です。番号ではなく「名前」でアクセスします。

var stats := {"hp": 100, "atk": 15}
print(stats["hp"])       # → 100(キーhpの値)
stats["def"] = 8         # キーdefで新しいペアを追加

「順番が大事なら配列、名前で引きたいなら辞書」と使い分けます。より構造化したデータを扱いたくなったら カスタムリソース も選択肢になります。

実践:敵の体力処理を書いてみる

ここまでの文法を組み合わせると、もう小さな仕組みが作れます。RPGのスライム、アクションのザコ、シューティングの敵機——どれにも通じる「HPを持ち、ダメージで減り、0になったら倒れる」処理を書いてみましょう。

敵の体力処理の流れの図。take_damageが呼ばれるとhealthから値を引き、if health <= 0 が真ならdie()で倒れ、偽ならまだ生きているという分岐
extends Node

var health: int = 30            # 変数:体力を持つ
const MAX_HEALTH := 30          # 定数:最大値

# 関数:ダメージを受ける処理(引数 amount、戻り値なし)
func take_damage(amount: int) -> void:
    health -= amount            # 体力を減らす
    print("残りHP: ", health)
    if health <= 0:             # 制御構文:0以下なら倒れる
        die()

func die() -> void:
    print("敵を倒した!")
    queue_free()                # 自分を消す

ポイントは2つです。

  • 文法は「部品」、組み合わせて仕組みになるvar(体力を持つ)・func(処理をまとめる)・if(条件で分ける)という基礎部品を組んだだけで、敵の振る舞いができました。どんな複雑なゲームも、この積み重ねです。
  • まず動かして覚えるprint() で値を出しながら少しずつ書くと、文法が体に馴染みます。エラーが出たら デバッグ技法 の記事が助けになります。

おまけ:先に知っておくと良いこと

基礎を使い始めると、次のような「その先」に出会います。名前だけでも知っておくと道筋が見えます。

  • 型を付けると安全&速いvar は型なしでも動きますが、型を付けると間違いを早く見つけられ、実行も速くなります。詳しくは 静的型付け で解説しています。
  • ノード同士の連携はシグナル :「敵が倒れた」を他へ伝えるには、print ではなく シグナル を使います。シグナルによるノード間の連携 が入口です。
  • Pythonに似ているけど別物 :インデントで構造を作る・コロンを使う点はPython風ですが、GDScriptはGodot専用言語で、Vector2Node が最初から組み込まれています。Pythonの知識は雰囲気を掴むのに役立ちますが、そのままでは動きません。

まとめ

  • 変数 はデータを入れる箱。var で作り、型(int/float/Stringなど)を付けると安全。変わらない値は const
  • 関数func で定義する処理のまとまり。引数で材料を受け取り、-> 型 で結果を返す(返さないなら -> void
  • 制御構文if(分岐)・for/while(繰り返し)・match(値ごとの仕分け)
  • 配列 [] は順番、辞書 {} は名前でデータをまとめる
  • 文法は「部品」。組み合わせるだけで敵の体力処理のような仕組みが作れる

最初は難しく感じても、実際に短いコードを書いて動かすうちに自然と身につきます。まずはこれらを道具に、ゲームに簡単な動きやルールを加えてみてください。

さらに学ぶために