CastleDBをGodotで使う上でのあれこれ
導入手順
-
CastleDBのexeをダウンロード
https://github.com/ncannasse/castle?tab=readme-ov-file
READMEのダウンロードリンクは公式サイトがSSL対応しておらずエラーになるため、ダウンロードは公式サイトからする
http://castledb.org/
-
CastleDBで データベースを作る
作ったDBファイル(*.cdb)は自身のGodotプロジェクト内に保存する
例)res://data/data.cdbなど
-
@arlez80 さん制作の
GDCastleDB for Godot Engine 4をプロジェクトにインストール- 下記よりファイル一式をダウンロード
https://godotengine.org/asset-library/asset/1739 - ダウンロードファイル内、
addons>gdcastledbを丸ごと自身のプロジェクトのアドオンディレクトリへコピー
エラーが出ないようにアドオンをいじる(アドオン実装のことを知らないので正しい対応かは不明です @godot v4.2.1-stable) - 下記よりファイル一式をダウンロード
gdcastledb/plugin.gdの22行目、get_name( )を_get_plugin_name( )にリネームgdcastledb/importer.gdの252行目code += "\t\t\tpass"をcode += "\t\t\tprintraw( import_src )"に書き換え (変数を使ってねーぞと警告が出てデバッグ実行するたびにスクリプトエディタが*.cdbを開いてしまうため)
→ 2024/04/23 作者様に該当箇所を修正いただいたのでこの対応は不要です。すでにコードを書き換えてしまった方はライブラリを再DL,再インストールしてください。
→ 2025/02/23 Godot4.3-stableにおいて、インポート時にエラーが発生します。gdcastledb/importer.gdの 13,14行目を下記のように変更すると動作するかもしれません。
func _get_save_extension( ) -> String:
return "tres"
# return "gd"
- 一旦プロジェクトを再起動する
- エディターの
プロジェクト>プロジェクト設定>プラグインでgdcastledb4の有効にチェックが入っていなければチェックをいれる
- DBファイルをオートロード設定する(シングルトン的に参照できるようする)
プロジェクト>プロジェクト設定>自動読み込みで
"パス"に作成したDBのパス(res://data/data.cdbなど)を設定、
"ノード名"にスクリプト上で参照するための名前(StaticDataなど)を設定
プロジェクトを再起動する
適当なスクリプトからStaticDataが見えるようになっていればOK
スクリプトからのデータ参照方法
仮にCastleDBでEnemyというテーブルを
- id(ユニークID)
- name
- hp
- attack
↑のようなカラム構成で定義して、
id: enemy_001
name: スライム
hp : 5
attack: 1
↑のようなレコードを作成していた場合、
下記のようにデータ参照ができます
# テーブル(CastleDBではシートと呼称): table_{シート名}
StaticData.table_enemy
# テーブル内のレコード: get_value("{ユニークID}")
StaticData.table_enemy.get_value("enemy_001")
# レコードのカラム: {カラム名}
StaticData.table_enemy.get_value("enemy_001").name
# あるテーブルの全レコードのユニークID : table_{シート名}.keys
StaticData.table_enemy.keys
# あるテーブルの全レコード : table_{シート名}.all
StaticData.table_enemy.all
もとのデータがどのようにGodotのオブジェクトに変換されているかは、
Godotのスクリプトエディターでオートロード設定済みの*.cdbを開くことで確認できます。
Refenceカラムの参照方法について
CastleDBでは、別のテーブル(=CDBではシートと呼称)を参照してドロップダウンリストで値を設定するReferenceというカラムを設定できます。
例えば、 Slay the Spireのようなカードゲームを作ろうと思い、
-
card、card_typeというテーブルを作成 -
cardテーブルにc_typeというカードタイプ用のカラムを作成 -
card_typeテーブルはユニークID(id)の他に表示名(disp_name)などのカラムを持つ -
c_typeに値を入力する際はcard_typeのユニークIDから値を選んで入力する

この場合に、cardのある1レコードから参照先のcard_typeの情報を取得するには下記のようにします。
# 参照先のカードタイプレコード全体を使いたいとき .{カラム名}
var c_type_row = StaticData.table_card.get_value("c_001").c_type
print(c_type_row.id)
print(c_type_row.disp_name)
# 参照先のユニークIDのみを取得したいとき ._{カラム名}_ref_id
# ※ 頭の _ と _ref_id の部分はカラム名に関係なくインポート時に自動で付与されます
var c_type_id = StaticData.table_card.get_value("c_001")._c_type_ref_id
print(c_type_id)
ちなみに、上の例でカードタイプを複数持たせたい場合、
cardテーブルのc_typeをListに設定し、
そのリストにtype1、type2といったReferenceカラムを設定します。

その場合の参照先カードタイプへのアクセス方法は次のようになります。
# 1つめのカードタイプを取得
var c_type1 = StaticData.table_card.get_value("c_001").c_type[0].type1
print(c_type1.id)
# 1つめのカードタイプのIDのみを取得
var c_type1_id = StaticData.table_card.get_value("c_001").c_type[0]._type1_ref_id
print(c_type1_id)
その他気づきがあれば随時追加
Discussion