イベント
イベントを使うと、コードを書かずに、人の操作にシーンを反応させられます。何かが起きたとき、オブジェクトは指定しておいた動作を実行します。
WHEN 誰かがドアをタップしたら
THEN 600 ms かけてドアを開ける
「施錠中」の札を無効にする
シグナル「door-open」を送る
WHEN の部分がトリガー、THEN の部分がステップのリストです。1 つのオブジェクトにイベントはいくつでも追加でき、それぞれが独立して動きます。
イベントを追加する
- オブジェクトを選択します。
- インスペクターで + new component をクリックし、Events を選びます。コンポーネントには最初からイベントが 1 つあり、トリガーは Press on the object になっています。
- そのイベントをクリックします。Event settings パネルが開きます。イベントをもう 1 つ追加するには、+ add event をクリックします。
- トリガーを選びます。Press on the object のままでもかまいません。
- + add action をクリックし、ステップを選びます。一覧には検索ボックスがあり、ステップは Actions、Animations、States、Logic に分かれています。
- 同じ方法でステップを追加していきます。ステップは並んだ順に実行されます。
トリガーのリファレンスにはすべてのトリガーが、ステップのリファレンスにはすべてのステップが載っています。どちらも常に最新です。エディターでの名前の隣に、スクリプトで使うコード上の名前も載っています。例えば Send signal は emit_signal、Signal は on-signal です。
トリガー
トリガーは、イベントが始まるきっかけです。各トリガーの設定は、上のリファレンスに載っています。下の表では、それぞれのトリガーの用途を説明します。
ポインターとキー
| エディターでの名前 | 発火するタイミング |
|---|---|
| Press on the object | タップまたはクリックされたとき。クリック、押下、離したときのブランチがあります |
| Hover | カーソルがオブジェクトに乗ったとき、またはオブジェクトから離れたとき |
| Double click | 同じオブジェクトが 300 ms 以内に 2 回クリックされたとき |
| Long press | オブジェクトが動かされずに 450 ms 押し続けられたとき |
| Key | キーが押されたとき、または離されたとき |
| Scroll | ホイールが回されたとき。方向を指定できます |
| Drag | 見る人が自分で配置した AR コンテンツをドラッグしたとき |
| Pinch | 配置した AR コンテンツをピンチして拡大縮小したとき |
| Rotate | 配置した AR コンテンツをひねって回したとき |
Drag、Pinch、Rotate は surface シーンでしか使えません。見る人が配置したコンテンツを操作するトリガーだからです。1 回だけではなく、指が動いている間は何度も発火します。
ライフサイクル
| エディターでの名前 | 発火するタイミング |
|---|---|
| Launch | シーンが始まったとき。すべてのオブジェクトが受け取ります |
| Resize | ウィンドウや画面のサイズが変わったとき |
| Pause | アプリやタブがバックグラウンドに移ったとき |
| Resume | アプリやタブが前面に戻ったとき |
| Visibility | オブジェクトが表示されたとき、または非表示になったとき |
見る人が別のアプリに切り替えても、止めないかぎりサウンドは鳴り続けます。Pause でサウンドを止め(例えば、サウンドをミュートしたステートに切り替えます)、Resume で再開しましょう。
AR トラッキング
| エディターでの名前 | 発火するタイミング |
|---|---|
| Detect | マーカーや平面が見つかったとき |
| Tracking lost | トラッキングが外れたとき |
| Placed | 見る人がコンテンツを配置したとき |
| VPS ready | 位置の特定が始まったとき |
| VPS localized | 見る人の実際の位置がわかったとき |
| VPS localization failed | まだ位置がわかっていないとき |
| VPS error | 位置の特定をまったく実行できなかったとき |
エディターには、シーンのアンカーで起こりうるトリガーだけが表示されます。Detect は毎フレームではなく、トラッキングが始まったときに 1 回だけ発火します。
VPS localization failed は、見る人がマップに登録された場所を探して歩き回っている間、頻繁に発火します。画面に表示するエラーではなく、「引き続き試す」という合図として扱ってください。
時間と距離
| エディターでの名前 | 発火するタイミング |
|---|---|
| Delay | 待ち時間のあとに 1 回 |
| Every N seconds | 何度も繰り返し。繰り返し回数を 0 にすると無制限になります |
| Distance | 何かが指定の距離まで近づいたとき、または離れたとき |
| Variable change | 変数に新しい値が入ったとき |
Distance には At start オプションがあります。シーンが開いた時点で、すでにオブジェクトが近くにあるかもしれない場合はオンにしてください。オフのままだと、イベントは何かが動くまで待ちます。
ステート、衝突、シグナル
| エディターでの名前 | 発火するタイミング |
|---|---|
| State active | このオブジェクトが、選んだステートに入ったとき |
| State inactive | このオブジェクトが、そのステートから出たとき |
| Collision | このオブジェクトが別のオブジェクトに触れたとき。Collide with で相手を絞れます |
| UI action | UI カードのボタンが押されたとき |
| Signal | 別のイベントがシグナルを送ったとき |
| Game controls | キャラクターが立ち止まる、動く、走る、ジャンプするのいずれかを始めたとき |
ブランチ
一部のトリガーにはブランチがあり、1 つのイベントであらゆる結果に対応できます。例えば、1 つの Distance イベントで「近づいた」と「離れた」の両方に対応できます。
| トリガー | ブランチ |
|---|---|
| Distance | On coming closer、On moving away |
| Key | On press、On release |
| Hover | On enter、On leave |
| Press on the object | On click or tap、On press、On release |
| Visibility | On show、On hide |
| Game controls | On idle、On move、On run、On jump |
ブランチごとに、別々のステップのリストがあります。ブランチのないトリガーには、On activation というリストが 1 つだけあります。
ステップが作用するオブジェクトを選ぶ
すべてのステップには Target object フィールドがあります。
- 空のままにすると、ステップはイベントを持つオブジェクト自身に作用します。ふつうはこちらです。
- オブジェクトを選ぶと、ステップは代わりにそのオブジェクトに作用します。1 つのボタンで 3 つのドアを開けるときは、この方法を使います。
タップは親オブジェクトにも届く
タップ、ホバー、カードのアクションは、そのオブジェクトとそのすべての親に届きます。
そのため、グループに 1 つイベントを付けておけば、その中のどれがタップされても受け取れます。40 個のオブジェクトに同じイベントをコピーする必要はありません。
これは次のことも意味します。
- 「このパネルのどこかをタップしたら」は、パネルに付けた 1 つのイベントで作れます。
- 同じ親を持つ 2 つの子の間でカーソルを動かしても、親ではホバーの開始や終了は発火しません。カーソルは親の上から一度も出ていないからです。
一部のトリガーは、届き方が異なります。
- Collision は、触れ合ったオブジェクトでだけ発火します。
- Key、Scroll、Resize、Launch は特定のオブジェクトに関するものではないので、すべてのオブジェクトが受け取ります。
イベント、パッチ、スクリプトは、同じタップ、キー、衝突を受け取ります。いくつかのトリガーは、スクリプトでは別の名前で届きます。ctx APIを参照してください。
同じオブジェクトが、同じトリガーにイベントとスクリプトの両方で反応すると、2 回実行されます。何かが 2 回発火するときは、ほぼ間違いなくこれが原因です。
1 つのイベントに複数のキーを使う
「Space か W でジャンプ」は、2 つではなく 1 つのイベントで作れます。Key フィールドをクリックして、1 つ目のキーを押します。次に or をクリックして、次のキーを押します。必要なだけ追加できます。
- リストのキーは、それぞれが独立しています。Ctrl などの修飾キーは、一緒に押したキーにだけ適用されます。
- Auto-repeat など、トリガーのほかの設定は、リストのすべてのキーに適用されます。
- 同じフィールドでマウスボタンも使えます。その場合、リストにはマウスボタンだけが入ります。
イベントは、これらのキーをテキストとして保存します。アシスタントやスクリプトは、次のように書きます。
ArrowUp ctrl+KeyW KeyA+KeyS Space+double mouse:middle
キーの代わりにキーバインドを使うこともできます。キーバインドは Project settings → Key bindings で設定します。そこで「jump」のキーを 1 回変えれば、「jump」を使うすべてのイベントに反映されます。左利き向けの操作を頼まれたときに便利です。
ステップ
各ステップの設定は、ステップのリファレンスに載っています。
リンク、電話、シーンの切り替え
| エディターでの名前 | 動作 |
|---|---|
| Scene transition | 別のシーンに移動します |
| Space transition | 別のスペースに移動します。シーンを選んでおけば、そのシーンに移動します |
| Open URL | リンクを開きます。今のタブでも新しいタブでも開けます |
| Open messenger | Facebook、VK、OK、Instagram、Telegram、WhatsApp、Viber を開きます |
| Call phone number | 電話をかけます |
| Compose email | メールの作成を始めます |
| File download | プロジェクト内のファイルをダウンロードします |
| Contact download | 入力した項目から作った連絡先カードを保存できるようにします |
Open messenger では、アプリごとに必要な情報が違います。
- Facebook、VK、OK はページ ID
- Instagram、Telegram はユーザー名
- WhatsApp、Viber は電話番号
オブジェクトの表示・非表示と変更
| エディターでの名前 | 動作 |
|---|---|
| Show / hide object | 対象を表示または非表示にします。シーンに使うと、そのシーンがアクティブになります |
| Set state | 保存したステートに切り替えます。長さを設定すると、なめらかに切り替わります |
| Override properties | 一時的なステートのように、いくつかの値を 1 回だけ適用します |
アニメーション
| エディターでの名前 | 動作 |
|---|---|
| Play animation | タイムラインのアニメーションを再生します。ループの種類、繰り返し回数、速度、遅延を設定できます |
| Stop animation | 再生中のアニメーションを止めます |
Play animation は、どのオブジェクトのアニメーションでも開始できます。そのため、1 つのボタンで、複数のものを同時に動かす一連の動きを始められます。
何かを移動させたり、フェードさせたり、色を変えたりするには、Animation パネルでアニメーションをつくり、このステップで再生します。1 回だけの変化なら、長さを設定した Set state で十分です。
以前につくったプロジェクトには、Transformation、Opacity、Material、Bone transform、Built-in animation の各ステップが残っていることもあります。これらはそのプロジェクトでは引き続き動きますが、エディターではもう選べません。例えば Material は、対象の色、不透明度、発光、表面の設定を保存したマテリアルに近づけるようにブレンドし、各スロットの種類とテクスチャはそのまま保ちます。
移動
| エディターでの名前 | 動作 |
|---|---|
| Follow object | 別のオブジェクトを追いかけ続けます。距離、オフセット、スムージング、速度を設定できます |
| Look at object | 移動せずに、何かのほうを向きます |
| Stop following | 追いかけるのも、向くのもやめます |
| Fly along path | パスに沿って移動します |
| Stop path flight | パスに沿った移動を止めます |
ロジック
| エディターでの名前 | 動作 |
|---|---|
| If — otherwise | 条件を調べ、2 つのステップのリストのどちらかを実行します |
| Set variable | 変数に値を設定する、値を加える、または値を切り替えます |
| Send signal | 選んだオブジェクト、またはシーン全体にシグナルを送ります |
| Wait, then | 待ってから、中にあるステップを実行します |
ポインター
Lock pointer はマウスカーソルを隠し、マウスの動きをシーンで使えるようにします。一人称視点のゲームでは、カーソルがウィンドウの外に出ないように、これが必要です。Release pointer でカーソルが元に戻ります。
プラグインのトリガーとステップ
プロジェクトに追加したプラグインは、独自のトリガーとステップを持ち込めます。これらはリストの中でプラグインの名前の下に表示され、組み込みのものと同じように使えます。
- 表示されるのは、そのプラグインが追加されているプロジェクトだけです。
- プラグインのトリガーには、設定があることがあります。その場合、イベントは設定が一致したときだけ実行されます。毎回反応させるには、設定を空のままにします。
- プラグインがプロジェクトから外されると、そのトリガーは発生しなくなり、ステップはスキップされます。
自分でつくるには、ランタイムコードを参照してください。
条件を追加する
条件もステップの 1 つで、If — otherwise を使います。入れ子にすると、3 つ以上の分岐を作れます。
Condition フィールドで、何を調べるかを選びます。
| エディターでの名前 | 調べるもの | 入力するフィールド |
|---|---|---|
| Always | 何も調べません。常に真です | — |
| Variable | 変数の値 | Variable、Compare、Value |
| Distance | このイベントのオブジェクトと、別のオブジェクトの距離 | Object、Compare、Threshold |
| State | 別のオブジェクトが今どのステートにあるか | Object、State |
| Visibility | 何かが表示されているかどうか | Object、Expected |
| Chance | ランダムな確率 | Threshold(パーセントで指定) |
値は次のように比較されます。
3は数値、trueは真偽値(はい/いいえ)、それ以外はテキストとして読み取られます。==と!=は、完全に一致するかどうかを調べます。>、>=、<、<=は数値を比較します。
変数、シグナル、タイマー
変数は、1 回の訪問の間だけ保たれます。誰かがプロジェクトを開くたびに、空の状態から始まります。初期値を持たせたいときは、Launch トリガーのイベントで設定してください。スクリプトからは、同じ変数がグローバル変数として見えます。
シグナルを使うと、ステップをコピーしなくても、1 つのイベントからほかのイベントを開始できます。例えば、複数のイベントが level-complete を待ち受けていれば、どのイベントからでもそれを送れます。シグナルが自分自身を送り続けると、シーンが固まらないように 8 回で止まります。
タイマー(Delay と Every N seconds)は、オブジェクトがオンになると動き出し、オフになるとリセットされます。オブジェクトがもう一度オンになると、カウントは最初からやり直しです。取りこぼした回の分が、まとめて発火することはありません。
ステート
ステートは、オブジェクトの見た目を保存したものです。位置、色、表示・非表示などが含まれます。Set state ステップで、そのステートに切り替えます。長さを設定すると、なめらかに変化します。
スイッチ、ハイライト、開いた状態と閉じた状態を持つドアなどに使いましょう。
オブジェクトのステートのどれかを選択していると、オブジェクトへの変更はそのステートを変えます。ステートを作っているときは、これが望ましい動きです。ステートを選択したままなのを忘れていると、混乱のもとになります。
詳しくはステートを参照してください。
再トラッキング
AR シーンでは、イベントごとに再トラッキングのモードがあります。マーカーを見失い、もう一度見つけたときにどうするかを決めます。
- すぐにステップを最初からやり直す
- 二度と開始しない
- 実行中のステップが終わってから、もう一度開始する
次へ: アニメーション — ものを動かします。