Ver.16~ Expressionエンジン変更
After Effects 16.0 から JavaScript エクスプレッションエンジンが変更されました。そのため一部のエクスプレッションでエラーが出ることがあります。Adobeからの情報によると、After Effects 16.0 の JavaScript エクスプレッションエンジンは、Javascriptの新しい規格であるECMAScript 2018 に基づいています。以前の ExtendScript エクスプレッションエンジンは、ECMAScript 3(1999)に基づいています。以前は「まあわかるよ」ってかんじで解釈してくれていたけど、厳密になったって感じですね。
互換性のない構文
if...else 構文の違い
- ELSE を含まない IF ステートメントで終わるエクスプレッションはNG。
- 以下緑色はNG。オレンジがOKです。
var x = 50;if ( time > 1 ) { x = 100} //NG
var x = 50;if ( time > 1 ) {
x = 100;} else {
x;}
- 明示的に記述する必要がある。この書き方は以前のバージョンでもOK。
if および else を括弧なしで同じ行にできない
if ( time > 1 ) 100 else 50; //NG
if ( time > 1 ) { 100 } else { 50 };
- //カッコがあれば1行でもOK
エクスプレッションを関数宣言で終了できない
timesTen( value );
function timesTen ( val ) { return val * 10} //NG
- //functionを使用する前に関数宣言を書く必要がある。
thisLayerの省略形this()はNG、代わりに thisLayer() を使う。
this(5)(2).value; //NG
thisLayer(5)(2).value;
Source Text プロパティの文字への配列インデックスアクセスには .value が必要
- 例:文字列の最初の文字を返すメソッド
text.sourceText[0] //NG
text.sourceText.value[0]
スネークケースのプロパティおよびメソッドは許可されない。キャメルタイプで記述。
- this_compのように2つの要素をつなぐときにアンダースコアーでつないだ名前が廃止された。
this_comp //NG
thisComp
バイナリエンコードされた(.jsxbin)エクスプレッションでの eval() の使用
- ExtendScript ToolKit CC からバイナリ .jsxbin ファイルで保存されたエクスプレッションは、JavaScript エンジンではサポートされません。
$.(ドル)オブジェクトの制限付きサポート
- $. オブジェクトはほとんど使用不可になりました。多分セキュリティ問題でしょう。
- 使用できるのは3つだけ。
- $.build $.engineName $.global
...reflect.properties、...reflect.methods および toSource() のサポートなし
- thisLayer. または thisProperty. を使用するネイティブのメソッドおよび属性に明示的にプレフィックスを付ける必要があるメソッド、プロパティがある
- 例として
wiggle() は thisProperty.wiggle() と記述される必要があります。
演算操作のベクトル演算関数への置き換え
- 例
- position + [100,100] のような構文を使用すると、配列の演算操作をオーバーロードできますが、これは、.jsx エクスプレッション関数ライブラリ内または eval() 内のエクスプレッションでは機能しません。
- thisLayer.add(vec1, vec2)のようにする必要があります。