プレハブ
はじめに
Prefabsは再利用可能なエンティティのコレクションで、そこから複数のコピーを作成することができます。 これらはエクスパンション・ファイル内に保存されるが、好きなように表面化させることができる。 ECSでプレハブを扱うための便利なAPIもある。 スタジオのプレハブには次のような特徴があります:
- プレハブコンポーネントはインスタンス間で共有可能
- 継承されたコンポーネントは、インスタンスごとにオーバーライドできる。
- プレハブインスタンスは他のプレハブのインスタンスを含むことができる
- プレハブはランタイムにアクセス可能で、変更も可能。
プレハブの使用
Studioでは、エンティティの右クリックオプション "Make Prefab "を使用するか、左下のファイルディレクトリのPrefabタブにドラッグすることで、Prefabを素早くセットアップしてカスタマイズできます。 プレハブタブでは、プレハブやそのコンポーネントを簡単に編集したり、階層を更新したり、複製を作成したりすることができます。
プレハブ階層は、エンティティ階層と同じ方法で作成される。 プレハブの詳細を視覚的に確認し、編集したい場合は、プレハブをダブルクリックするか、右クリックしてプレハブエディタを開き、ソースに直接デザイン編集を加えることができます。 ソースに加えられたアップデートは、自動的にシーン内のプレハブの全インスタンスでプレ ビュー可能になります。
あなたのシーンで新しいプレハブを使う準備はできていますか? Prefabをシーンビューポートやスペース階層にドラッグ&ドロップするだけで、Prefabインスタンスを作成できます。 Prefabとそのインスタンスを扱う際に注意すべき2つの重要な概念がある:継承とオーバーライド**です。
継承
エンティティはプレハブからコンポーネントを継承できます。 つまり、あなたのスペースにPrefabインスタンスを追加した後、Prefabソースに加えた変更は自動的にインスタンスに "継承 "される。 継承されたコンポーネントはメモリに一度だけ保存され、インスタンス間で共有される。 これは、マテリアルデータ、テクスチャ、メッシュなど、インスタンス間で共有される静的データに対して有効です。
オーバーライド
インスタンスがPrefabからコンポーネントを継承する場合、インスタンス固有のコンポーネント値でオーバーライドすることができます。 コンポーネント(マテリアル、アニメーション、カスタムコンポーネントスクリプトなど)をオーバーライドするには、インスタンスに追加または変更するだけです。 Prefabインスタンスでコンポーネントをオーバーライドすることで、今後もオーバーライドされたままになります。 つまり、今後Prefabソースで同じコンポーネントに加えた変更は継承されません。
ランタイム・インスタンス
Studioのゲームエンジンでは、最小限のコードで実行時にPrefabsを指示できます。 既存のPrefabをもとに、プログラムでリアルタイムに新しいインスタンスを生成し、実行時にPrefabインスタンスの変更や編集を行うことができます。 また、動的に生成された異なるインスタンスに変更を加える必要がある場合に備えて、実行時にPrefabインスタンスのすべてのサブエンティティを問い合わせることもできる。
プレハブのインスタンス化
プレハブ名または EID を使ってプレハブの新しいインスタンスを作成します。 プレハブ・インスタンスは、他のエンティティと同様に使用することができます。 プレハブ・インスタンスは、インスタレーション開始時にその位置がゼロに設定されます。
プレハブネームの使用
ecs.registerComponent({
name: 'Spawn Prefab by Name',
stateMachine: ({world, eid, schemaAttribute, dataAttribute}) => {
ecs.defineState('default')
.initial()
.listen(eid, ecs.input.SCREEN_TOUCH_START, (e) => {
const newInstance = world.createEntity("Human")
})
},
})
プレハブEIDの使用
ecs.registerComponent({
name: 'Spawn Prefab by EID',
schema: {
prefabToSpawn: ecs.eid,
},
stateMachine: ({world, eid, schemaAttribute, dataAttribute}) => {
ecs.defineState('default')
.initial()
.listen(eid, ecs.input.SCREEN_TOUCH_START, (e) => {
const {prefabToSpawn} = schemaAttribute.get(eid)
if (prefabToSpawn) {
const newInstance = world.createEntity(prefabToSpawn)
}).
},
})