イベント
イベントは一文です。これが起きたら、これらを行う。
とき 誰かがドアをタップしたら
ならば きしむ音を鳴らす
600 ms かけて開く
「施錠中」の札を無効にする
ときがトリガー、ならばがステップの並びです。考えかたはこれだけで、プロジェクトに 必要なことの驚くほど多くをこれで賄えます。
1 つのオブジェクトはイベントをいくつでも持てて、それぞれが独立して動きます。
すべてのトリガーと、その用途
生成されたトリガーのリファレンスには、それぞれのパラメーターが 載っています。ここでは、それらが何を意味するのかと、人が驚きがちな点を説明します。
入力
| エディターでの名前 | 発火するとき |
|---|---|
| Mouse button | タップやクリック。クリック・押下・解放のブランチがあります |
| Hover | カーソルがオブジェクトに入る、または出る |
| Double click | 同じオブジェクトを 300 ms 以内に 2 回クリック |
| Long press | 動かさずに 450 ms 押し続ける |
| Key | キー。押下と解放のブランチがあります |
| Scroll | ホイールが回る。方向で絞り込めます |
| Drag | 配置済みの AR コンテンツをドラッグ |
| Pinch | 配置済みの AR コンテンツをピンチで拡大縮小 |
| Rotate | 配置済みの AR コンテンツをひねる |
ジェスチャー系の 3 つは surface のシーンにしか存在しません。来場者が置いたコンテンツについての ものだからです。指が動いている間じゅう連続して発火するので、単発の瞬間ではなく流れとして扱って ください。
ライフサイクル
| エディターでの名前 | 発火するとき |
|---|---|
| Launch | シーンが始まる。すべてのオブジェクトに届きます |
| Resize | ウィンドウやビューポートのサイズが変わる |
| Pause | アプリやタブがバックグラウンドへ |
| Resume | 戻ってくる |
on-pause は、行儀よく止めるための場所です来場者がアプリを切り替えても、止めないかぎり音は鳴り続けます。on-pause で音とタイマーを止め、
on-resume で戻す。人が気づく、ささやかな心づかいです。
トラッキング
| エディターでの名前 | 発火するとき |
|---|---|
| Detect | マーカーや面が見つかった |
| Tracking lost | トラッキングを見失った |
| Placed | 来場者がコンテンツを置いた |
| VPS ready | 位置合わせが始まった |
| VPS localized | 来場者の実際の位置が分かった |
| VPS localization failed | 分からなかった。これは正常で、エラーではありません |
| VPS error | 位置合わせがそもそも動かせなかった |
それぞれ、アンカーがそれを生み得るシーンでのみ提示されます。検出は毎フレームではなく、 トラッキングが始まる立ち上がりで報告されます。
on-vps-not-localized は、来場者がマップの認識できる場所を探して歩き回っている間、ごく普通に
発火します。「引き続き試して」という意味に扱い、告知すべき失敗とはしないでください。
時間と近さ
| エディターでの名前 | 発火するとき |
|---|---|
| Delay | 遅延のあと、一度だけ |
| Every N seconds | 繰り返し。回数 0 は無限を意味します |
| Distance | 何かが一定距離に入る、または離れる。ブランチは 2 つ |
| Visibility | オブジェクトが表示された、または隠された |
| Variable change | 変数の値が変わった |
on-distance には「開始時にも判定する」オプションがあります。これがないと、シーンを開いた時点で
すでに近くにあるオブジェクトは、何かが動くまで発火しません。
state・物理・UI
| エディターでの名前 | 発火するとき |
|---|---|
| State active | このオブジェクトが、指定した state に入った |
| State inactive | その state から出た |
| Collision | このオブジェクトが別のものに触れた。特定の相手だけに絞れます |
| UI action | UI カードのボタンが押された |
| Signal | 別のイベントがシグナルを送った |
| Game controls | キャラクターの状態が変わった |
1 つのイベントで、両方向
いくつかのトリガーにはブランチがあり、1 つのイベントですべての結末を扱えます。距離を一度 決めれば、近づいたときと離れたときの両方に答えられます。
| トリガー | ブランチ |
|---|---|
| Distance | 入った · 出た |
| Key | 押された · 離された |
| Hover | 入った · 出た |
| Mouse | クリック · 押下 · 解放 |
| Visibility | 表示 · 非表示 |
| Game control | 待機 · 移動 · ジャンプ · 走行 |
エディターでは、ブランチごとにセクションが 1 つずつ出ます。ブランチのないトリガーは 「発動時」という単一のセクションになります。
ステップがどのオブジェクトに効くか
どのステップにもターゲットがあります。
空のままなら、イベントが載っているオブジェクトに効きます。これがふつうです。指定すれば、そちらの オブジェクトに効きます。ボタンの 1 つのイベントで 3 つのドアを開けられるのは、これのおかげです。
タップは親へと上っていきます
タップ・ホバー・カードのアクションは、そのオブジェクトと、その親に届きます。
これで繰り返しがかなり減ります。グループに 1 つイベントを付ければ、その中のすべてへのタップを 拾えます。同じイベントを 40 個のオブジェクトにコピーせずに済みます。
うれしい副作用が 2 つあります。
- 「このパネル内のどこをタップしても」は、パネルに置いた 1 つのイベントで済みます
- 同じ親の子から子へ移っても、親では hover/blur が発火しません。実際には親から出ていない からです
衝突は例外で、起きた場所でしか発火しません。また、キーボード・スクロール・リサイズ・シーン開始は 特定のオブジェクトの話ではないので、すべてに届きます。
1 つのイベントに複数のキー
Space または W でジャンプ、は 2 つのコピーではなく 1 つのイベントです。最初の組み合わせは トリガーの中にあり、残りは「or」のリストにテキストで書きます。
ArrowUp ctrl+KeyW KeyA+KeyS Space+double
修飾キーは、それが書かれた組み合わせに属します。そして代替の指定は割り当てに追加されるのではなく、
置き換えます。マウスのボタンも同じ書式です(mouse:middle)。
さらによいのは、キーではなくプロジェクトの割り当てを指定することです。プロジェクト設定で 「ジャンプ」を一度付け替えれば、それを参照するすべてのイベントが一緒に移ります。左利き用の操作を 頼まれた日に欲しくなるのは、まさにこれです。
すべてのステップと、その働き
パラメーターは、生成されたステップのリファレンスにあります。
画面遷移と外の世界
| エディターでの名前 | はたらき |
|---|---|
| Scene transition | 別のシーンへ移動する |
| Space transition | 別の space へ移動する。特定のシーンも指定できます |
| Open URL | リンクを開く。このタブでも新しいタブでも |
| Open messenger | Facebook・VK・OK・Instagram・Telegram・WhatsApp・Viber |
| Call phone number | 電話をかける |
| Compose email | メールを書き始める |
| File download | プロジェクトのファイルをダウンロードする |
| Contact download | 入力した項目から作った連絡先カードを渡す |
メッセンジャーのステップは、Facebook・VK・OK にはページの id、Instagram と Telegram にはユーザー名、 WhatsApp と Viber には電話番号を取ります。
シーンを変える
| エディターでの名前 | はたらき |
|---|---|
| Show / hide object | ターゲットを表示・非表示にする。シーンに対してはアクティブ化になります |
| Set state | 名前の付いた state に切り替える。時間を指定すればなめらかに |
| Override properties | その場かぎりの値の組を、一時的な state として適用する |
アニメーション
| エディターでの名前 | はたらき |
|---|---|
| Play animation | タイムラインのプリセットを再生。ループ・回数・速度・遅延を指定 |
| Stop animation | それを止める |
| Transformation | 時間をかけて移動・回転・スケール |
| Opacity | フェード |
| Material | ターゲットのマテリアルを、保存済みマテリアルへ寄せる |
| Bone transform | 1 本のボーンを動かす |
| Built-in animation | モデルに付いてきたクリップを再生する |
Play animation は、イベントが載っているオブジェクトだけでなく、どのオブジェクトの アニメーションでも開始できます。1 つのボタンで複数のものが同時に動く演出は、これで作ります。
移動
| エディターでの名前 | はたらき |
|---|---|
| Follow object | 継続的に追従する。距離・オフセット・スムージング・速度を指定 |
| Look at object | 動かずに、何かのほうを向く |
| Stop following | 上の 2 つを止める |
| Fly along path | パスに沿って進む |
| Stop path flight | それを止める |
ロジック
| エディターでの名前 | はたらき |
|---|---|
| If — otherwise | 条件を判定し、入れ子の 2 本のステップリストのどちらかを実行 |
| Set variable | 変数を設定・加算・反転する |
| Send signal | シグナルを送る。ターゲットへ、または全員へ |
| Wait, then | 待ってから、中に入れ子にしたステップを実行する |
ポインター
Lock pointer と Release pointer は、マウスカーソルを隠し、その動きをシーンへ渡します。 一人称視点のゲームで、ポインターがウィンドウの外へ出ていかないようにするために必要なものです。
条件
if_action はイベントのプロパティではなくステップです。だから条件は入れ子にでき、「if の中の
if」で 3 つ以上の結末を作れます。
条件が何を見るかは、そのソースが決めます。
| ソース | 判定するもの | 使うもの |
|---|---|---|
always | 何も見ない。常に真 | — |
variable | 変数の値 | 変数・演算子・値 |
distance | イベントのオブジェクトと別のものとの距離 | ターゲット・演算子・しきい値 |
state | 別のオブジェクトがどの state にいるか | ターゲット・state |
visible | 何かが見えているかどうか | ターゲット・フラグ |
random | 確率 | しきい値(パーセント) |
値はゆるく解釈されます。3 は数値、true は真偽値になり、それ以外は文字列のままです。== と
!= は厳密に比較し、ほかの演算子は数値として比較します。
変数・シグナル・タイマー
変数が生きるのは訪問の間で、プロジェクト全体ではありません。誰かがあなたの体験を開くたびに、 空の状態から始まります。初期値は、シーン起動時のイベントから入れてください。これは script が globals として見るのと同じ変数です。
シグナル(emit_signal → on-signal)は、ステップをコピーせずにイベントをつなぎます。
複数のイベントが level-complete を聞き、どこからでもそれを送れます。自分自身を再送するシグナルは、
フレームを固めるのではなく 8 巡で止まります。
タイマーは、対象のオブジェクトが有効になったときに開始し、無効化でリセットされます。再び 有効にすると、取りこぼした分をまとめて発火するのではなく、カウントをやり直します。
States
state は、オブジェクトの設定に名前を付けたスナップショットです。位置、色、可視性、何でも かまいません。state に切り替えるとスナップショットが適用され、時間を指定して切り替えると なめらかに変化します。
スイッチ、ハイライト、開いた/閉じたドアは、手でアニメーションを付けずに state で作るのが いちばんすっきりします。
state がアクティブなままオブジェクトを変更すると、編集しているのはその state のスナップ ショットで、オブジェクトではありません。state を作っているときはこれが正解ですが、選ばれている ことに気づいていないと、たいへん混乱します。
再トラッキング
AR シーンでは、イベントごとの再トラッキング設定が、マーカーを見失って再び見つけたときの ふるまいを決めます。すぐに最初からやり直す、二度と再開しない、いま動いているステップが 終わってから再開する、のいずれかです。
script も書く場合は
イベント・patch・script は語彙を共有しています。同じタップが 3 つとも届きます。
同じオブジェクトの同じトリガーを、イベントと script の両方に配線すると 2 回実行されます。 二重に発火するときの原因は、ほぼ必ずこれです。
次へ: アニメーション — ものを動かす。