Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

前のレッスンでは、Pythonがゲームプレイ中にエンティティを制御する方法を学びました。しかし、CaveのPythonは実行中のゲームに限定されるわけではありません。ゲーム制作をより速く行うためのエディターツールを作成することもできます。

これは特に多くのプロジェクトで繰り返しの作業があるため役立ちます。例えば、よく敵を配置したり、チェックポイントを作成したり、フォルダを整理したり、値をテストしたり、シーンデータを検査したりする場合があります。毎回手作業で行う代わりに、ワークフローの一部を自動化する小さなツールを作成できます。さらに、手続き生成レベルや手続き生成ビルディングなど、より高度なエディターを作成することも可能です。

このレッスンでは以下を学びます。

  • ゲームプレイスクリプトとエディタースクリプトの違い
  • エディターツールの用途
  • エディタータブツールの構成
  • #editoronly の重要性
  • カスタムツールを作成すべきタイミング

初心者はすぐにツールを作る必要はありませんが、このシステムが存在することを知っておくのは良いでしょう。プロジェクトが成長するにつれて価値が高まる機能の一つです。

ゲームプレイスクリプトとエディターツールの違い

簡単に言うと:

  • ゲームプレイスクリプトはゲームプレイ中に実行されます。
  • エディターツールはプロジェクト作業を助けるためにエディター内で動作します。
スクリプトタイプ 実行場所
ゲームプレイスクリプト プレイモードおよびエクスポートされたゲーム プレイヤーの移動、敵AI、ドア、アイテム取得
エディターツール Cave Editor レベル補助、バッチリネーマー、シーンインスペクター、手続き生成ビルディング生成、配置ツール

例えばドアの開閉スクリプトは、プレイヤーがゲームを遊んでいる間に体験するためのゲームプレイロジックなのでゲームプレイスクリプトです。一方で廊下にトーチを10個配置するツールはレベル作成を助けるエディタロジックで、エクスポートされたゲームに存在する必要はありません。

エディターツールが役立つ理由

最初はカスタムツールは大規模チーム向けのものに聞こえるかもしれません。

しかし、単独開発者でも小さなツールは手作業の繰り返しを減らすために役立ちます。同じ作業を何度も行うなら簡単なエディタースクリプトで作業速度が大幅に速く感じられます。

エディターツールは以下のようなことに役立ちます:

  • 複数のエンティティをまとめて配置
  • 必須コンポーネントの不足チェック
  • 一般的なシーンセットアップ作成
  • デバッグ情報の表示
  • プレイモードに入らずに値をテスト
  • デザイナーがゲームプレイデータを調整しやすくする

例えば多くの敵キャンプがある3人称ゲームを作る場合を想像してください。毎回同じフォルダ構造を手動で作る代わりに、Enemy Group、いくつかのスポーンポイント、トリガーエリアを自動で追加するツールを作ることができます。


エディター専用スクリプト

エディタースクリプトは通常、次の一行から始まります:

#editoronly

これはCaveにそのスクリプトがエディター用であることを示します。

これが重要なのは、エディターツールはエディター内でだけ意味のあるAPIや動作を使うことが多いためです。レベルデザインの補助やデバッグパネルは最終的なゲームの実行時に含めたくないでしょう。

また、Caveにどのスクリプトをゲーム起動時に実行すべきか、どのスクリプトを無視すべきか伝えるためにも重要です。デフォルトではすべてのスクリプトを実行するので、無視したい場合はこのコメントを最初の行に入れます。

したがって、Cave Editor内で作業を助けるためだけに存在するスクリプトなら、エディター専用にしましょう。

エディタータブツール

ツール作成の一般的な方法の一つはエディタータブです。

image.png

エディタータブはCave Editor内に表示されるカスタムパネルです。draw()メソッドがあり、タブが表示されている間Caveが呼び出して、ボタンやテキスト、プロパティ、他のコントロールを描画します。

非常に小さなエディタータブの例は次の通りです:

#editoronly
import cave

class ExampleTab(cave.ui.DebugTab):
    def __init__(self):
        super().__init__()
        self.counter = 0

    def draw(self):
        cave.ui.text("This is a sample tool.")
        cave.ui.separator()

        self.counter = cave.ui.prop("Counter", self.counter)

        if cave.ui.buttonDark("Increase counter +1"):
            self.counter += 1
            print("Counter increased by +1")

これがエディタータブ追加時のデフォルトコードにもなっています。プロパティタブで開き、次にエディターツーリングタブに切り替えると、このExampleTabクラスがデバッグタブとして表示されます。登録やリロードを行えばUIで利用可能になります:

image.png

