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

読み込みと起動画面

来場者が待つのは最初の一度だけです。その一度で何を待たせるかはあなたの選択であり、体験を 開いたときの印象を左右する、いちばん大きなレバーです。

アセットの届きかたは 3 通り

何が起きるか向いているもの
preloadシーンが開く前に取得します。起動画面がそれを待ちます最初の数秒で見えるものすべて
deferそれを待たずにシーンが開き、届いたら現れます体験の後半で使うコンテンツ
streamネットワークから直接再生し、全体を取得しません動画と音声
defer は stream とは違います

全部届く前に再生を始められるのは、動画と音声だけです。モデル・テクスチャ・フォントは、 使えるようになる前にすべて届いている必要があります。defer にするというのは、シーンが待たずに 開き、準備ができたときにそのアセットが現れる、という意味にすぎません。

プロジェクトの既定と、アセットごとの上書き

プロジェクトの設定 Preload がすべての既定になります。アセットごとに上書きできます。

アセットの指定結果
preload onプロジェクトの設定にかかわらず必ず待ちます
preload off必ず後回しになります
inheritプロジェクトに従います

新しいアセットの初期値は妥当です。動画と音声は既定で stream(シーンを開く前に動画を丸ごと 待っても得るものがないため)、それ以外はプロジェクトに従います。

決めるのはアセット側で、それを使うオブジェクト側ではありません

1 つのファイルを共有する 2 つのオブジェクトが、読み込みかたで食い違うことはもうありません。 ファイルに対して 1 回設定するだけです。

実用的なレシピ

たいていのプロジェクトでは、こうします。

  1. 最初のシーンのモデル、そのテクスチャ、すぐ表示するフォントを preload
  2. 後のシーンに属するものはすべて defer
  3. 動画と音声はすべて stream(すでに既定です)

結果として、短い待ち時間のあと、二度と詰まらない体験になります。

起動画面

世界ができる前に、画面が 2 つ現れることがあります。来場者がタップして始める画面と、 アセットが届くにつれて埋まっていく画面です。

どちらもプロジェクト設定で構成します。背景、ロゴ、開始ボタンとそのラベル、オンボーディングの 案内、ローダーの見た目です。

音が少しでもあるなら、開始ボタンは残してください

ブラウザーは、来場者がページを操作するまで音声を再生しません。AR の権限も同じで、要求した その同じタップの中でしか許可されません。押すボタンがないと、最初の音は黙って鳴らず、カメラの 許可ダイアログも出ないままになることがあります。

自作のものに差し替える

組み込みの画面はプリセットです。自分のものが必要なら、起動スクリプトが 2 つの画面を完全に 引き受けます。しかも珍しいことに、その script は自分の設定パネルまで宣言するので、使う人は コードではなく入力欄を受け取ります。

init((ctx: PreloadContext) => {
// パネルの宣言。描画の前に走ります。宣言だけを行い、描いてはいけません。
ctx.on('describe', (p) => {
p.section('look', { en: 'Look' });
p.color('tint', { label: { en: 'Background' }, default: '#101014', section: 'look' });
p.text('caption', { label: { en: 'Caption' }, default: '', localized: true, section: 'look' });
p.boolean('hideWhenReady', { label: { en: 'Hide when ready' }, default: true });
});

ctx.on('launch', () => {
/* 来場者がタップして始める画面 */
});

ctx.on('loading', () => {
/* 埋まっていく画面 */
});

ctx.on('progress', ({ loaded, total, percent }) => {
/* 自前のバーを更新する */
});

ctx.on('ready', () => {
/* すべて届いた */
});
});
イベント発火するタイミング
describeパネルが構築されるとき。ランタイムでもエディターでも同じです
startランタイムが起動しはじめたとき
launchタップしてもらう画面を出すとき
loading埋まっていく画面を出すとき
progressアセットが届いているとき。loadedtotalpercent
ready必要なものがすべて届いたとき
error何かがうまくいかなかったとき

パラメーターは多言語化できるので、1 つの起動スクリプトでプロジェクトのすべての言語に対応できます。

シーンの開始はタップの中から呼ぶこと

開始のきっかけが何であれ、ボタン自身のクリックハンドラーの中から呼ばなければなりません。 端末の向きやカメラといった権限は、要求したジェスチャーの中でしか許可されず、次のフレームに 持ち越した開始はその権利を失います。

壊れた起動スクリプトが来場者を締め出すことはありません

例外が投げられた場合、ランタイムはプリセットを捨て、組み込みの画面を表示します。

待たないもの

物理は、シーンが必要としないかぎりそもそもダウンロードされません。インスタンス化された オブジェクトやパーティクルの配置は、転送ではなく生成されます。どちらも このエンジンを選ぶ理由で扱っています。 「必要でないもののために人を待たせない」という同じ考えの一部です。


次へ: 共有パッケージ