Skip to main content
Inspiring
April 8, 2025
解決済み

スクリプトの位置計算エラーについて

  • April 8, 2025
  • 返信数 1.
  • 591 ビュー

皆様こんにちは。After Effects用の「Salis LayerMaster」というスクリプトを開発中で、ヌルレイヤー生成時に以下のエラーが発生して苦戦しています:

エラー: Error: type object was found where a Number, array, or Property was required

このエラーは position.setValue() に無効な値(Error オブジェクトなど)が渡されている際に発生するものです。

スクリプトについて

Salis LayerMasterは、After Effectsでの作業効率を向上させるためのパネルUIスクリプトで:

  • ヌルレイヤー、シェイプレイヤー、カメラ、ライト、テキストなどを簡単なボタンクリックで作成
  • 3Dレイヤーのバウンディングボックス中心にヌルを配置する機能
  • 複数レイヤーの中心にヌルを配置(Z軸も考慮可能)
  • 各種レイヤー作成時の設定をカスタマイズ可能
  • 多言語対応(日本語/英語)

エラー発生状況

このエラーは以下の状況で発生します:

  1. コンポジションで一つ以上のレイヤーを選択
  2. ヌルレイヤー作成ボタンをクリック
  3. 今回、3Dレイヤーがある場合のヌルの位置計算機能の開発中にエラーが発生しました。

試した解決策

  1. 位置値の厳密な検証: ensureValidPosition() 関数でどんな値が来ても正しい配列を返すよう改善
  2. 親子関係処理の改善: 一時的な親解除と復元を確実に行う try/finally ブロックの導入
  3. バウンディングボックス計算の改善: 3D座標を考慮した計算方法の修正
  4. エラー処理の強化: 位置計算のすべての経路で例外をキャッチして安全な値を返すよう実装

推定される原因

数日間のデバッグを経て、問題は以下のいずれかだと思われます:

  1. 複数の計算経路(getPreciseBoundingBoxCenter, getMultiLayerCenterWithZ)のいずれかでErrorオブジェクトが返され、それが適切に捕捉されていない
  2. 親子関係の一時的変更処理(親を一時的に解除して位置計算後、復元する)で何らかのタイミング問題
  3. After Effects内部のバウンディングボックス計算API(toCompメソッドなど)との相互作用の問題

コードを注意深く調査しましたが、エラーが引き続き発生しています。ヌルレイヤーやバウンディングボックス計算に関する同様の問題や解決策についてご存知の方がいらっしゃいましたら、アドバイスをいただきたいです。。。。

スクリプトのテスト方法

テスト・検証用にスクリプトとアイコンファイルをダウンロードいただけます。
アイコンフォルダとjsxファイルをスクリプトUIパネルフォルダに配置して使用してください。

※スクリプトは開発中バージョンです。テスト用のサンプルコンポジションとして、複数の3Dレイヤーを含むものをご用意いただき、スクリプトパネルにある「ヌルを作成するボタン」を、レイヤー上の複数のアイテムを選択した状態で押していただくとエラー再現が容易です。



どなたかこのエラーの根本原因や解決策について知見がございましたら、アドバイスいただけると大変助かります。よろしくお願いいたします。

解決に役立った回答 stunning_Sunflower16B7

試してみた感じでは動作したり、ある条件では動作しないみたいでした。

おそらく554行目のArray.isArrayという箇所だと思います。

これに関してはある種の罠のようなものですので、自分が昔書いた記事を参考にしてもらうといいかもしれないです。

isArraayはポリフィルされていて、ユーザーの環境次第では動作したりしなかったりします。

 

AEのスクリプトに追加されたように見えるJSONやポリフィルの罠

https://qiita.com/tetsuoh/items/186bbcad3305ffeccbc5

 

返信数 1

Participating Frequently
April 8, 2025

1080行等でlayer.toComp()となっていますが、LayerObjectにttoCompメソッドがあるのはスクリプトではなくエクスプレッションです。

https://ae-scripting.docsforadobe.dev/layer/layer/

 

https://helpx.adobe.com/jp/after-effects/using/expression-language-reference.html#:~:text=%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%80%82-,toComp,-(point%2C%20t%3Dtime

 

もし以前にスクリプトでレイヤーに対してtoCompメソッドが動いたというのであれば、何らかのスクリプトがLayerObjectに対して拡張をかけた可能性があります。

その場合、そのスクリプトが実行されない限り拡張がかからないので、その何らかのスクリプトがライブラリ的なものであればそれを利用するなどするか、自前で実装するしかありません。

 

スクリプトからエクスプレッションを適用して値を得るという方法もありますが、飛び道具的な使い方なのであまり推奨しないです。

 

動作するバージョンの方ではtry-catchでtoCompの箇所が囲まれていたのでエラーにはならないですが、catch句の方しか実行されないです。

全体的にエラーが出ないようにとtry-catchで細かく囲まれているように見えますが、逆にどこがエラーなのかわかりずらいのでデバッグしずらいのではないかなと思います。

Cyifon作成者
Inspiring
April 9, 2025

いつもありがとうございます。。。;;
toCompでなぜ動いたのかわかりませんが、不安なので全部削除することにしました。
ありがとうございました。気が付きませんでした。

一応、
getBoundingBoxCenter関数を修正し、toComp()メソッドを使わずに直接計算するよう変更
getBoundingBoxCenterWithZ関数の同様の修正
getPreciseBoundingBoxCenter関数の修正
getLayerCorners関数の修正
getCombinedBoundingBoxWithZ関数の修正
getPreciseCombinedBoundingBox関数の修正
そして、コード内でtoCompメソッドの存在をチェックしている条件分岐(if (layer instanceof AVLayer && typeof layer.toComp === "function") など)を全て削除し、直接計算に置き換え、
など上記の修正をすべて行いましたが、レイヤーを選択してヌルを作成する際に依然として同じエラーが発生します。。。泣

toComp()メソッド以外に、スクリプト内で同様のエラーを引き起こす可能性のある部分はありますかね、、、?

現状のコードのダウンロードリンク
https://28.gigafile.nu/0719-c26569fe529dd0ea51d30c669a782d080

Participating Frequently
April 10, 2025

試してみた感じでは動作したり、ある条件では動作しないみたいでした。

おそらく554行目のArray.isArrayという箇所だと思います。

これに関してはある種の罠のようなものですので、自分が昔書いた記事を参考にしてもらうといいかもしれないです。

isArraayはポリフィルされていて、ユーザーの環境次第では動作したりしなかったりします。

 

AEのスクリプトに追加されたように見えるJSONやポリフィルの罠

https://qiita.com/tetsuoh/items/186bbcad3305ffeccbc5