Godot4 プロジェクト設定に保存した独自の項目を削除するプラグイン実装例

無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、プロジェクトごとの設定を管理するプロジェクト設定から、指定した項目(前回保存した独自の項目)を削除するスクリプト例とその実行結果を紹介します。

※例として独自に保存した項目を削除します。既存の項目を削除するとエディターなどの動作が不安定になる危険性があります。

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご利用ください。

プラグインによるツールメニューとサブメニューの追加

独自の項目をプロジェクト設定に保存する処理を実装した関数は、作成したプラグインによって追加したツールメニューのサブメニューを選択することで呼び出されます。

プラグインとツールメニュー・サブメニューの追加の方法については以下の記事を参照してください。

独自項目を保存するサブメニュー Save について

独自項目を保存するサブメニュー Save については以下の記事を参照してください。

独自の項目を保存する前のプロジェクト設定ダイアログ

下図は、プロジェクト設定から独自の項目を削除する前に、プロジェクト設定ダイアログの一般タブのスクリーンショットです。
※プロジェクト設定ダイアログは、メニュー「プロジェクト」→「プロジェクト設定」で開きます。

保存した独自の項目は、ツリーの一番下に表示されました。

保存した独自の項目は、右上の「高度な設定」有効にした状態で、ツリーの一番下ScLib → Fit Font Size として表示されました。
そのページ内には、保存する際に指定した name に含まれる Scale Correction Value セクションとそのあとの Label, Button の項目と値表示されています。
※なぜか Label は日本語に変わっていますが、別の記事で Label 指定で項目を削除できたので、内部的には Label で保存されています。

Godot4 プロジェクト設定に保存した独自の項目を削除するプラグイン実装例1

プロジェクト設定の項目を削除するプラグインのスクリプト例

以下のスクリプトを、以下の記事で作成したプラグインの gd スクリプトに貼り付けて保存します。

上記の記事で紹介している手順で、追加したツールメニューのサブメニューを選択すると、_on_submenu_id_pressed 関数( 57 行目)が呼び出され、サブメニューのどの項目かを id で判別して、対応する関数を呼び出します。

@tool
extends EditorPlugin

## ProjectSettings の「ユーザ名/アドオン名/セクション名/キー」の読み書きを Dictionary 型を用いて行う関数とそのテストです。
## EditorInterface の機能はエディタ上で利用できます。
## ProjectSettings の機能を含む関数を実行するために、プラグインとしてこのスクリプトを追加して
## ツールメニュー(「プロジェクト」→「ツール」)から、これが追加したメニューを選択してください。

## 追加するメニューアイテムの表示名です。
const tool_menu_item_name: StringName = "Study ProjectSettings By Dictionary"
## メニューアイテムに追加するサブメニューアイテムの項目名と ID の配列です。
const tool_submenu_item_info_array = [
	{"name": "Save", "id": 0},
	{"name": "Set Initial Value", "id": 1},
	{"name": "Load", "id": 2},
	{"name": "Clear", "id": 3},
]
## サブメニューのリソースです。
var submenu: PopupMenu = null

## テストでアクセスする ProjectSettings の name の要素です。
## テストでは、 EDITOR_SETTINGS_PATH + EDITOR_SETTINGS_SECTION + key を name とします。
const PROJECT_SETTINGS_PATH = "sclib/fit_font_size/"
const PROJECT_SETTINGS_SECTION = "scale_correction_value/"


## プラグインの初期化処理を定義します。
## プラグイン (プロジェクト設定ダイアログ>プラグイン>有効) を有効にした直後や、プラグインが有効な状態のプロジェクトを開いた際に呼び出されます。
func _enter_tree():
	if submenu == null:
		# サブメニュー用のポップアップメニューに項目名とその ID を追加します。
		submenu = PopupMenu.new()
		for info in tool_submenu_item_info_array:
			submenu.add_item(info.name, info.id)
		# 選択されたシグナル発生時に呼び出す関数を設定します。
		submenu.id_pressed.connect(_on_submenu_id_pressed)
		# ツールメニュー(「プロジェクト」→「ツール」)にメニューアイテムとそのサブメニューを追加します。
		add_tool_submenu_item(tool_menu_item_name, submenu)
	
	return


