コンテンツにスキップ

式の変数

式の変数は、複数の式間で値を共有するための強力なツールです。また、複雑な式をより理解しやすく管理しやすい部分に分割するのにも非常に便利です。

変数は、式で使う値の名前付きストレージ場所です。変数が表す値を格納する場所を持つには、変数を定義する必要があります。変数の定義はさまざまな方法で行えます。

なお、変数は以前のフレームで評価されただけでは定義済みとは見なされません。変数は Designer 内でフレームが進むにつれて定義されるため、フレームの早い段階で起こること(デバイスの評価など)は、フレームの後半で定義される変数(レイヤーのコンポジション中など)にアクセスできません。これは、レイヤーのスタックを扱うときに特に当てはまります。レイヤーは、変数を定義したレイヤーの上にコンポジットされる他のレイヤーが使う変数のみを定義できます。

これらは技術的には変数ですが、これらの定数は変化しません。

  • pi - 数学定数 π。多くの場合 三角関数 とともに使われます。
  • e - 数学定数 e(オイラー定数)。多くの場合 数学関数 とともに使われます。

Designer は、どこからでもアクセスできる 1 つの変数を定義します。

  • uptime - 現在のフレームの時刻。すべてのサーバー間で同期されており、マルチマシンセッションでは(約 2ms 以内で)等しくなります。一部の場所ではフレーム時間とも呼ばれます。

一部の変数は特定のコンテキストでのみ定義されます。たとえば、レイヤーを扱う とき、self 変数は式が制御しているアニメーションプロパティの現在値として定義されます。

式を評価するとき、その評価結果を使うだけでなく保存することもできます。たとえば、ユーザーが brightness に複雑な式を入力し、それを複数のレイヤーで共有したい場合があります。myvar = sin(uptime / 20) と入力し、別のレイヤー(コンポジションスタックの後ろに表示される必要があります)で brightness を単に myvar に設定できます。

変数は、それを定義するレイヤー(またはその他の式)がアクティブである間のみ定義される点に注意してください。レイヤーが非アクティブになる(つまり再生ヘッドの下にない)とすぐに、変数は定義されなくなり、その参照は無効になります。

代入で定義された変数を参照するには、コンポジションスタックでそのレイヤーを変数の使用者より下に配置する必要があります。つまり、変数代入で定義された変数は、定義レイヤーの上にコンポジットされるレイヤーでのみ利用できます。同様に、代入がシステム内の他の Resource によって行われる場合、変数はその Resource がフレーム内で実行された後にのみ定義されます。

タイムライン上にアニメーション化された変数を作成したいが、コンテンツに使うレイヤーに明示的に結び付けたくない場合があります(変数を考慮せずにレイヤーが移動または再プログラムされることを懸念している場合など)。

ユーザーは、他のレイヤーと同様に ExpressionVariable レイヤー を作成できます。configuration セクションで新しい変数を作成してそのプロパティを変更し、タイムライン上のレイヤーの他のプロパティと同様にアニメーション化できます。

ExpressionVariable レイヤー で定義された変数を参照するには、コンポジションスタックでそのレイヤーを変数の使用者より下に配置する必要があります。つまり、ExpressionVariable レイヤーで定義された変数は、その上にコンポジットされるレイヤーでのみ利用できます。

変数がよりグローバルで、タイムライン上の特定の場所に限定されない、またはアニメーション化する必要がない場合があります。

ExpressionVariable デバイス をデバイスマネージャーで作成し、そこで変数を作成できます。

変数は、上記のさまざまな場所によってフレームごとに定義されます。

それらの場所がもう実行されない場合、変数は定義されなくなり、それを使った式は無効になります。例としては、変数を定義したレイヤーがもう再生ヘッドの下にない場合や、デバイスがデバイスマネージャーから削除された場合です。

1 つのフレームで同じ変数を定義する場所が複数ある場合、変数を定義しようとする 2 番目の場所はエラー状態になり、変数を定義できません。変数が最初に定義された場所が示されるので、ユーザーはこの競合をどう解決するか判断できます。

