Maemaemae

Godot 4でプロジェクトフォルダを自動生成するプラグインの作成方法

はじめに

Godotでゲーム開発を始める際、適切なフォルダ構造の構築は非常に重要です。しかし、新しいプロジェクトごとに同じフォルダ構造を手動で作成するのは時間の無駄です。この記事では、Godot 4でプロジェクトフォルダを自動生成するエディタプラグインの作成方法を解説します。

このプラグインを使えば、ボタン一つでプロジェクトに必要な標準的なフォルダ構造を瞬時に作成でき、開発の初期段階での時間を節約できます。

なぜフォルダ構造が重要なのか

整理されたフォルダ構造は以下の理由で重要です:

プラグインの概要

今回作成するプラグインは、次の機能を提供します:

  1. Godotエディタのメニューに「フォルダ構造を生成」オプションを追加
  2. 確認ダイアログを表示して誤操作を防止
  3. プロジェクトに標準的なフォルダ構造を自動生成
  4. 生成結果のフィードバックを表示

プラグインの作成手順

1. フォルダ構造の準備

まず、プラグイン用のフォルダを作成します:

res://addons/folder_generator/

2. プラグイン設定ファイルの作成

plugin.cfgファイルをプラグインフォルダに作成し、以下の内容を記述します:

[plugin]
name="Folder Generator"
description="プロジェクト用の標準フォルダ構造を生成します"
author="Your Name"
version="1.0"
script="plugin.gd"

3. プラグインスクリプトの実装

plugin.gdファイルをプラグインフォルダに作成し、以下のコードを記述します:

@tool
extends EditorPlugin

var dialog: ConfirmationDialog

func _enter_tree():
    # プラグインが有効化されたときに実行
    add_tool_menu_item("フォルダ構造を生成", _on_create_folders_pressed)

func _exit_tree():
    # プラグインが無効化されたときに実行
    remove_tool_menu_item("フォルダ構造を生成")

    if dialog:
        dialog.queue_free()

func _on_create_folders_pressed():
    # 確認ダイアログを作成
    dialog = ConfirmationDialog.new()
    dialog.title = "フォルダ構造の作成"
    dialog.dialog_text = "標準的なフォルダ構造を作成しますか?\n既存のファイルやフォルダは上書きされません。"
    dialog.confirmed.connect(_on_dialog_confirmed)
    dialog.canceled.connect(_on_dialog_canceled)

    # ダイアログをエディタに追加し表示
    get_editor_interface().get_base_control().add_child(dialog)
    dialog.popup_centered()

func _on_dialog_confirmed():
    create_folder_structure()
    dialog.queue_free()

func _on_dialog_canceled():
    dialog.queue_free()

func create_folder_structure():
    # 標準的なフォルダ構造を作成
    var folders = [
        "res://assets",
        "res://assets/sprites",
        "res://assets/textures",
        "res://assets/models",
        "res://assets/audio",
        "res://assets/fonts",
        "res://assets/data",
        "res://scenes",
        "res://scenes/levels",
        "res://scenes/ui",
        "res://scenes/characters",
        "res://scenes/objects",
        "res://src",
        "res://addons",
        "res://_debug"
    ]

    var created_count = 0
    var already_exists_count = 0

    for folder in folders:
        if create_directory(folder):
            created_count += 1
        else:
            already_exists_count += 1

    # 結果を表示するダイアログ
    var result_dialog = AcceptDialog.new()
    result_dialog.title = "フォルダ作成完了"
    result_dialog.dialog_text = "作成したフォルダ: %d\n既存のフォルダ: %d" % [created_count, already_exists_count]

    get_editor_interface().get_base_control().add_child(result_dialog)
    result_dialog.popup_centered()

func create_directory(path) -> bool:
    var dir = DirAccess.open("res://")
    if dir:
        if not dir.dir_exists(path):
            var error = dir.make_dir_recursive(path)
            if error == OK:
                print("作成成功: " + path)
                return true
            else:
                print("作成失敗: " + path + ", エラーコード: " + str(error))
                return false
        else:
            print("フォルダはすでに存在します: " + path)
            return false
    else:
        print("ディレクトリにアクセスできませんでした")
        return false

コードの解説

プラグインの基本構造

