コンポーネント
コンポーネントは、エディターによる発見を選択するプレーンな 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")) { /* ... */ }
}
これは推奨されるシグネチャです。スクリプトが必要とするすべてを提供するからです。
完全なノードライフサイクル
シーンが開始すると、ノードはトップダウンの走査でアクティブ化されます。各ノード:
awake—— 幅優先順で各コンポーネントに呼び出されます(親が子より先)。enable—— 同じ順序で呼び出されます。start—— 同じ順序で呼び出されます。
その後、毎フレーム:
update—— 毎フレーム、すべてのコンポーネントに呼び出されます。
シャットダウン時、ノードはボトムアップで非アクティブ化されます:
disable—— すべてのコンポーネントに呼び出されます。destroy—— すべてのコンポーネントに呼び出されます。
ランタイムで追加されたコンポーネント(ノードがアクティブになった後)は、追加時に即座に awake → enable → start を受け取ります。
コンポーネント間の更新順序
単一ノード内では、特定のライフサイクルフェーズのフックはソースコードの定義順——構造体にフィールドとメソッドが現れる順序で発生します。
ノード間の順序はシーン階層ツリーによって決定されます:親が子より先、兄弟は階層に現れる順序です。これはフレーム間および保存間で安定しています。順序を変更するには、階層内でノードをドラッグします。
カスタム更新順序(例:「すべての物理をすべてのレンダリングより先に」)は計画されていますが、まだ実装されていません。現時点ではツリー順序を使用してください。