Amazonで商品を見るセール会場へ

After Effectsのプリコンポを展開|単純2D用コードと元レイヤーの保持

単純な2Dプリコンポの中身を、現在のコンポへコピーして展開します。

選択レイヤーのsourceを直接参照し、レイヤー名の変更や同名素材で別のコンポを探してしまう問題を避けます。

最終調査日:2026年10月3日。

対象判定とコピー順序はローカルで検査しています。

AE本体でのコピー、描画の一致、取り消しは未確認です。

目次

同じサイズ・変形なしの練習から始める

960×540、24fps、3秒のコンポを2つ作ります。

素材コンポにエフェクト・親子・式・音声なしの2D平面を3枚置き、赤・緑・青のように重なり順が分かる配置にします。

素材コンポを展開先へ入れ、開始0秒、IN0秒、OUT3秒、伸縮100%とします。

位置480,270、アンカー480,270、スケール100%、回転0、不透明度100%、親なし、通常合成を維持します。

対象練習の条件適用範囲
外側のレイヤー変形・キー・式・親・マスク・効果なし同サイズ・同fps・同ピクセル比
内部のレイヤー2D・親なし・通常合成式・音声・効果・マットなし
時間外側の開始0/全尺/伸縮100%時間差・リマップを再現するコードではない

調整レイヤー、3D、連続ラスタライズ、タイムリマップ、トラックマット、外側の変形アニメーションを含む例は対象外です。

別の親や変換を追加した作品を、このコードで同じ表示へ戻せるとは扱いません。

選択レイヤーのsourceから展開するコード

別名保存した練習プロジェクトで、展開したいプリコンポレイヤーを1枚だけ選びます。

次のコードをExpandSimplePrecomp.jsxとして保存し、「ファイル→スクリプト→スクリプトファイルを実行」から実行します。

(function () {
    var target = app.project.activeItem;
    function reject(text) { alert(text); return false; }
    function near(a, b) { return Math.abs(a - b) < 0.00001; }
    function hasExpression(group) {
        if (!group) { return false; }
        if (group.canSetExpression && group.expressionEnabled) { return true; }
        for (var k = 1; k <= group.numProperties; k++) {
            if (hasExpression(group.property(k))) { return true; }
        }
        return false;
    }
    if (!(target instanceof CompItem) || target.selectedLayers.length !== 1) {
        reject("開いたコンポでプリコンポレイヤーを1枚選択してください。"); return;
    }
    var original = target.selectedLayers[0];
    var source = original.source; // レイヤー名やプロジェクト内の同名検索を使わない
    if (!(source instanceof CompItem) || source === target || source.numLayers < 1) {
        reject("中身のあるプリコンポを選択してください。"); return;
    }
    if (source.width !== target.width || source.height !== target.height ||
        source.pixelAspect !== target.pixelAspect || !near(source.frameDuration, target.frameDuration)) {
        reject("素材コンポと展開先のサイズ・ピクセル比・fpsを揃えてください。"); return;
    }
    var tr = original.property("ADBE Transform Group");
    var position = tr.property("ADBE Position");
    var anchor = tr.property("ADBE Anchor Point");
    var scale = tr.property("ADBE Scale");
    var rotation = tr.property("ADBE Rotate Z");
    var opacity = tr.property("ADBE Opacity");
    if (original.locked || !original.enabled || original.parent || original.threeDLayer ||
        original.collapseTransformation || original.timeRemapEnabled || original.stretch !== 100 ||
        !near(original.startTime, 0) || !near(original.inPoint, 0) || !near(original.outPoint, source.duration) ||
        original.adjustmentLayer || original.guideLayer || original.solo || original.hasTrackMatte ||
        original.isTrackMatte || original.blendingMode !== BlendingMode.NORMAL ||
        original.property("ADBE Mask Parade").numProperties || original.property("ADBE Effect Parade").numProperties ||
        position.dimensionsSeparated || position.numKeys || anchor.numKeys || scale.numKeys ||
        rotation.numKeys || opacity.numKeys || hasExpression(original) || hasExpression(tr) ||
        !near(position.value[0], target.width / 2) || !near(position.value[1], target.height / 2) ||
        !near(anchor.value[0], source.width / 2) || !near(anchor.value[1], source.height / 2) ||
        !near(scale.value[0], 100) || !near(scale.value[1], 100) || !near(rotation.value, 0) || !near(opacity.value, 100)) {
        reject("対象外の変形・時間変更・親子・合成・エフェクトがあります。元のプリコンポを維持してください。"); return;
    }
    var i;
    for (i = 1; i <= source.numLayers; i++) {
        var layer = source.layer(i);
        if (!(layer instanceof AVLayer) || layer.hasAudio || layer.parent || layer.threeDLayer || layer.adjustmentLayer ||
            layer.guideLayer || layer.solo || layer.hasTrackMatte || layer.isTrackMatte ||
            layer.timeRemapEnabled || layer.blendingMode !== BlendingMode.NORMAL ||
            layer.property("ADBE Effect Parade").numProperties || hasExpression(layer) ||
            hasExpression(layer.property("ADBE Transform Group")) || hasExpression(layer.property("ADBE Text Properties"))) {
            reject("中のレイヤーにも2D・親なし・通常合成・式/エフェクト/マットなしの制約があります。"); return;
        }
    }
    var copies = [];
    app.beginUndoGroup("単純2Dプリコンポの中身を展開");
    try {
        // copyToCompは先頭へ挿入するため、下からコピーして順序を保持。
        for (i = source.numLayers; i >= 1; i--) {
            source.layer(i).copyToComp(target);
            copies.unshift(target.layer(1));
        }
        for (i = 0; i < copies.length; i++) { copies[i].moveBefore(original); }
        original.enabled = false; // 元プリコンポは削除せず映像だけOFF
        alert("展開したレイヤー:" + copies.length + "枚。元プリコンポは映像OFFで残しました。");
    } catch (error) {
        alert(error.toString() + "\n途中のコピーを残しています。編集→取り消しで今回分を戻してください。");
    } finally { app.endUndoGroup(); }
}());

