シーンのインスタンス化
シーン(.prefab ファイル)を作成したら、それを他のシーンにインスタンス化できます。インスタンスはリンクされたコピーです。ソースシーンへの変更は、インスタンスが意図的にオーバーライドしたプロパティを除き、すべてのインスタンスに反映されます。
用語
- ソース — オブジェクトツリーを定義するディスク上の
.prefabファイル。 - インスタンス — 開いているシーン内のそのツリーのリンクされたコピー。
- オーバーライド — 特定のインスタンスで変更されたプロパティ。ソースが更新されても保持されます。
編集時のインスタンス化
アセットブラウザでシーンまたはプレハブを見つけます。インスタンス化する方法は 2 つあります:
- アセットブラウザからシーンビューポートまたはシーンヒエラルキーパネルにドラッグします。
- 右クリックしてシーンにインスタンス化を選択します。
新しいインスタンスはシーンルートの下に表示され、ルートノードが青色でボックスアイコン付きになります。これはエディターがリンクされたコピーであることを示す方法です。
シーンオブジェクトからプレハブを作成
シーン内の任意のノードを再利用可能なプレハブに変換するには:
- シーンヒエラルキーでノードを右クリックします。
- プレハブを作成を選択します。
- 現在のアセットブラウザフォルダーに
.prefabアセットが書き込まれ、そのオブジェクトがそのプレハブの最初のインスタンスになります。
ヒエラルキーからノードをドラッグしてアセットブラウザにドロップすることもできます。
プレハブの編集
アセットブラウザで .prefab をダブルクリックして編集用に開きます。シーンヒエラルキーにプレハブのツリーが表示されます。変更を加えて保存すると、次にインスタンスを含むシーンが読み込まれたときに、インスタンスに編集内容が反映されます(オーバーライドは保持されます)。
オーバーライド
プレハブがインスタンス化されると、インスタンス上の任意のプロパティ(名前、Transform、コンポーネントフィールド)を調整できます。変更された各プロパティはオーバーライドとして記録され、インスペクター上部のプレハブインスタンスバナーに一覧表示されます。
バナーには 2 つのアクションがあります:
- 元に戻す — このインスタンスのすべてのオーバーライドを破棄し、ソースプレハブに戻します。
- 適用 — インスタンスの現在の値をソースプレハブにプッシュし、他のすべてのインスタンスに反映します(各インスタンスは自身のオーバーライドを保持します)。
ランタイムでのスポーン
ゲームプレイコードは Frame コンテキストを介してリンクされたインスタンスを生成および破棄します:
const engine = @import("engine");
pub const Spawner = struct {
pub const is_component = true;
prefab: engine.TypedAssetRef(.scene) = .{},
pub fn update(self: *@This(), frame: engine.Frame) void {
if (frame.input.wasPressed("fire")) {
frame.instantiate(self.prefab.slice(), .{ .x = 0, .y = 1, .z = 0 }, null);
}
}
};
frame.instantiate(guid, position, rotation)— プレハブの新しいリンクインスタンスをキューに入れます。positionとrotationはルートの Transform に対するオプションのオーバーライドです。frame.destroy(node)— ノードとその子孫の削除をキューに入れます。
どちらも遅延実行されます。現在の更新後に適用されるため、スクリプトはシーンオブジェクトを反復処理中でも反復バグなく生成や破棄を行うことができます。
パフォーマンスとワークフロー
インスタンス化はパフォーマンス最適化ではなく、ワークフローの最適化です。1 つの敵プレハブを作成し、50 のインスタンスをレベルに配置します。後でプレハブのメッシュや体力を調整すると、50 すべてが更新されます。インスタンスのランタイムコストは手動で配置したオブジェクトと同じです。