## プラグインの後片付けの処理を定義します。
## プラグインを無効 (プロジェクト設定ダイアログ>プラグイン>有効) にした直後や、プラグインが有効な状態でプロジェクトを閉じた際に呼び出されます。
func _exit_tree():
	# ツールメニュー(「プロジェクト」→「ツール」)に追加したメニューアイテムを削除します。
	remove_tool_menu_item(tool_menu_item_name)
	# サブメニューのリソースを解放します。
	if submenu != null:
		submenu.queue_free()
		submenu = null
	return


## プラグインで追加したツールメニューのサブメニューを選択した際に呼び出される関数です。
## [param id] は、選択されたサブメニューの項目の ID です。
func _on_submenu_id_pressed(id):
	print("_on_submenu_id_pressed called. id = ", id)
	print(tool_submenu_item_info_array[id].name, " pressed.")
	
	# id が指すツールメニューのサブメニューに対応した処理を実行します。
	match id:
		0:	# Save
			test_save_editor_settings_section_from_dictionary()
		3:	# Clear
			test_erase_project_settings_section_from_dictionary()
		_:
			push_warning("id is unknown.")
	return

## [method save_project_settings_section_from_dictionary] のテスト関数です。
func test_save_editor_settings_section_from_dictionary():
	# セクション内に保存されるデータです。
	var dic_save = {}
	dic_save["Label"] = 0.9
	dic_save["Button"] = 1.0
	
	# 辞書のデータ群を、指定した EditorSettings ファイルのセクションに保存します。
	# ファイルが存在しない場合は作成し、存在する場合は辞書の要素ごとに上書きします。
	print("save_project_settings_section_from_dictionary call")
	save_project_settings_section_from_dictionary(
		PROJECT_SETTINGS_PATH, PROJECT_SETTINGS_SECTION, dic_save)
	
	return


## 指定した ProjectSettings の path (例:「ユーザ名/アドオン名」)のセクションに、辞書型のデータを保存します。
## 辞書の要素のキーは、EditorSettings.set_settings の name 引数、値は value 引数に対応します。
##
## [param path] と [param section] を連結した base_path に、
## 辞書の要素キーを付け加えた name に対して value を設定します。
##
## [param path] に "user_name/addon_name/" を指定して、
## [param section] に "section_name/" を設定すると
## ユーザ名、アドオン名、セクション名を / で区切った後にキーを加えた name に value を設定します。
func save_project_settings_section_from_dictionary(
	path: String, section: String, dic: Dictionary) -> void:
	
	# 設定を保存する name のキーの1つ前までの階層の文字列を作成します。
	var base_path := path + section
	
	# 辞書変数の要素ごとに EditorSettings に保存します。
	for key in dic.keys():
		# name の最後には、辞書変数のキーを追加します。
		var project_settings_name: String = base_path + key
		ProjectSettings.set_setting(project_settings_name, dic[key])
	
	return


## [method erase_project_settings_section_from_dictionary] のテスト関数です。
func test_erase_project_settings_section_from_dictionary():
	# セクション内に保存されるデータです。
	var array_erase_keys = ["Label", "Button"]
	
	# 辞書のデータ群を、指定した EditorSettings ファイルのセクションの
	# 各設定値の初期値に設定します。
	print("erase_project_settings_section_from_dictionary call")
	erase_project_settings_section_from_dictionary(
		PROJECT_SETTINGS_PATH, PROJECT_SETTINGS_SECTION, array_erase_keys)
	
	return


