オブジェクトとシーン
プロジェクトのすべては 2 つの考えかたでできています。component からできた「もの」と、それが いつ現れるかを決めるシーンです。このページでは両方を扱います。
エディターはオブジェクトと呼びます。画面でそう見えるからです。エンジンと script API は entity と呼びます。違いはありません。このページでは、component との区別が問題になる場所で entity、それ以外ではオブジェクトと書きます。
2 つの関係があり、それは別物です
このエンジンについての誤解はほとんど、どちらも「中に入っている」ように見える 2 つのことを 混同するところから生まれます。
entity は component で「できて」います。 component は子ではなく、その entity が何であるかを 決める部品です。同じ種類は最大 1 つまでです。
Entity "ランプ"
├── Meta 名前、有効かどうか、見えるかどうか
├── Transform どこにあるか、どう回っているか、どの大きさか
├── Model どの 3D モデルを描くか
└── Events 何に反応するか
entity はほかの entity を「含む」ことができます。 それが子で、子もまた一人前の entity です。 それぞれが自分の component を持ちます。
Entity "ランプ"
└── Entity "電球" ← 別の entity で…
├── Transform ← …自分の component を持つ
└── Light
合わせると、実際のシーンはこう見えます。各 entity の左に component、その下に字下げして子が 並びます。
Entity "リビング" ◆ Anchor ← これが「シーン」。アンカーを持つ
│
├── Entity "ランプ" ◆ Transform ◆ Model ◆ Events
│ └── Entity "電球" ◆ Transform ◆ Light
│
└── Entity "テーブル" ◆ Transform ◆ Model ◆ RigidBody ◆ Collider
この図にあるものはすべて同じ種類のもの、entity です。あるものをシーンに、あるものをランプに、 あるものを物理ボディにしているのは、持っている component だけです。
ランプを動かせば電球も動きます。電球はランプの中にあるからです。ランプから model component を 外しても、電球は消えません。それは合成であって、内包ではないからです。
「これは component にすべきか、子オブジェクトにすべきか」と迷ったら、こう考えてください。 そのものの一側面なら component、一緒に動くべき別のものなら子です。
entity は、その component が語るとおりのもの
選ぶべき「オブジェクトの種類」のメニューはありません。必要なものは component の組み合わせで 作ります。
| entity に与えるもの | 得られるもの |
|---|---|
| ジオメトリ+マテリアル | 目に見える形 |
| モデルへの参照 | 読み込んだ 3D モデル |
| light component | ライト |
| text component | 文字 |
| rigid body+collider | 物理が動かせるもの |
| アンカー | シーン |
| script または patch | 挙動を持つもの |
跳ねるボールが欲しいとしましょう。球のジオメトリとマテリアルから始めれば、まず見えます。 rigid body と collider を足すと落ちて跳ねます。script を足すと、着地したときに何かをします。 component は 1 つにつき 1 つの能力を足し、外せばその能力もなくなります。
出会う 3 つのかたち
同じ entity という仕組みから、感じの違う 3 つのものが生まれます。中身は同じです。
| 何か | 持つもの | 持たないもの |
|---|---|---|
| シーン | アンカーと子 | transform |
| ふつうのオブジェクト | transform と、必要なもの | アンカー |
| space レベルの挙動 | script か patch、そして親を持たない | transform、アンカー |
シーンに transform がないのは、どこかに「ある」必要がないからです。位置は、それが結び付いている 現実のものが決めます。space レベルの担い手に transform がないのは、そもそも世界の中にいないから です。動き続けるロジックがあるだけです。
1 つのモデルにマテリアルを 3 つ使いたい? そのモデルの唯一のマテリアル component にある スロットを使ってください。それ以外のものを 2 つ欲しいときは、子の entity を使います。 電球 2 つのランプは、子を 2 つ持つランプの entity です。
すべての entity には名前(探すときの手がかり)と親もあります。
「有効」と「可視」は別物
インスペクターでは似て見えますが、ふるまいはまったく違います。
無効は、entity を動いている体験から取り除きます。描かれず、タップもできず、script は止まり、 イベントも黙ります。そこにないのと同じです。
不可視は、描画とタップを止めるだけです。entity はそこにあり続けます。script は動き続け、 物理も衝突し続けます。
つまり、プレイヤーがぶつかる見えない壁なら不可視。あとから出てくるごほうびなら、必要になるまで 無効です。
親と子
entity はツリーを作ります。親を動かせば子も付いてきて、親に対する相対位置を保ちます。部品からなる ものはすべてこうして組み立てます。車体に 4 つの車輪を親子付けすれば、1 台の車として動きます。
親を持たない entity は、そのシーンのルートに置かれます。
子も、その子も一緒です。残したいものがあれば、先に外へドラッグしてください。
自分の子孫の子に entity を入れることはできません。ツリーを絡ませる代わりに、エディターが拒否します。
シーンとアンカー
シーンとは、アンカーを持つ entity のことで、アンカーは 1 つの問いに答えます。 これはいつ現れるべきか?
| アンカー | シーンが現れるのは… |
|---|---|
image | カメラが印刷された絵を認識したとき |
qr | QR コードを読み取ったとき |
geo | 来場者がその場所にいるとき |
face | 顔を検出したとき |
surface | 来場者が床・壁・天井・テーブルに置いたとき |
panorama | 360° の環境を開いたとき |
3d | すぐに。AR を使わない、ふつうの 3D シーン |
スキャンした実在の場所に対して位置を合わせるのは、surface アンカーのオプションであって、 別の種類ではありません。surface のシーンを用意してから、VPS をオンにします。
1 つのマーカーに複数のシーン
同じトリガー(同じ絵、同じ QR コード、同じ場所)を共有するシーンはグループになり、 そのグループから同時に表示されるのは 1 つだけです。
物語が成り立つのはこの仕組みです。同じポスターが、今日は第 1 章を開き、あとで第 2 章を開く。 グループのどのシーンをアクティブにするかを切り替えたからです。
検出したときの表示・非表示は、エディターが用意してくれるイベントのペアにすぎません
(on-detect で表示、on-lost で非表示)。ふつうのイベントなので、変更できます。たとえば
マーカーが画角から外れてもコンテンツを残す、といったように。手が少し揺れただけで消えるより、
来場者はたいていそちらを好みます。
surface のシーンには独立した設定が 3 つあります
よく混同されるので、並べて挙げます。
- どの面を受け入れるか — 床・壁・天井・テーブル
- コンテンツをどう置くか — 検出した面に自動で置くか、来場者がタップした場所に置くか
- どのトラッキングエンジンを使うか — これはウェブでのみ関係します。ネイティブアプリは常に プラットフォーム自身のものを使います
シーンより長生きする挙動
entity に挙動を与え、親を持たせないと、その entity はどの 1 つのシーンにも属さなくなり、 space 全体のものになります。シーンが入れ替わっても動き続け、どこで起きたイベントも聞き取ります。
スコアのカウンター、全体のコントローラー、「来場者が何を選んだかを覚えておく」といったものの 居場所はそこです。シーンの中の script は、そのシーンが終わった瞬間に止まります。
エディターはオブジェクトをどう分類しているか
model・primitive・text といったラベルを目にします。エディターは、オブジェクトが何を持って いるかを次の順で調べて判断します。
splat への参照 → splat
model + スキニング → animated model
model → static model
video → video ← ジオメトリより先に判定される
text → text
audio → audio
light → light
geometry → primitive
それ以外 → object
ここから、ちょっとした驚きの理由が分かります。動画を再生している平面は primitive ではなく video と表示されます。マテリアルとジオメトリを編集できるのが primitive と静的モデルだけである 理由も、これで説明がつきます。
次へ: コンポーネント — それぞれが実際に何を 制御しているか。