オブジェクトとシーン
プロジェクトはすべてオブジェクトでできていて、そのオブジェクトをいつ表示するかはシーンが決めます。ここでは、オブジェクト、コンポーネント、シーンの関係を説明します。
エディターではオブジェクト、エンジンとスクリプト API ではエンティティと呼びます。このドキュメントでエンティティと書くのは、コードの話をするときだけです。
オブジェクトの中身
オブジェクトには 2 種類のものが入っています。
- コンポーネントは、オブジェクトの設定です。名前、位置、見た目、何に反応するかなど、そのオブジェクトが何なのかを決めます。1 つのオブジェクトに付けられるのは、同じ種類のコンポーネントにつき 1 つだけです。
- 子オブジェクトは、そのオブジェクトの中に置いた別のオブジェクトです。子はそれぞれ自分のコンポーネントを持ちます。
コンポーネントを 4 つ持つランプの例です。
Object "ランプ"
├── Meta 名前、オンかどうか、見えるかどうか
├── Transform 位置、向き、大きさ
├── Model 表示する 3D モデル
└── Events 反応するもの
これはエンジンでの名前です。インスペクターでは、Meta は General と表示されます。
同じランプの中に電球を入れた例です。電球は別のオブジェクトで、自分のコンポーネントを持っています。
Object "ランプ"
└── Object "電球" ← 別のオブジェクト
├── Transform ← 自分のコンポーネントを持つ
└── Light
実際のシーンはこのようになります。名前の後ろにコンポーネントを並べ、子は親の下に字下げして書いています。
Object "リビング" ◆ Anchor ← シーン:アンカーを持っている
│
├── Object "ランプ" ◆ Transform ◆ Model ◆ Events
│ └── Object "電球" ◆ Transform ◆ Light
│
└── Object "テーブル" ◆ Transform ◆ Model ◆ RigidBody ◆ Collider
この図にあるものは、すべてオブジェクトです。シーンになるか、ランプになるか、物理で動く物体になるかは、持っているコンポーネントで決まります。
そのオブジェクト自身の性質なら、コンポーネントを使います。一緒に動かしたい別のものなら、子オブジェクトを使います。
電球はランプの中にあるので、ランプを動かすと電球も動きます。ランプのモデルコンポーネントを外しても、電球は消えません。
コンポーネントでオブジェクトを組み立てる
オブジェクトの種類を一覧から選ぶしくみはありません。必要なコンポーネントを組み合わせてつくります。
| オブジェクトに付けるもの | できるもの |
|---|---|
| ジオメトリとマテリアル | 目に見える形 |
| モデルへの参照 | 読み込んだ 3D モデル |
| ライトコンポーネント | ライト |
| テキストコンポーネント | テキスト |
| リジッドボディとコライダー | 物理で動くもの |
| アンカー | シーン |
| スクリプトかパッチ | 振る舞いを持つもの |
たとえば、弾むボールは次のようにつくります。
- 球のジオメトリとマテリアルを追加します。これでボールが見えるようになります。
- リジッドボディとコライダーを追加します。これでボールが落ちて弾みます。
- スクリプトを追加します。これで着地したときに何かをさせられます。
コンポーネントを 1 つ足すごとに、できることが 1 つ増えます。コンポーネントを外せば、その機能もなくなります。
シーン、オブジェクト、スペース全体のロジック
よく出てくるオブジェクトは 3 種類です。役割は違って見えますが、どれも持っているコンポーネントが違うだけのオブジェクトです。
| 種類 | 持っているもの | 持っていないもの |
|---|---|---|
| シーン | アンカーと子 | トランスフォーム |
| 普通のオブジェクト | トランスフォームと、必要なもの | アンカー |
| スペース全体の振る舞い | スクリプトかパッチ。親はない | トランスフォーム、アンカー |
シーンにトランスフォームがないのは、シーンの位置が、アンカーの対象になっている現実のものから決まるからです。スペース全体の振る舞いにトランスフォームがないのは、ワールドの中に置くものではないからです。動き続けるロジックだけでできています。
1 つのモデルにマテリアルを 3 つ使いたいときは、マテリアルコンポーネントの中のスロットを使います。それ以外のものを 2 つ持たせたいときは、子オブジェクトを使います。電球が 2 つあるランプは、子を 2 つ持つランプのオブジェクトです。
また、どのオブジェクトにも、見つけやすくするための名前があります。親(そのオブジェクトが入っている先のオブジェクト)を持つこともできます。
有効と表示
インスペクターではこの 2 つのスイッチが似て見えますが、働きは違います。
- 無効(Enabled をオフ)にすると、オブジェクトはまったく働かなくなります。描画されず、タップもできません。スクリプトは止まり、イベントも起きません。そのオブジェクトがないのと同じ状態です。
- 非表示(Visible をオフ)にすると、描画とタップが止まるだけです。オブジェクトはそのまま残ります。スクリプトは動き続け、コライダーがあれば物理的な衝突も起きます(何が固体として扱われるかを参照)。
使い分けの例です。
- プレイヤーの行く手をふさぐ見えない壁は、非表示にします。
- あとで現れる景品は、必要になるまで無効にしておきます。
親と子
オブジェクトはツリー状につながっています。親を動かすと、子も親との位置関係を保ったまま一緒に動きます。部品でできたものは、こうしてつくります。車体の中に車輪を 4 つ入れれば、1 台の車として動きます。
子も、その子も削除されます。残したいものがあれば、先にドラッグして外に出してください。
オブジェクトを、自分の中にあるオブジェクトの中に入れることはできません。エディターがこの操作を許可しません。
シーンは、そのツリーのいちばん上にあります。シーンに追加したオブジェクトは、直接、またはほかのオブジェクトの中に入る形で、必ずシーンオブジェクトの中に置かれます。シーン以外で親を持たないオブジェクトは、どのシーンにも属しません。下のスペース全体のロジックで説明するとおり、スペース全体に属します。
シーンとアンカー
シーンは、アンカーを持つオブジェクトです。アンカーは、シーンをいつ表示するかを決めます。
| アンカー | シーンが表示されるタイミング |
|---|---|
image | カメラが印刷された画像を認識したとき |
qr | QR コードを読み取ったとき |
geo | 見る人が特定の場所にいるとき |
face | 顔を検出したとき |
surface | 見る人が床、壁、天井、テーブルの上に置いたとき |
panorama | 360° の環境が開いたとき |
3d | すぐに。AR を使わない普通の 3D シーンです |
VPS は、現実の場所をスキャンしたマップを使ってコンテンツを配置します。独立したアンカーの種類ではありません。surface シーンを設定してから、VPS をオンにしてください。
1 つのマーカーに複数のシーン
同じトリガー(同じ画像、同じ QR コード、同じ場所)を持つシーンは、1 つのグループになります。グループの中で一度に表示されるシーンは 1 つだけです。
これを使うと、物語を順番に見せられます。同じポスターで、最初は第 1 章、あとで第 2 章を開きます。切り替えるのは、グループの中でどのシーンを有効にするかだけです。
エディターは、シーンを表示・非表示にするイベントを 2 つ追加します。on-detect で表示し、on-lost で隠します。普通のイベントなので、自由に変更できます。たとえば、マーカーがカメラの画角から外れても、コンテンツを画面に残せます。見る人にはこのほうが好評なことが多いです。そうしないと、手が少し揺れただけでコンテンツが消えてしまうからです。
surface シーンの設定
surface シーンには、別々の設定が 3 つあります。混同しやすいので注意してください。
- 受け付ける面:床、壁、天井、テーブル。
- コンテンツの置き方:検出した面に自動で置くか、見る人がタップした場所に置くか。
- 使うトラッキングエンジン:関係するのはウェブだけです。ネイティブアプリでは、この設定は効きません。
スペース全体のロジック
振る舞いを持ち、親がないオブジェクトは、どのシーンにも属しません。スペース全体に属します。シーンが表示されたり消えたりしても動き続け、スペース内のすべてのイベントを受け取ります。
スコアのカウンターや、全体をまとめて制御する役、見る人が選んだものの記録などに使います。シーンの中にあるスクリプトは、そのシーンが止まるとすぐに止まります。
エディターでのオブジェクトのラベル
エディターは、model、primitive、text のようなラベルを表示します。ラベルはオブジェクトのコンポーネントから決まります。次の順に確認していきます。
splat reference → splat
model + skinning → animated model
model → static model
video → video ← geometry より先に確認
text → text
audio → audio
light → light
geometry → primitive
それ以外 → object
そのため、動画を再生する平面には primitive ではなく video と表示されます。マテリアルとジオメトリを編集できるのは、primitive と static model のオブジェクトだけです。
次へ: コンポーネント — 各コンポーネントが何を決めるか。