dA-tools.com

HOME > AfterFx > expression > 基礎 > 複文

6.複文-MultiLine-

プログラムらしく…

  • 前項で見たようにエクスプレッションの記述方法は1つではありません
  • たとえば、フル・アニメの動きを3コマ撮りにする式を1行で書くと

valueAtTime(Math.floor(time*8)/8)

  • これを変数を使って複文(複数行)で書くことも出来ます。

step=3;
stRate=Math.floor(time*24/step);
valueAtTime(stRate/(24/step));

  • 複文の方が当然長くなりますが、何をしているのか大体わかりますね。
  • 誰がいつ見ても理解しやすく、目的を明確にすることは大事です。
  • 例えば上記のエクスプレッションを2コマ撮りに変更しようとした場合に、1行で書いた式ではどこを修正すればいいのかすぐには解りませんが、複文では[ step=3 ]のところを[ 2 ]に換えればいいことが一目瞭然です。
  • このようにするとエラーやバグへの対応もしやすくなるのです。

有効なのは最後の値

エクスプレッションが複数行になった場合、パラメーターに渡されるのは最終行の値だけです。

例1:

A = thisComp.layer("平面2"). rotation ;
rotSum = rotation + A ;

  • 上の行から順に値を代入して計算していくので
    • まず[変数 A]に平面2の回転の値が代入されます。
    • 次にレイヤーの現在の角度(rotation)に平面2の回転角(A)を加算した結果が[変数 rotSum]に代入されます。
    • この[変数 rotSum ]が最終的にパラメーターに渡されます。
    • なお一般的に[ rotSum = ]は不要ですが、このように変数に代入した場合は最後の代入値が渡されます。

例2:

A = thisComp.layer("平面2"). rotation ;
B = thisComp.layer("平面2").position;
rotSum = rotation + A ;

  • この場合でも[変数 rotSum]が最終的にパラメーターに渡されます。
  • 2行めの[変数B]の値は最終行では使われていないので、無視されることになります。エラーにはなりませんがメモリーの無駄遣いです。

改行しても2行じゃない?

  • ワープロなど一般の文章では改行すると2行とみなしますが、エクスプレッションでは改行しただけでは次の行も1つのつながった1行とみなします。

s=35
[20,s]

  • これは2行のエクスプレッションではありません。AfterFxは次のように理解します。

s=35[20,s]

  • 35[20,s]なんて文法違反で明らかにエラーです。
  • JavaScriptでは明示的に行の終わりを記述する必要があるのです。日本語の文書でいうところの「句点」いわゆる「。」が必要です。
  • JavaScriptでは行の終わりを「;(セミコロン)」で表します。

s=35;
[20,s];

  • このようにセミコロンが必要です。
  • 逆にセミコロンがあれば次のように1行で記述しても間違いではありません。

s=35 ; [20,s];

  • 間違いではないけど、人間的じゃないですよね。
  • なお、最終行の行末のセミコロンは無くてもエラーにはなりません。

セミコロンを忘れるエラーは結構多いので注意してください。

※ところが次のエクスプレッションはエラーになりません。

A=thisComp.layer("平面 1").transform.rotation 
rotSum=rotation+A

  • エクスプレッションエンジンがある程度は判断してくれるのです。それでもセミコロンを書く習慣を付けておきましょう。