script はどこに置くか
同じ script でも、どこに付けるかでふるまいが変わります。どの階層に置くかは、たいていコードそのもの より重要です。
| 付ける先 | 動いている条件 | 終わるとき |
|---|---|---|
| オブジェクト | そのオブジェクトが画面にある間 | 隠された・無効になった・削除された |
| シーン | そのシーンがアクティブな間 | そのシーンを離れたとき |
| space | 来場者がその space にいる間 | 別の space へ移ったとき |
| プロジェクト | 常に、どの space でも | 来場者が去ったとき |
オブジェクトに付ける
既定であり、あるモノに属する挙動には正解です。開くドア、追ってくる敵、反応するボタン。
ctx.entity はそのオブジェクトで、オブジェクトが終わる瞬間に script も止まります。これは利点です。
もう存在しないオブジェクトの script の後始末をする必要がありません。
シーンに付ける
シーンの Scripts セクションで追加します。シーン全体に関わるロジックに使ってください。導入の 段取り、集めるものがあと何個残っているかの集計、来場者が先へ進んでよいかの判断など。
シーンがアクティブになると始まり、シーンが終わると止まります。AR プロジェクトなら、検出した 時点で始まるということです。
space に付ける
space の Scripts セクションで追加します。これはシーンの切り替えを生き延びます。それこそが 要点です。3 つのシーンをまたいで持ち越すスコア、訪問全体のタイマー、次のシーンを決めるコントローラー。
挙動を持ち、親を持たない entity は、どのシーンにも属しません。シーンが入れ替わっても動き続け、 宛先のあるイベントはいずれそこへ届きます。経路はオブジェクト、次にシーン、そして space です。
プロジェクトに付ける
プロジェクト設定で追加します。すべての space に差し込まれるので、来場者がどこへ行っても そこにあります。
space の切り替えを越えて残す必要があるものに使ってください。来場者の選択、全体の進捗カウンター、 アナリティクスなど。
何が何を生き延びるか
| 置き場所 | シーン切り替え | space 切り替え | リロード |
|---|---|---|---|
init の中の変数 | script が生きていれば | script が生きていれば | いいえ |
ctx.store | はい | いいえ | いいえ |
| global | はい | はい | いいえ |
@space: の global | はい | いいえ(意図的に分離) | いいえ |
store も global も、何も残りません。次に来たときにも必要な値なら、来場者がまだページにいる間に、
自分の手元へ送っておいてください。
選びかたは、1 つの問いで
このロジックが扱っている、いちばん小さな対象は何か?
- 1 つのオブジェクトのこと → オブジェクトに置く
- このシーンのこと → シーンに置く
- 訪問全体のこと → space に置く。space が複数あるならプロジェクトに置く
「安全のために」何でもプロジェクト階層に置くやりかたは、しばらく動いて、やがて動かなくなります。 プロジェクトの script は特定のシーンが読み込まれていることを前提にできないので、オブジェクト階層の script なら不要だったはずの存在チェックだらけになります。
patch も同じ規則に従います
patch もこれらのどの階層にも付けられ、寿命も同じです。プロジェクト階層の patch は、コードを 書かずにグローバルなコントローラーを組む、いつものやりかたです。
次へ: ctx の API