2022年度版 AfterEffectsのエクスプレッションを外部ファイルに記述する

2022年度版 AfterEffectsのエクスプレッションを外部ファイルに記述する

AfterEffects記事ラッシュ。

かなり久々にAfterEffectsのエクスプレッションを書いたのだが、何度も仕様変更が繰り返された部分らしく、正しい外部ファイルからの読み込み方を把握するまででけっこう時間がかかった。

古くい順番にこうだった(ようだ)という書き方を列挙するので、答えだけ知りたい人はお尻のほうまで読み飛ばしてほしい。

読み込み方の歴史?

#include "外部expressionのパス" 

もう動かないinclude記載。expressionの拡張子はjsxにするらしい。なんでもかんでもjsxなのはどうなのと思わなくもない。

$.evalFile("外部expressionのパス")

これも現在では動かないevalFile命令での呼び込み。ただしexpressionでは動かないものの、AfterEffects スクリプティングJavascriptとしてのjsxでは問題なく動いた。expressionとスクリプト拡張での書式がかぶってるのがややこしいところ。

var hoge = footage("title_info.json").sourceData.hoge;
hoge();

最近の書き方で、jsonファイルに関数を定義したものをフッテージに読み込んで参照して使う。とても回りくどい。でもこれもすでに動かないようだ。

var hoge = footage("script.jsx").sourceData.hoge;
hoge();

これが2022年11月現在での正しい書き方。jsonという拡張子だと関数の定義部分が不正なjsonと判定されてしまうので、拡張子をjsxにしてくださいとの事。仕様が迷走してる感ある。なお、jsxファイルの中身は、汚れたJSON?なのでこのような感じになる。また新たな形式のjsxが誕生してしまった。

{
	hoge:function(){
		return thisLayer.time;
	}	
}

エクスプレッションエンジン間の構文の違い ( https://helpx.adobe.com/jp/after-effects/using/legacy-and-extend-script-engine.html ) という記事にもあるように、外部ファイルにするとtimeなどオブジェクト指定なしに取れた情報にthisLayerなどのオブジェクト指定が必要になったようだ。とても面倒である。

jsonじゃなければ拡張子何でもいいのかなと思いためしてみたが、.txt などではexpressionがエラーになった。拡張子は .jsx である必要があるようだ。

考察

さて、.jsx 拡張子の関数定義 json ファイルには当然 関数以外のJavascript データも配置することができた。つまり json という拡張子は使わずに、全部 .jsx 拡張子にしたほうが、厳密な jsonかかなくていいし、関数も書けるしいいんではないかと思ってしまった。

jsx ファイルありすぎ問題や、json のフォーマットは厳格なほうがいいという意見もあろうと思うので、個人的には json とjsx わけて2つ読み込むのなら、.jsx 1つにまとめちゃおうかなぐらいに思っている。

おわり。

Previous post AfterEffectsのExpressionに関するweb上の情報の新旧を見分ける
Next post データ駆動型動アニメのバッチレンダリング時はaerender.exeじゃなくafterfx.exeを使おう