Cave: はじめてのガイド
Pythonツールとエディター拡張
Lesson 16 of 19 • 10 XP
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本のトーチを配置するツールはエディタロジックであり、レベル構築を支援しますが、エクスポートされたゲーム内で存在する必要はありません。
エディタツールの利点
最初は、カスタムツールは大規模なチームだけが必要とするもののように感じるかもしれません。
しかし、単独の開発者でさえ小さなツールから利益を得ることができ、繰り返し行う手動作業を減らします。同じタスクを何度も行う場合、シンプルなエディタスクリプトはプロジェクトをはるかに迅速に作業できる感覚を与えてくれます。
エディタツールは例えば以下の作業に役立ちます:
- エンティティのグループ設置。
- 必要なコンポーネントが欠けているかの確認。
- 一般的なシーン設定の作成。
- デバッグ情報の印刷。
- プレイモードに入らずに値のテスト。
- デザイナーがゲームプレイデータを調整するのを助ける。
例えば、数多くの敵キャンプを持つ三人称ゲームを構築しているとします。毎回同じフォルダ構造を手動で作成する代わりに、Enemy Group、いくつかのスポーンポイント、トリガーエリアを自動的に追加するツールを作成することができます。
エディタ専用スクリプト
エディタスクリプトは通常、以下の行から始まります:
#editoronly
これはCaveに対して、このスクリプトがエディタ用であることを伝えます。
これが重要な理由は、エディタツールがエディタ内でのみ意味を成すAPIや動作を使用する可能性があるからです。通常、レベルデザインヘルパーやデバッグパネルを最終ゲームのランタイムの一部にすることは望ましくありません。
これは、Caveにどのスクリプトをゲーム起動時に実行し、どのスクリプトを無視すべきかを教える上でも重要です。デフォルトでは、すべてのスクリプトを実行しますので、無視させたいスクリプトには、このコメントを最初の行として含めるべきです。
ということで、Cave Editor内での作業を支援するためだけに存在するスクリプトを作成している場合は、エディタ専用にしてください。
エディタタブツール
ツールを作成する一般的な方法は、エディタタブを使用することです。

エディタタブは、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("これはサンプルツールです。")
cave.ui.separator()
self.counter = cave.ui.prop("カウンター", self.counter)
if cave.ui.buttonDark("カウンター +1 増加"):
self.counter += 1
print("カウンターを +1 増加")
これは、エディタタブを追加したときのデフォルトコードでもあります。プロパティタブでクリックして開くと、エディタツールタブに移動すると、デバッグタブとして例のタブクラスが表示されます。これで、タブを登録または再読み込みすれば、UIで利用可能になります:

この例はシンプルですが、すでに基本的なアイデアを示しています:
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("レベルヘルパー:")
if cave.ui.buttonDark("敵グループを作成"):
print("敵グループ作成クリック")
ボタンはタブが更新されるたびに描画されますが、if内のコードはユーザーがボタンをクリックしたときだけ実行されます。
このパターンはエディタツールでは非常に一般的です。
実用的なツールのアイデア
レベルを構築しているとしましょう。同じ基本フォルダが必要になることが多いでしょう:
環境敵ゲームプレイトリガーライティングオーディオデバッグヘルパー
レベルフォルダを作成というボタンを持つエディタツールを作成することができます。クリックすると、現在のシーンにそれらのフォルダエンティティを作成します。シーングラフにおけるフォルダは、コンポーネントが一切アタッチされていないエンティティに過ぎません。
それは小さなものに聞こえるかもしれませんが、このような小さなツールは大規模なプロジェクトを整理整頓しやすくします。また、毎回手動で各手順を思い出さなくても自分のプロジェクトの規則に従うのに役立ちます。
エディタコンポーネント
時には、ゲームプレイロジックとエディタロジックを混ぜたい時があります。例えば、エンティティにアタッチされたコンポーネントがエディタロジックを実行し、デバッグ情報や敵の移動または攻撃範囲を示すデバッグ球体を表示する場合です。この場合、cave.Componentを使用する代わりに、cave.EditorComponentを使用します。
これは、エンティティに特別なエディタ動作が必要な場合に有用ですが、その動作は実際のゲームの一部であるべきではありません。
例えば:
- スポーンポイントはエディタ内でヘルパー情報を描画することができます。
- トリガーボリュームはデバッグコントロールを公開することができます。
- レベルマーカーは正しく構成されているかを確認できます。
重要な考えは、エディタスクリプトはゲーム作成に関するワークフローのためであり、ゲームプレイスクリプトはゲームそのものであるということです。
重要:
この場合、動作は通常のコンポーネントとは少し異なります。なぜなら、エディタコンポーネントのため、エディタが実行されておりゲームが実行されていない間、毎フレームエディタ更新メソッドが呼び出されます。しかし、最も大切な違いは、このコンポーネントが実際にエンティティと共に登録、初期化され、実行されるということです。プレイモードかどうかにかかわらず、startメソッド内部にロジックを入れても、プレイモード以外でも呼ばれます。
これが潜在的に危険な場合があります。 例えば、シーン内のすべてのエンティティを取得して削除するのをstartメソッド内に置いた場合、ゲームは完全に消去され、戻せない形でエディタ内で削除されます。それは欠陥ではなく、バグでもなく、設計上の仕組みですので、注意してください。
これをより安全に行う方法が必要な場合は、Python Code Componentを使用することができます。 これはエディタ更新メソッドを持っており、このエディタ更新を記述すれば、エディタ内でのstartとendの更新が呼び出されるかどうかに干渉しないので安全です(呼び出されません)。Caveが作成する初期プロジェクト内にあるEnemyを確認してください。これはPython Code Componentを使用して、敵の周りにデバッグ球体を描画し、移動可能な半径を示しています。学ぶための良い方法です。
ツールを構築するのはどのタイミングですか?
すべての小さなアクションのためにカスタムツールを作成しないでください。
真のワークフロープロブレムを解決する時にツールを構築してください。たとえば:
- 同じタスクを何度も繰り返す。
- セットアップを忘れやすい。
- シーンにバリデーションが必要。
- デザイナーが値変更用のクリーンなインターフェースが必要。
- プロトタイプへの迅速なデバッグボタンが必要。
初心者の場合、最初は手動でゲームオブジェクトを構築する方が良いです。次に、ステップを理解したら、退屈な部分を自動化できます。
覚えておくべきこと
CaveのPythonは、ゲームプレイとエディタツールの両方に使用できます。
ゲームプレイスクリプトは、ゲームが実行中の間に何が起こるかを制御します。エディタスクリプトは、Cave Editor内でプロジェクトを構築、検査、デバッグ、整理するのを助けます。
最初のゲームを作成するのにエディタツールは必要ありませんが、プロジェクトが成長し始めると、強力なツールになります。今日5分が節約できる小さなツールは、後で数時間を節約できるかもしれません。