## ProjectSettings の項目を削除します。
## 削除することでエディタが正常に動作しなくなる危険性があるので注意してください。
## [param path] + [param section ] + [param erase_keys] の各要素で連結した文字列
## の name に一致する項目を削除します。
func erase_project_settings_section_from_dictionary(
	path: String, section: String, erase_keys: Array = []
) -> void:
	
	# 設定を保存する name のキーの1つ前までの階層の文字列を作成します。
	var base_path := path + section
	
	# 辞書変数の要素ごとに EditorSettings から値を取得します。
	for key in erase_keys:
		# name の最後には、辞書変数のキーを追加します。
		var project_settings_name: String = base_path + key
		print("erase_project_settings_section_from_dictionary, project_settings_name = ", project_settings_name)
		# name と同じ項目があれば、それを削除します。
		if ProjectSettings.has_setting(project_settings_name) == true:
			# 指定した name の設定値を削除します。
			ProjectSettings.set_setting(project_settings_name, null)
			print(project_settings_name, " を ProjectSettings から削除しました。")
		else:
			print(project_settings_name, " は ProjectSettings にありませんでした。")
	return

今回は、サブメニュー Clear (表示は「クリア」)を選択した際に、プロジェクト設定に独自の項目を保存するテスト関数 test_erase_project_settings_section_from_dictionary( 112 行目)を呼び出します。

そのテスト関数の内部では、辞書変数に指定した項目群をプロジェクト設定保存する erase_project_settings_section_from_dictionary 関数( 129 行目)を呼び出します。

その関数内で、配列の要素ごとに set_setting 関数の第2引数に null を指定して使用( 144 行目)して、独自の項目をプロジェクト設定から削除しています。

void set_setting(name: String, value: Variant

Sets the value of a setting.

設定値を設定します。

ProjectSettings.set_setting("application/config/name", "Example")

This can also be used to erase custom project settings. To do this change the setting value to null.

これは、カスタム プロジェクト設定を消去するためにも使用できます。これを行うには、設定値null に変更します。

ProjectSettings — Godot Engine (stable) documentation in English #set_setting と Google 翻訳

clear 関数は非推奨

set_setting の代わりに clear 関数に同じ name の値を指定して実行しても、プロジェクト設定から同様に項目が削除されました。
しかし、推奨されないようなので、set_setting 関数(第2引数に null を指定)を使ったほうが良いでしょう。

void clear(name: String

Clears the whole configuration (not recommended, may break things).

構成全体をクリアします (推奨されません。問題が発生する可能性があります)。

ProjectSettings — Godot Engine (stable) documentation in English #clear と Google 翻訳

ツールメニューを選択して、独自の項目を保存する関数を実行

メニュー「プロジェクト」→「ツール」から追加したツールメニュー「Study ProjectSettings By Dictionary」を選択すると、 4 つの項目のサブメニューが表示されるので「クリア」を選択します。
サブメニューの1番目は Clear と入力しましたが、日本語メニューに対応させるためか「クリア」と表示されています。

Godot4 プロジェクト設定に保存した独自の項目を削除するプラグイン実装例2

プロジェクト設定指定した項目を削除する関数実行されました。

_on_submenu_id_pressed called. id = 3
Clear pressed.
erase_project_settings_section_from_dictionary call
erase_project_settings_section_from_dictionary, project_settings_name = sclib/fit_font_size/scale_correction_value/Label
sclib/fit_font_size/scale_correction_value/Label を ProjectSettings から削除しました。
erase_project_settings_section_from_dictionary, project_settings_name = sclib/fit_font_size/scale_correction_value/Button
sclib/fit_font_size/scale_correction_value/Button を ProjectSettings から削除しました。

独自の項目を保存した後のプロジェクト設定ダイアログの確認

下図は、プロジェクト設定独自の項目を削除した後に、プロジェクト設定ダイアログの一般タブのスクリーンショットです。
※プロジェクト設定ダイアログは、メニュー「プロジェクト」→「プロジェクト設定」で開きます。

独自の項目を全て削除すると、先ほど確認した ScLib のセクション自体が削除されました。

Godot4 プロジェクト設定に保存した独自の項目を削除するプラグイン実装例3

まとめ

  • ProjectSettings クラスの set_setting 関数(第2引数に null を指定)を使用して、プロジェクト設定から、指定した項目(独自の項目)を削除しました。
  • プロジェクト設定ダイアログの一般タブ(高度な設定:有効)で、削除した後に、独自に保存したセクションと項目消えたことを確認しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました