【Godot】Autoloadによるシーンをまたぐデータ管理

作成: 2025-06-20最終更新: 2025-12-06

グローバルに永続化するデータやシングルトンの実装方法。宝箱の開封状態やプレイヤー情報の管理

概要

ゲーム開発を進めていくと、「プレイヤーのHPを次のステージに引き継ぎたい」「ハイスコアを記録したい」「ゲーム全体の設定をどこかで一元管理したい」といった要求が出てきます。しかし、Godotではchange_scene_to_file()などでシーンを切り替えると、通常は古いシーンのすべての情報が破棄されてしまいます。

この問題を解決し、シーンをまたいでデータを永続的に保持するための最も簡単で強力な方法が、Autoload(オートロード) 機能です。これは、一般的に「シングルトン」と呼ばれるデザインパターンをGodotで簡単に実現する仕組みです。

この記事では、Autoloadの概念と使い方を学び、ゲーム全体で共有されるデータ管理の方法をマスターします。

Autoload(シングルトン)とは?

Autoloadとは、ゲームの起動時に自動的に読み込まれ、ゲームが終了するまで常にメモリ上に存在し続けるノード(または単なるスクリプト)のことです。一度Autoloadに登録すると、どのシーンのどのスクリプトからでも、グローバル変数のように簡単にアクセスできるようになります。

主な用途:

  • グローバルな状態管理: プレイヤーのスコア、所持金、ライフなど、ゲーム全体で共有する情報。
  • 汎用的な機能の提供: サウンド管理、シーン遷移のエフェクト、設定情報など、どこからでも呼び出したい機能。
  • マネージャーノード: ゲーム全体の進行を管理する親玉のような存在。

Autoloadの設定方法

Autoloadの設定は、プロジェクト設定から数クリックで行えます。

1. グローバルなスクリプトを作成

まず、管理したいデータや機能を持つスクリプトを作成します。例えば、GlobalState.gdという名前のスクリプトを作り、以下のように記述します。

extends Node

var current_score = 0
var high_score = 0

func add_score(amount):
    current_score += amount
    if current_score > high_score:
        high_score = current_score

func reset_score():
    current_score = 0

2. プロジェクト設定を開く

メニューバーから「プロジェクト」→「プロジェクト設定」を選択します。

3. Autoloadタブに移動

上部のタブから「Autoload」を選択します。

Autoload設定画面

4. スクリプトを登録

「パス」のフォルダアイコンをクリックして、先ほど作成したGlobalState.gdを選択します。「ノード名」は自動的にスクリプト名と同じGlobalStateになります(変更も可能)。「追加」ボタンを押して登録完了です。

Autoloadの設定画面
Godot公式ドキュメントより引用

スクリプトからのアクセス方法

Autoloadに登録したノード(この例ではGlobalState)は、登録したノード名がそのままグローバル変数のように 機能します。どのスクリプトからでも、事前のget_node()@onready宣言なしに直接アクセスできます。

# 敵を倒した時の処理
func _on_enemy_defeated():
    # GlobalStateの関数を直接呼び出す
    GlobalState.add_score(100)
    print("現在のスコア: ", GlobalState.current_score)

# ゲームオーバー画面の処理
func _ready():
    # GlobalStateの変数を直接参照する
    $HighScoreLabel.text = "ハイスコア: %d" % GlobalState.high_score

このように、GlobalStateという名前でどこからでもアクセスできるため、シーンをまたいだデータの受け渡しが非常にシンプルになります。

まとめ

Autoloadは、Godotにおけるグローバルなデータ管理の基本であり、非常に強力なツールです。シーンをまたいで情報を保持したい、どこからでも呼び出せる便利な機能を作りたい、と思ったら、まずはAutoloadの利用を検討しましょう。

ただし、何でもかんでもAutoloadに登録すると、コードの依存関係が複雑になり、見通しが悪くなる可能性もあります。本当に「グローバル」である必要があるデータや機能を見極めて使うことが、綺麗なプロジェクトを保つ秘訣です。