メインコンテンツまでスキップ

オブジェクトとシーン

プロジェクトのすべては 2 つの考えかたでできています。component からできた「もの」と、それが いつ現れるかを決めるシーンです。このページでは両方を扱います。

「オブジェクト」と「entity」は同じものです

エディターはオブジェクトと呼びます。画面でそう見えるからです。エンジンと 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 つの entity に同じ型の component は 1 つ

1 つのモデルにマテリアルを 3 つ使いたい? そのモデルの唯一のマテリアル component にある スロットを使ってください。それ以外のものを 2 つ欲しいときは、子の entity を使います。 電球 2 つのランプは、子を 2 つ持つランプの entity です。

すべての entity には名前(探すときの手がかり)ともあります。

「有効」と「可視」は別物

インスペクターでは似て見えますが、ふるまいはまったく違います。

無効は、entity を動いている体験から取り除きます。描かれず、タップもできず、script は止まり、 イベントも黙ります。そこにないのと同じです。

不可視は、描画とタップを止めるだけです。entity はそこにあり続けます。script は動き続け、 物理も衝突し続けます。

つまり、プレイヤーがぶつかる見えない壁なら不可視。あとから出てくるごほうびなら、必要になるまで 無効です。

親と子

entity はツリーを作ります。親を動かせば子も付いてきて、親に対する相対位置を保ちます。部品からなる ものはすべてこうして組み立てます。車体に 4 つの車輪を親子付けすれば、1 台の車として動きます。

親を持たない entity は、そのシーンのルートに置かれます。

オブジェクトを削除すると中身もすべて消えます

子も、その子も一緒です。残したいものがあれば、先に外へドラッグしてください。

自分の子孫の子に entity を入れることはできません。ツリーを絡ませる代わりに、エディターが拒否します。

シーンとアンカー

シーンとは、アンカーを持つ entity のことで、アンカーは 1 つの問いに答えます。 これはいつ現れるべきか?

アンカーシーンが現れるのは…
imageカメラが印刷された絵を認識したとき
qrQR コードを読み取ったとき
geo来場者がその場所にいるとき
face顔を検出したとき
surface来場者が床・壁・天井・テーブルに置いたとき
panorama360° の環境を開いたとき
3dすぐに。AR を使わない、ふつうの 3D シーン
VPS は独立したアンカーではありません

スキャンした実在の場所に対して位置を合わせるのは、surface アンカーのオプションであって、 別の種類ではありません。surface のシーンを用意してから、VPS をオンにします。

1 つのマーカーに複数のシーン

同じトリガー(同じ絵、同じ QR コード、同じ場所)を共有するシーンはグループになり、 そのグループから同時に表示されるのは 1 つだけです。

物語が成り立つのはこの仕組みです。同じポスターが、今日は第 1 章を開き、あとで第 2 章を開く。 グループのどのシーンをアクティブにするかを切り替えたからです。

検出したときの表示・非表示は、エディターが用意してくれるイベントのペアにすぎません (on-detect で表示、on-lost で非表示)。ふつうのイベントなので、変更できます。たとえば マーカーが画角から外れてもコンテンツを残す、といったように。手が少し揺れただけで消えるより、 来場者はたいていそちらを好みます。

surface のシーンには独立した設定が 3 つあります

よく混同されるので、並べて挙げます。

  • どの面を受け入れるか — 床・壁・天井・テーブル
  • コンテンツをどう置くか — 検出した面に自動で置くか、来場者がタップした場所に置くか
  • どのトラッキングエンジンを使うか — これはウェブでのみ関係します。ネイティブアプリは常に プラットフォーム自身のものを使います

シーンより長生きする挙動

entity に挙動を与え、親を持たせないと、その entity はどの 1 つのシーンにも属さなくなり、 space 全体のものになります。シーンが入れ替わっても動き続け、どこで起きたイベントも聞き取ります。

スコアのカウンター、全体のコントローラー、「来場者が何を選んだかを覚えておく」といったものの 居場所はそこです。シーンの中の script は、そのシーンが終わった瞬間に止まります。

エディターはオブジェクトをどう分類しているか

modelprimitivetext といったラベルを目にします。エディターは、オブジェクトが何を持って いるかを次の順で調べて判断します。

splat への参照                → splat
model + スキニング → animated model
model → static model
video → video ← ジオメトリより先に判定される
text → text
audio → audio
light → light
geometry → primitive
それ以外 → object

ここから、ちょっとした驚きの理由が分かります。動画を再生している平面は primitive ではなく video と表示されます。マテリアルとジオメトリを編集できるのが primitive と静的モデルだけである 理由も、これで説明がつきます。


次へ: コンポーネント — それぞれが実際に何を 制御しているか。