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,再インストールしてください。
- 一旦プロジェクトを再起動する
- エディターの
プロジェクト
>プロジェクト設定
>プラグイン
で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