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

After Effects│レイヤーを等間隔に並べる方法|標準機能とスクリプト

レイヤーをコンポの長さに合わせて均等に配置したい

下の修正版は、選択レイヤーをワークエリアのフレーム数へ割り付けます。

いまのAfter Effectsには、同じことができる標準機能があります。

やりたいこと標準機能
選んだレイヤーを等間隔に並べ直すクイックオフセット
レイヤーを端と端でつないで並べるアニメーション/キーフレーム補助/シーケンスレイヤー
重ねてトランジションを入れるシーケンスレイヤーの「オーバーラップ」

ワークエリアを指定して区間を割り付ける場合は、下のスクリプト例を試せます。

まず標準機能を試してから、必要ならスクリプトを使ってください。

目次

ワークエリアを3つの区間に分ける練習

別名保存した練習コンポジションへ色の異なるソリッドを3枚置き、ワークエリアを0〜6秒にします。

3枚を選択し、タイムラインの上からの番号と各レイヤーの開始・イン・アウトポイントを記録します。

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

対象は選択したレイヤーだけで、タイムラインの上からの順に0〜2秒、2〜4秒、4〜6秒へ割り付けます。

元のインポイントが1秒なら、startTimeへ目標開始を直接代入せず、インポイントの移動量を加えてから区間を設定します。

並びを逆にする場合は、冒頭のREVERSEをtrueにします。

逆順でも各区間の開始は終了より前になります。

割り切れないフレーム数では区間の長さに最大1フレームの差が出ます。

たとえば10フレームを3枚へ分けると3・3・4フレームです。

ロック、100%以外の伸縮、タイムリマップ、1枚あたり1フレーム未満、素材の長さが足りない場合は全体を変更前に止めます。

まずソリッドで確認し、実動画は元素材の表示範囲とアニメーションも実機で比べてください。

終了後は1回のCtrl+Z/Command+Zで各時刻が元へ戻るか確認し、元コピーを開きます。

確認すること期待する結果違ったとき
6秒・3レイヤー各2秒の連続区間ワークエリアの範囲を確認
逆順順番のみ反転in/outを交換しない
素材が足りない変更前に停止素材長と開始を確認

2026年10月3日にLayer・CompItem・ApplicationのAPI参照を照合し、ローカルのJavaScriptで境界と選択条件を検証しましたが、AE実機でのプロパティ連動・表示・取り消しは未検証です。

標準機能で等間隔に並べる(クイックオフセット)

選んだレイヤーの間隔を、ドラッグひとつで揃えられます。

  1. 並べたいレイヤーを、順番を意識して選ぶ
  2. Windowsは Ctrl + Alt、macOSは Command + Option を押しながらレイヤーをドラッグする

最初に選んだレイヤーはその場に残ります。

最後に選んだレイヤーがドラッグした距離ぶん動きます。

間にあるレイヤーは、その2つの間に時間的に均等に配置されます。

キーフレームも一緒にずれるので、アニメーションは崩れません。

選ぶ順番がそのまま並び順になるので、順不同で選べばばらけた配置にもできます。

端と端をつないで並べる(シーケンスレイヤー)

動画やカットを順番に並べたい場合は、こちらです。

  1. Ctrl(Windows)またはCommand(macOS)を押しながら、表示したい順にレイヤーを選ぶ
  2. アニメーション/キーフレーム補助/シーケンスレイヤー を選ぶ
  3. ダイアログで並べ方を決める
設定結果
「オーバーラップ」を外すレイヤーの端と端をつないで並べる
「オーバーラップ」を入れてデュレーションを指定指定した長さだけ重ねる
デュレーションに負の値を入れるレイヤーの間に間隔が空く

重ねる場合は、トランジションも選べます。

選んだレイヤーの透明度を使うなら「前面レイヤーと背面レイヤーをクロスディゾルブ」です。

そうでなければ「前面レイヤーをディゾルブ」を選びます。

並べるレイヤーの長さは、コンポジションより短くしておいてください。

ほかのレイヤーを置く時間が取れなくなるためです。

選択したレイヤーをワークエリアに均等配置するスクリプト

(function () {
    var REVERSE = false;
    var comp = app.project && app.project.activeItem;
    if (!(comp instanceof CompItem) || comp.selectedLayers.length === 0) {
        alert("Open a composition and select layers."); return;
    }
    var layers = [], plans = [], i;
    for (i = 0; i < comp.selectedLayers.length; i++) { layers.push(comp.selectedLayers[i]); }
    layers.sort(function (a, b) { return a.index - b.index; });
    if (REVERSE) { layers.reverse(); }
    var start = comp.workAreaStart, length = comp.workAreaDuration;
    var frame = comp.frameDuration;
    if (!isFinite(start) || !(length > 0) || !isFinite(length) || !(frame > 0) || !isFinite(frame)) {
        alert("Invalid work area or frame duration."); return;
    }
    var firstFrame = Math.round(start / frame);
    var lastFrame = Math.round((start + length) / frame);
    var count = lastFrame - firstFrame;
    if (count < layers.length || Math.abs(firstFrame * frame - start) > 0.00001 ||
        Math.abs(lastFrame * frame - start - length) > 0.00001) {
        alert("Use frame-aligned work area with at least one frame per layer."); return;
    }
    for (i = 0; i < layers.length; i++) {
        var layer = layers[i];
        var targetIn = (firstFrame + Math.floor(i * count / layers.length)) * frame;
        var targetOut = (firstFrame + Math.floor((i + 1) * count / layers.length)) * frame;
        var shiftedStart = layer.startTime + targetIn - layer.inPoint;
        if (layer.locked || layer.stretch !== 100 || layer.timeRemapEnabled ||
            !isFinite(shiftedStart) || Math.abs(shiftedStart) > 10800 ||
            targetIn < 0 || targetOut > comp.duration) {
            alert("Locked, stretched, remapped, or out-of-range layer. Nothing changed."); return;
        }
        var source = layer.source;
        if (source && !(source.mainSource && source.mainSource.isStill)) {
            if (!isFinite(source.duration) || targetIn - shiftedStart < -0.00001 ||
                targetOut - shiftedStart > source.duration + 0.00001) {
                alert("Source does not cover the proposed interval. Nothing changed."); return;
            }
        }
        plans.push({layer:layer, start:shiftedStart, inside:targetIn, outside:targetOut});
    }
    app.beginUndoGroup("Distribute selected layers in work area");
    try {
        for (i = 0; i < plans.length; i++) {
            var plan = plans[i];
            plan.layer.startTime = plan.start;
            plan.layer.inPoint = plan.inside;
            plan.layer.outPoint = plan.outside;
        }
    } finally { app.endUndoGroup(); }
})();

並びを逆にしたい場合

並びを逆にする場合は、配列の順序を反転します。

var REVERSE = true;

冒頭の「var REVERSE = false;」をこの1行へ置き換えてから、スクリプト全体を実行します。

おまけ

Twitterで知ったのですが、こちらのスクリプトも便利そうです。

“OneTwoTrim”というスクリプトで、レイヤーを複数選択して実行すると、最初に選んだレイヤーの長さに揃えてくれます。

After Effectsのほかの操作は、まとめからご覧いただけます。

※ 標準機能の操作は、Adobe公式ヘルプ「After Effects でのレイヤーの選択と配置」で2026年9月19日に確認しました。

以前の実装は、GitHubのMOTOKI-LLC/cg-method-codeを参考にできますが、本稿の修正版とは異なります。

レイヤーやテキストを揃えるスクリプトは、ほかにもあります。

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

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

After Effectsのおすすめ書籍

必要なPCスペック

周辺機器の優先度

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