コンポーネント

このページは自動翻訳されており、誤りが含まれる場合があります。誤りを見つけた場合は「このページを編集」リンクからご協力ください。

コンポーネントは、エディターによる発見を選択するプレーンな Zig 構造体です。継承する基底クラスも登録ボイラープレートも必要ありません——たった1つのマーカーで十分です。


構造体をコンポーネントとしてマークする

pub const Health = struct {
    pub const is_component = true;

    max: f32 = 100.0,
    current: f32 = 100.0,
};
  • pub const is_component = true; は構造体を発見対象としてマークします。false に設定すると、構造体を削除せずに一時的に対象外にできます。
  • エディターは実際の Zig ソース(正規表現ではない)を解析するため、書式、コメント、条件付きコンパイルに関係なくマーカーは機能します。
  • 構造体は pub でなければならず、名前は大文字で始まる必要があります。
  • コンポーネントの型名はプロジェクト全体で一意である必要があります。重複は報告され、2番目の定義は無視されます。

ユーザースクリプトはプロジェクトの assets/ フォルダに配置します。スクリプトを追加または編集した後、アセットブラウザの更新をクリックして再スキャンします。

インスペクターのフィールド型

インスペクターはフィールドの Zig 型に基づいてコントロールをレンダリングします:

Zig 型 インスペクターのコントロール
f32 ドラッグ矢印付き数値フィールド
i32 整数フィールド
bool チェックボックス
engine.Vec3 ラベル付きの3軸ベクトル
engine.GameObjectRef ドロップターゲット——階層パネルからノードまたはシーンオブジェクトをドラッグ
engine.ComponentRef ドロップターゲット——ノード上の任意のコンポーネントを参照
engine.TypedAssetRef(.) アセットピッカー——アセットブラウザからドラッグするか ... ボタンを使用
engine.AssetRef アセットピッカー——任意のアセットタイプ
[N]type(静的配列) 個別に編集可能な要素
[]const u8 テキストフィールド

インスペクターがスキップするフィールド:

  • プライベートフィールド(アンダースコア接頭辞、例:_internal_state)。
  • デフォルト値のないフィールド(構造体定義に = expr がないもの)。
  • comptime フィールド。
  • * ポインターフィールド。

利用可能なライフサイクルフック

すべてのフックはオプションです。必要なものだけを実装してください。

フック シグネチャ 呼び出しタイミング
awake fn(self) void コンポーネントが最初に読み込まれたとき
enable fn(self) void ノードがアクティブになったとき(またはアクティブなノードにコンポーネントが追加されたとき)
start fn(self) void シーンが実行を開始したとき
update fn(self, time: engine.Time) void 毎フレーム——engine.Frame の使用を推奨(下記参照)
disable fn(self) void ノードが非アクティブになったとき(またはコンポーネントが破棄前に削除されたとき)
destroy fn(self) void ノードが破棄されたとき

すべてのフックは第2パラメータとして frame: engine.Frame も受け入れます。フックが frame: engine.Frame を受け取ると、入力、サービス、シーンツリー、ユーティリティにアクセスできます:

pub fn update(self: *@This(), frame: engine.Frame) void {
    if (frame.input.wasPressed("jump")) { /* ... */ }
}

これは推奨されるシグネチャです。スクリプトが必要とするすべてを提供するからです。

完全なノードライフサイクル

シーンが開始すると、ノードはトップダウンの走査でアクティブ化されます。各ノード:

  1. awake —— 幅優先順で各コンポーネントに呼び出されます(親が子より先)。
  2. enable —— 同じ順序で呼び出されます。
  3. start —— 同じ順序で呼び出されます。

その後、毎フレーム:

  1. update —— 毎フレーム、すべてのコンポーネントに呼び出されます。

シャットダウン時、ノードはボトムアップで非アクティブ化されます:

  1. disable —— すべてのコンポーネントに呼び出されます。
  2. destroy —— すべてのコンポーネントに呼び出されます。

ランタイムで追加されたコンポーネント(ノードがアクティブになった後)は、追加時に即座に awakeenablestart を受け取ります。

コンポーネント間の更新順序

単一ノード内では、特定のライフサイクルフェーズのフックはソースコードの定義順——構造体にフィールドとメソッドが現れる順序で発生します。

ノード間の順序はシーン階層ツリーによって決定されます:親が子より先、兄弟は階層に現れる順序です。これはフレーム間および保存間で安定しています。順序を変更するには、階層内でノードをドラッグします。

カスタム更新順序(例:「すべての物理をすべてのレンダリングより先に」)は計画されていますが、まだ実装されていません。現時点ではツリー順序を使用してください。


← すべてのドキュメント このページを編集