2019年のLive2D_Preprocessを、複製したPSDで処理して別名保存するよう変更した記録です。2026年10月24日にコードを再点検し、保存名と保存処理の配置を修正しました。Photoshop上での実機検証は未実施です。
公式のPhotoshop書き出しスクリプトを便利にする方法
公式マニュアルにはLive2D_Preprocess v1.4(2019年4月8日)の更新履歴があります。下記の旧画像の行番号は当時のものです。コードの位置は行番号ではなく、初期化・最上位の処理呼び出し・関数定義で判断してください。
- オリジナルのデータはそのままで、PSDデータを複製してから統合し、「_書き出し」という名前を加えて保存します。
公式スクリプトの入手先と処理内容は下記のマニュアルで確認できます。改変時は配布物の著作権表示・ライセンス表示を保持してください。実行前に編集用PSDを保存し、さらに別ファイルとしてバックアップします。
公式Preprocessはグループ、レイヤーマスク、クリッピングマスクを結合し、パス情報を削除します。
出力PSDでは結合前の部品やマスクを個別に編集できなくなるため、編集用の元PSDを残してください。
結合したくないグループには、グループ名の先頭に半角の*を付けます。
例えば*顔です。
この指定はグループの結合を避けるもので、スクリプト全体の処理を無効にする指定ではありません。
2026年10月29日に公式マニュアルの処理内容を再確認しました。
以下の保存処理の改変を含め、Photoshopでの実行結果は未検証です。
https://docs.live2d.com/cubism-editor-manual/script-download/ 旧改変コードのGistは履歴資料です。再帰関数LayerCheck内に保存・クローズ処理が置かれており、子階層の処理途中で閉じる可能性があります。そのまま実行せず、以下のように保存は最上位の処理終了後に一度だけ行います。Gist自体は今回変更していません。
目標は元ファイルがmodel.psdなら、同じフォルダにmodel_書き出し.psdを保存することです。保存は完了アラートより前に行います。同名ファイルがあれば停止する例にし、既存の書き出し結果を自動上書きしないようにしています。
Live2D公式Photoshopスクリプトのカスタマイズ手順
- 現在の入手先は上記の公式マニュアルからたどってください。Live2D_Preprocess旧配布先は当時のリンクです。
- 配布ファイルをコピーし、別名の.jsxをテキストエディタで編集します。以下は差し込み部分で、公式の結合処理全体を含む完成スクリプトではありません。
処理開始前に保存先を確認してPSDを複製する

if (app.documents.length === 0) {
throw new Error("PSDを開いてから実行してください。");
}
var originalDoc = app.activeDocument;
// 未保存の編集内容も含め、先に保存・バックアップする
if (!originalDoc.saved) {
throw new Error("元のPSDを保存してから実行してください。");
}
var filePath = originalDoc.path;
var fileName = originalDoc.name.replace(/\.[^.]+$/, "");
var outputFile = new File(filePath.fsName + "/" + fileName + "_書き出し.psd");
if (outputFile.exists) {
throw new Error("同名の書き出しファイルがあります。保存先を確認してください。");
}
var copiedDoc = originalDoc.duplicate();
app.activeDocument = copiedDoc;
var doc = copiedDoc;
// 以降の結合対象はcopiedDocにする。元の初期化処理との重複に注意。
最上位の結合処理が終了してから一度だけ保存する

// 公式の最上位の結合処理が完了した直後に置く。
// LayerCheckなど、再帰する関数の中には置かない。
saveSceneAs();
alert("書き出し完了!");
複製したドキュメントを別名保存する関数を定義する

function saveSceneAs() {
if (outputFile.exists) {
throw new Error("同名ファイルが作成されたため保存を中止しました。");
}
var psdOptions = new PhotoshopSaveOptions();
psdOptions.alphaChannels = true;
psdOptions.annotations = true;
psdOptions.embedColorProfile = true;
psdOptions.layers = true;
psdOptions.spotColors = false;
copiedDoc.saveAs(outputFile, psdOptions, true, Extension.LOWERCASE);
// 保存に失敗した場合はここへ進まず、複製を開いたままにする。
copiedDoc.close(SaveOptions.DONOTSAVECHANGES);
app.activeDocument = originalDoc;
}
[おまけ] Live2D用多機能書き出しスクリプト「live2d-utils」
live2d-utilsは別の作者によるPhotoshopスクリプト集です。公式Live2D_Preprocessとは命名ルールが異なります。
preprocess.jsxは同梱のlib.jsxを読み込むため、ファイル単体ではなくリポジトリの構成を保ちます。対象PSDのコピーを開き、Photoshopの「ファイル > スクリプト > 参照」から実行する構成です。現在のPhotoshopでの実動作は今回確認していません。
live2d-utilsの主な機能
フォルダ名の先頭に特定の記号を付与することで、書き出し時に対応する処理が自動実行されます。
-(未結合のグループを解除し、子レイヤーを外へ出す)#(半角。先頭に付いたレイヤー・グループを出力から除外)- ?(強制出力:非表示状態のレイヤーも統合して出力)
- :(分割:事前統合したレイヤーを左右に分割)
- !(レイヤーマスクやベクトルマスクをマージ前に削除)
- @(強制マージ)
-*(グループ名の末尾に付ける。suimin-*なら子の「上まつ毛左」に「suimin-」という接頭辞を付与)- *(統合のスキップ)
公式Photoshop書き出しスクリプトのカスタマイズまとめ
複製・別名保存に加え、未保存状態と同名出力の確認、保存処理を再帰関数の外へ置くことが重要です。元PSDのバックアップは別途必要です。
出力後はPSDを開き直し、レイヤー構造、マスク、色、透明部分、Cubismへの読み込み結果を確認してください。今回の確認はコードの点検であり、PhotoshopやCubismでの動作保証ではありません。
PSDが差し替わらない原因と解決手順も別の記事で解説しています。

Live2Dのモデル制作に関する記事は、ほかにも公開しています。




よくある質問:Live2D公式のPhotoshop書き出しスクリプトのカスタマイズ
この記事のコードはそのまま実行できますか?
公式スクリプトへ組み込む部分の例です。結合処理全体は含みません。2019年の画像の行番号ではなく、関数の役割と呼び出し位置を確認する必要があります。
公式スクリプトはどこから入手しますか?
本文のLive2D公式マニュアルから配布ページへ進んでください。旧配布先や旧Gistは履歴として区別し、著作権・ライセンス表示を保持します。
旧Gistには何に注意が必要ですか?
再帰するLayerCheck内に保存とクローズがあるため、子階層の処理途中で閉じる可能性があります。保存は最上位の結合処理が終了したあと一度だけ呼び出します。Gistそのものは今回修正していません。
元PSDや既存の出力は上書きされますか?
例は複製を別名で保存し、同名出力があれば停止します。ただし実機検証は未実施です。元PSDを保存・バックアップし、失敗時は複製を閉じる前に状態を確認してください。
live2d-utilsは別のスクリプトですか?
retorillo氏のスクリプト集です。preprocess.jsxはlib.jsxに依存するため、一式の構成を保ちます。公式Preprocessと記号の意味を混同しないでください。
強制出力と接頭辞はどの記号ですか?
強制出力は半角の?です。接頭辞は親グループ名の末尾に-*を付けます。例えばsuimin-*です。先頭の-は別の処理で、未結合グループを解除します。
今回、Photoshopで動作確認しましたか?
コードと公式説明・リポジトリの照合を行いましたが、Photoshop実行、PSD再読込、色・マスク・Cubism読み込みの確認はしていません。
