コンテンツにスキップ

ゲームの作成

Medusaは、コンテンツを 「データ」 (リソース)、 「ロジック」 (ルール)、 「表現」 (シーン内のノード)の3つのレベルに分離します。機能するスキルツリーやインタラクティブなグラフを作成するには、これらを互いに結びつける必要があります。

Tip

グラフを操作する前に、 _ready() で必ず await get_tree().process_frame を呼び出してください。システムがすべての接続をインデックス化するのに時間が必要です。


1) データベースとプログレッション

このシステムは2種類のデータベースに依存しています。これにより、スキル自体の設定に影響を与えることなく、プレイヤーの進行状況を簡単に保存できます。

MedusaDB(グローバルカタログ)

ゲーム内で利用可能なすべての要素の「倉庫」です。

  • 各オブジェクトは AtomData リソースに対応します。
  • MedusaDB はこれらのリソースへのリンクを保存し、一意の id (StringName) にマッピングします。
  • グラフに Atom を追加して AtomData を割り当てると、グラフはこのリソースをデータベースに登録します。
ProgressDB(セーブファイル)

プレイヤーの進行状況( id : レベル )を追跡する動的な辞書です。 - スキルIDがこのデータベースにある場合、それはアンロックされていることを意味します。 - progress_db.unlock(id) メソッドは、コード内でスキルを「購入」する主な方法です。

詳細は データ セクションを参照してください。


2) グラフロジック (GraphLogics)

GraphLogic は、アトムの状態( LOCKEDAVAILABLEUNLOCKED など)を自動的に管理する強力なルールシステムです。すべてのボタンの色を手動で変更する代わりに、グラフ全体の一連のルールを定義します。

グラフには graph_logics 配列があります。 graph.sync_with_progress() が呼び出されると、グラフはすべてのアトムを反復し、各ルールに「このアトムをアンロックできるか?」と問いかけます。 ルールは3種類の回答のいずれかを返します:

  1. BLOCK(禁止): 少なくとも1つのルールが BLOCK を返すと、アトムは DISABLED になるか、 LOCKED のままになります。
  2. ALLOW(許可): 条件が満たされた場合(例:親スキルが購入された場合)。
  3. PASS(中立): ルールは関与しません(例:スキルにルールが設定されているタグがない場合)。

組み込みロジックタイプ:

  • ConnectionsLogic: 接続が開いているかチェックします。 ANY_PARENT モードでは、少なくとも1つの「祖先」がアンロックされていればスキルが利用可能になります。
  • ProgressLogic: スキルがすでに購入されているかチェックし、状態を UNLOCKED に設定します。
  • TagLogic: 特定のタグを割り当てることで、「ルート」スキル( Root )をデフォルトで利用可能にします。
  • BlockLogic: 特定の条件が満たされた場合にブランチをハードブロックします。

カスタムロジックの作成については GraphLogics を参照してください。


3) 開発:ダイナミックグラフとスタティックグラフ

Medusaはツリー作成において2つのアプローチをサポートしています。

A. 手動作成(エディタ内)

Godotのインターフェースで AtomGraphBranch ノードを配置し、 Connected Paths や視覚効果を設定します。これは、小規模で固定されたスキルツリーに最適です。

B. プログラムによる生成(グラフAPI)
  1. アトムのスポーン: graph.add_atom(atom_node, branch) を使用します。これによりアトムが物理システムに登録されます。
  2. リンク: graph.connect_atoms(parent, child) は物理的なバネと論理的な階層を作成します。
  3. 同期: 変更後は graph.sync_with_progress(progress_db) を呼び出し、すべてのノード状態を即座に再計算します。
  4. フォーカス管理: ユーザーがどのオブジェクトを選択したかを知るために graph._focused_atom を使用します。これによりフローティングUI(デモの ctx_panel など)を実現できます。
    ctx_panel.global_position = graph._focused_atom.global_position + offset
    
  5. 一括操作: graph._selected_atoms を使用して、ワンクリックで要素のグループをリンクまたは削除できます。

詳細については、自動化をご覧ください。