この例は単純ですが、基本は以下の通りです:

  • cave.ui.DebugTab はカスタムエディタータブを作成
  • draw() でタブに表示する内容を定義
  • cave.ui.text() がテキストを描画
  • cave.ui.prop() が編集可能なプロパティを描画
  • cave.ui.buttonDark() がボタンを作成
  • print() はコンソールに情報を送る

このようにシンプルにCave Editor用のカスタムツールを作成できます。この仕組みを使って実用的なツールを作っていけます。

draw() メソッドの意味

draw() はゲームプレイコンポーネントの start() と同じではありません。

ツールが表示されている間、繰り返し呼び出されます。なぜならエディターUIは常に描画および更新される必要があるからです。つまり draw() 内のコードはツールの現在のインターフェースを記述します。

例えば:

def draw(self):
    cave.ui.text("Level Helper:")

    if cave.ui.buttonDark("Create Enemy Group"):
        print("Create enemy group clicked")

このボタンはタブが更新されるたびに描画されますが、if 内のコードはユーザーがボタンをクリックした時だけ実行されます。

このパターンはエディターツールで非常に一般的です。

実用的なツールのアイデア

レベルを作っていて、よく次の基本的なフォルダが必要だとします:

  • Environment
  • Enemies
  • Gameplay Triggers
  • Lighting
  • Audio
  • Debug Helpers

Create Level Foldersというボタン付きのエディターツールを作り、クリックすると現在のシーンにこれらのフォルダエンティティが作成されるようにできます。シーンのフォルダはコンポーネントを持たないエンティティにすぎません。

小さいツールに聞こえますが、このような小さなツールが大きなプロジェクトの整理を楽にし、自分のプロジェクト規則を手動で覚える必要なく従う助けになります。


エディターコンポーネント

時には、ゲームプレイロジックとエディターロジックを混ぜたいことがあります。例えば、エンティティにコンポーネントを付けてデバッグ情報や敵の移動や攻撃範囲を示すデバッグ球を表示させたい場合などです。この場合は cave.Component ではなく cave.EditorComponent を使います。

これはエンティティに特別なエディター上の挙動が必要だが、実際のゲームの一部にはしたくない場合に有用です。

例:

  • スポーンポイントにエディター上のヘルパー情報を描画
  • トリガーボリュームにデバッグコントロールを公開
  • レベルマーカーの設定が正しいかを検証

重要なのは、エディタースクリプトはゲームの制作作業用、ゲームプレイスクリプトはゲーム動作用であることです。

重要: この場合、通常のコンポーネントとは挙動が少し異なり、エディターコンポーネントはエディターが動作中でゲームが動作していない時に毎フレーム呼ばれるエディターアップデートメソッドを持ちます。さらに最も重要な違いは、このコンポーネントはプレイモードの有無に関わらずエンティティと一緒に登録され初期化され開始されることです。つまりstartメソッドにロジックを置くとプレイモード外でも呼ばれます。

これは潜在的に危険です。例えばエディターコンポーネントのstartでシーンの全エンティティを取得して削除するロジックを書いた場合、取り消し不能な破壊的な方法でエディター内のゲームが丸ごと削除されてしまいます。これはバグではなく設計通りの動作なので注意してください。

安全にしたい場合はPython Code Componentを使う方法があります。これはエディターのアップデートメソッドを持ち、このエディターアップデートを使ってもstartやendの呼び出しには干渉しません(呼ばれません)。Caveの初期プロジェクトにあるEnemyを調べてみてください。デバッグ球を敵の周囲に描画するためにPython Code Componentを使っていて学びやすい例です。


ツールはいつ作るべきか?

細かい動作ごとにカスタムツールを作る必要はありません。

以下のような実際のワークフロー問題を解決するときにツールを作りましょう:

  • 同じ作業を何度も繰り返す
  • セットアップが忘れがち
  • シーンの検証が必要
  • デザイナーが値を変えやすいインターフェースが必要
  • プロトタイプに素早いデバッグボタンが必要

初心者はまずゲームオブジェクトを手作業で作ることが望ましいです。その後ステップが分かったら面倒な部分だけを自動化しましょう。

最後に覚えておくべきこと

CaveのPythonはゲームプレイとエディターツールの両方に使えます。

ゲームプレイスクリプトはゲーム実行中の動作を制御し、エディタースクリプトはCave Editor内でプロジェクトの構築、検査、デバッグ、整理を助けます。

最初のゲームを作るためにエディターツールは必須ではありませんが、プロジェクトが大きくなってきたときに非常に強力です。今日5分節約できる小さなツールは後々何時間もの節約につながります。