要約

r/Unity3D で繰り返し出てくる問いがある。PSD をレイヤーごとに読み込み、そのうえで各 Sprite にドキュメントサイズと元のオフセットを残したい、というものである。その投稿 は二つの提案で止まっている。Photoshop からレイヤーを手で書き出す、あるいは余分な透明領域を設計側の問題として扱う。この挙動の仕組みそのものは書かれていない。

PSD Importer に、Sprite ごとにカンバスサイズを保つ設定はない。位置は別の場所に残る。読み込み時に生成される Prefab である。二回目の読み込みでは、カンバスやレイヤーのサイズが変わっても SpriteRect は更新されない。合わせ直すには Sprite Editor で rect を手で直すか、Automatic Reslice を適用する。後者は手作業の変更を破棄する。

Individual Sprites (Mosaic) が実際に出力するもの

Texture Type(テクスチャタイプ)を Sprite (2D and UI)、Sprite Mode(Sprite モード)を Multiple、Import Mode(読み込みモード)を Individual Sprites (Mosaic) にする。レイヤーは一枚のパックされた Texture として入り、レイヤーごとに SpriteRect が一つ生成される。SpriteRect は、そのレイヤー自身の絵に沿う。2048 ピクセルのカンバス上にある 32 ピクセルの円は、32 ピクセルの Sprite になる。

この項目の隣に padding の設定が二つあるが、どちらもカンバスを戻さない。Mosaic Padding は、パックされた Texture のなかでレイヤー同士の間隔を決める。Sprite Padding は PSD Importer 8.0.0(Unity 2022.2)で入ったもので、Texture のなかで各 Sprite の rect を少し広げる。どちらも間隔の調整であり、rect の起点はレイヤーの絵のままである。Sprite Editor の Trim(切り詰め)も同じ向きで、rect を不透明ピクセルの端まで詰める。逆に rect を広げるほうは、Sprite を一つずつ手で直す作業になる。

位置が残るのは Prefab のほう

Character Rig → Use as Rig(リグとして使用)は、ソースファイルから Prefab を生成する。Sprite の階層と位置は、レイヤー階層と PSD 上の配置から来る。各 Sprite にはレイヤー順に沿った Order in Layer の値が入るため、Prefab はソースの並びを再現する。Use Layer Grouping(レイヤーグループを使用)を有効にすると、Photoshop のグループが親として残る。

Inspector のこの節が出るのは、Sprite Mode が Multiple、Import Mode が Individual Sprites (Mosaic)、かつ 2D Animation パッケージが入っているときだけである。Unity は同じスイッチを「アニメーション用のアートワークを準備する」の下に書いており、そこで想定されている出力は、.skeleton アセットと Skinning Editor を伴うリグ済みのキャラクター actor である。どちらの読み方でも位置は戻る。ただし一画面分の UI をこの経路で読み込むと、得られるのはアニメーション用の actor であり、Canvas 階層は別に組むことになる。

左はパックされた Texture、右はレイヤー位置を戻した Prefab

つまり、その投稿には使える答えがある。相対的な大きさと位置はすでに扱われており、Sprite ごとのカンバスサイズは、それを与えるためのつまみではない。

ファイル形式と、無視されるレイヤー属性の代価

.psd ファイルは既定では通常の Texture Importer を通り、統合される。レイヤーの経路に乗せるには、ファイルを選び、Importer のドロップダウンを UnityEditor.U2D.PSD.PSDImporter に変える。あるいは .psb を使う。PSD Importer が直接対象にしている形式で、一辺あたり 300,000 ピクセルまで扱える。保存時は Maximize Compatibility(互換性を最大にする)を有効にする。

Sprite と Prefab の生成時に落ちる Photoshop のレイヤー属性は四つある。Channels(チャンネル)、Blend Modes(描画モード)、Layer Opacity(レイヤーの不透明度)、Effects(レイヤー効果)である。乗算レイヤーや不透明度 40% の影に見た目を頼っている絵は、これらが統合された状態で入る。ソースと同じ見え方に戻すのは、Unity 側で shader とマテリアルを書く作業になる。

二回目の読み込み

SpriteRect のデータは Layer ID ごとに保持される。だから手で直した内容が、再読み込みのあとも残る。同じ仕組みのため、ソースファイルでレイヤーやカンバスサイズを変えても、SpriteRect のサイズと位置は変わらない。合わせ直すには Sprite Editor で rect を直すか、Automatic Reslice(自動で再分割)を適用する。後者は現在のソースから rect をすべて作り直し、その組の手作業の変更を破棄する。

キャラクターのファイル一つなら、これは既知の代価である。作り直しが入る画面や、同じ処理を待つ PSD がフォルダ一つ分あるとき、検索語に batch が出てくる理由になる。PSD から Unity へ は別の経路を扱う。レイヤー分割を Editor の外で済ませ、一度の書き出しで Assets/Prefabs と Assets/Textures を書く。名前とフォルダ構成が、ファイルと一緒に届く。

解凍した Assets フォルダ。中に Prefabs と Textures がある

まとめ

ドキュメントサイズは、この問題で回すべきつまみではない。ファイル一つなら、位置は Use as Rig ですでに戻る。作り直した画面や、フォルダ一つ分の PSD では、再読み込みのたびに SpriteRect が旧サイズのまま残る。どのファイルも、同じ rect の調整をもう一度やる必要がある。