コピー先へは新しいレイヤーが先頭に入るため、下から順にコピーして上からの順序を保ちます。

その後、保存したオブジェクト参照で元プリコンポの直前へ移します。

元のプリコンポは削除せず、成功後に映像だけOFFにします。

内部の素材コンポや、展開先の既存レイヤーを削除する処理はありません。

展開前後の画像と順序を確認する

展開前の0秒・1秒・最後の表示フレームを保存し、展開後に同じ時刻と重なり順を比較します。

展開先の他レイヤーがコンポ内の番号を参照していないかも確認します。

この処理でレイヤー番号は増減します。

展開先にindexやlayer(番号)を使う式がある場合は、練習で参照を見直し、表示が変わったら元のプリコンポへ戻します。

この例はモーションブラーやレイヤースタイル、素材の範囲外部分などの描画差も実機確認が必要です。

条件を満たしただけで作品全体の描画一致を保証しません。

停止メッセージと戻し方

名前が違ってもsourceがコンポなら参照できます。

停止した場合は、選択1枚、サイズ・fps、外側のアンカーと位置、親子・式・効果・時間設定を順に確認します。

コピー途中で例外が出た場合は元レイヤーを表示したまま停止し、途中のコピーを残します。

再実行せず「編集→取り消し」で今回分を戻し、レイヤー数と元の表示を確認します。

古いAEでは効果付きcopyToCompの取り消しに関する問題も記録されているため、この練習では内部の効果を除外します。

実機で戻せないときは保存した別名プロジェクトを開きます。

仕様の参照:Layer.copyToCompと配置操作、AVLayer.sourceと時間・合成設定、Adobeのスクリプト実行方法。

元コンポを複製してから練習する場合はコンポの複製と共有素材、ロゴを分割したい場合はマスク単位のレイヤー分離を参照します。

関連記事と旧配布資料

関連記事は目的に応じて使い分けます。

旧配布コードと、このページの改訂コードは同じものではありません。

次に学ぶ・作業環境を選ぶ

学習を続けたい方や、作業環境を整えたい方は、目的に合うガイドをご覧ください。

After Effectsのおすすめ書籍

必要なPCスペック

周辺機器の優先度

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次