👾

CastleDBをGodotで使う上でのあれこれ

2024/04/21に公開

導入手順

  1. CastleDBのexeをダウンロード
    https://github.com/ncannasse/castle?tab=readme-ov-file
    READMEのダウンロードリンクは公式サイトがSSL対応しておらずエラーになるため、ダウンロードは公式サイトからする
    http://castledb.org/

  2. CastleDBで データベースを作る
    作ったDBファイル(*.cdb)は自身のGodotプロジェクト内に保存する
    例) res://data/data.cdb など

  3. @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有効 にチェックが入っていなければチェックをいれる

  1. 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のようなカードゲームを作ろうと思い、

  • cardcard_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_typeListに設定し、
そのリストにtype1type2といった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