このプラグインはEditorPluginクラスを拡張しています。Godotのエディタプラグインを作成するには、@toolアノテーションとEditorPluginの継承が必要です。

@tool
extends EditorPlugin

プラグインの初期化と終了

プラグインが有効化されたときと無効化されたときに実行されるメソッドです:

func _enter_tree():
    add_tool_menu_item("フォルダ構造を生成", _on_create_folders_pressed)

func _exit_tree():
    remove_tool_menu_item("フォルダ構造を生成")

    if dialog:
        dialog.queue_free()

add_tool_menu_itemメソッドにより、Godotエディタの「プロジェクト」メニューに新しい項目が追加されます。

ダイアログの表示

ユーザーがメニューオプションをクリックすると、確認ダイアログが表示されます:

func _on_create_folders_pressed():
    dialog = ConfirmationDialog.new()
    dialog.title = "フォルダ構造の作成"
    dialog.dialog_text = "標準的なフォルダ構造を作成しますか?\n既存のファイルやフォルダは上書きされません。"
    dialog.confirmed.connect(_on_dialog_confirmed)
    dialog.canceled.connect(_on_dialog_canceled)

    get_editor_interface().get_base_control().add_child(dialog)
    dialog.popup_centered()

フォルダ構造の作成

フォルダ構造を定義し、各フォルダを順番に作成します:

func create_folder_structure():
    var folders = [
        "res://assets",
        "res://assets/sprites",
        // 省略...
    ]

    var created_count = 0
    var already_exists_count = 0

    for folder in folders:
        if create_directory(folder):
            created_count += 1
        else:
            already_exists_count += 1

ディレクトリの作成

実際にディレクトリを作成するためのヘルパーメソッドです:

func create_directory(path) -> bool:
    var dir = DirAccess.open("res://")
    if dir:
        if not dir.dir_exists(path):
            var error = dir.make_dir_recursive(path)
            // 省略...

Godot 4ではDirAccessクラスを使用してファイルシステム操作を行います。make_dir_recursiveメソッドにより、親ディレクトリも含めて一括で作成できます。

プラグインの使用方法

1. プラグインのインストール

作成したプラグインをインストールするには、以下の手順に従います:

  1. プロジェクトの「addons」フォルダに「folder_generator」フォルダを作成
  2. plugin.cfgplugin.gdファイルをこのフォルダに配置

2. プラグインの有効化

  1. Godotエディタで「プロジェクト > プロジェクト設定」を開く
  2. 「プラグイン」タブを選択
  3. リストから「Folder Generator」を探し、有効化のチェックボックスをオンにする

3. プラグインの実行

  1. Godotエディタのトップメニューから「プロジェクト > フォルダ構造を生成」を選択
  2. 確認ダイアログで「OK」をクリックすると、フォルダ構造が自動生成される
  3. 生成結果のダイアログが表示される

カスタマイズ方法

フォルダ構造のカスタマイズ

プロジェクトの要件に合わせてフォルダ構造をカスタマイズする場合は、create_folder_structureメソッド内のfolders配列を変更します:

var folders = [
    "res://assets",
    "res://assets/sprites",
    // 自分のプロジェクトに必要なフォルダを追加
    "res://assets/custom_folder",
    // 省略...
]

ダイアログのカスタマイズ

確認ダイアログの内容をカスタマイズする場合は、_on_create_folders_pressedメソッド内のダイアログテキストを変更します:

dialog.title = "カスタムタイトル"
dialog.dialog_text = "カスタムメッセージをここに入力"

トラブルシューティング

プラグインが表示されない場合

フォルダ作成に失敗する場合

まとめ

このエディタプラグインを使用することで、Godot 4プロジェクトのフォルダ構造を自動的に生成できるようになります。これにより、プロジェクト設定の時間を短縮し、一貫したフォルダ構造を保つことができます。

プラグインは簡単に拡張でき、プロジェクトの要件に合わせてカスタマイズすることも可能です。エディタプラグインの開発を通じて、Godotのエディタ機能を拡張する方法も学ぶことができました。

参考資料


Godot 4.xを基準としています。このプラグインは特定のGodotバージョンで動作確認されていますが、将来のバージョンでは変更が必要になる可能性があります。

Godotプラグイン開発フォルダ構成ゲーム開発効率化