変数は式言語の構文に従って命名する必要があります。重要なポイントは次のとおりです:

  1. 大文字小文字の区別 - helloHello という名前の変数は別物で、まったく異なる、あるいは互換性のない値(数値やテキストなど)を持つことがあります。
  2. 特殊文字なし - 変数はアンダースコア(_)または英字で始まり、その後は英字、アンダースコア、数字で構成される必要があります。つまり、スペースやその他の特殊文字は無効です。残念ながら現時点では、これは非英語文字がサポートされないことを意味します。

多くの変数を持つプロジェクトを構築するときは、一貫した命名規則を使うよう注意すべきです。異なる意味と目的を持つ多くの変数を簡単に作成できます。デバイスレイヤー を使った整理は、変数を定義のための共通の場所にグループ化するのに便利です。

if のような、より複雑で冗長なロジック関数を扱うとき、再利用のために部分を切り出したり、単に式を読みやすくしたりするのに便利な場合があります。

たとえば、関数変数の 1 つの用途は、getByUID を使って Resource にアクセスした結果を返すことです:

関数変数を構築するには、expression variables デバイス または レイヤー を作成します。この方法で定義された変数は Function タイプに切り替えられ、目的の式を記述できます。

defining the function variable

必要に応じてレイヤー(またはその他の Resource)の UID をコピーし、getByUID 式を記述します。特定のプロパティにアクセスする必要はありませんが、そうすると関数を他の場所で再利用しやすくなる場合があります。関数変数を作成するときは、何を抽象化しようとしているかを考慮すべきです。この例では、関数 textLayer は選択したレイヤーを返します。

using the function variable

関数変数を使うとき、関数を評価するには呼び出し構文が必要です。この場合は textLayer() で、関数変数内の式と同じ値に評価されます。Resource を返す場合、これは返された値からプロパティに直接アクセスできることを意味します。式が数値またはテキストに評価される場合は、そのまま直接使えます。

関数へのパラメーターの受け渡し

Section titled “関数へのパラメーターの受け渡し”

高度な使用例では、関数変数にパラメーター(引数)を作成できます。これは、関数変数の名前を変更して、使いたいパラメーター名を含めることで行います。

たとえば、ユーザーが、条件が満たされた場合に何らかのオーバーライド動作を行い、そうでない場合は通常のシーケンスにフォールバックする関数 maybe_override を作成します。オーバーライドは、関数を使う各フィールドで異なる必要があります。そこで、関数を次のように定義できます:

名前タイプ
maybe_override(value)Functionif(osc:show.override, value, self)

上記の関数は、レイヤーに適用するように設計されています。OSC アドレス /show/override が非ゼロの場合は value を提供し、そうでない場合は既存のシーケンスにフォールバックします。

これを適用するとき、ユーザーは適用可能な各フィールドに異なる式を入力します。たとえば、あるフィールドには maybe_override(osc:show.field1)、別のフィールドには maybe_override(osc:show.field2) を入力します。

関数は、呼び出し元の式のコンテキストで評価されます。これは、呼び出し元の式がその変数にアクセスできる限り、関数変数が、関数変数より後に定義された変数や他のコンテキストを使えることを意味します。

これの 1 つの便利な意味は、関数変数が self 変数にアクセスできることです。self は、関数が評価される場所に応じた通常の意味を持ちます。これはたとえば、関数変数で OSC 式 を扱うときに使えます。次の関数式を記述できます:

if(valid_osc:my.address, osc:my.address, self) - これは、OSC アドレス /my/address で値が受信されるまで通常のシーケンスを使います。

this 変数も関数変数で利用でき、現在式を評価している Resource を指します。これは、関数変数が使われている Resource のプロパティに、関数変数からアクセスさせたい場合に特に便利です。

通常の変数とは異なり、thisResource アクセス構文 を使ってアクセスします。たとえば、現在のレイヤー(モジュール)の brightness プロパティを参照するには、module:this.brightness を使います。これにより、関数変数がどこで使われても、式は常に式を実行している Resource のプロパティを参照するようになります。

this は、Resource をパラメーターとして関数変数に渡す必要を避ける便利なショートカットでもあり、レイヤーの名前変更や複製などの問題に対して堅牢です。