PSD 导入 Unity:没有「保留画布尺寸」选项,图层位置留在 Prefab 上
先说结论
r/Unity3D 上反复出现的问题:把 PSD 分层导入,同时让每个 Sprite 还保留整张画布的尺寸和原来的偏移。那条讨论最后停在两个建议——自己从 Photoshop 里逐层导出,或者把多出来的透明区域当成设计上的问题。这个行为背后的机制没有被说清楚。
PSD Importer 里并没有这样一个设置。位置保留在另一个地方:导入时生成的 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)加入的,作用是把每个 Sprite 在 Texture 里的 rect 放大一点。两者调整的都是间距,rect 的起点仍然是图层画面。Sprite Editor 里的 Trim(收紧)方向相同,把 rect 收到不透明像素的边缘;想反过来把 rect 放大,只能一个 Sprite 一个 Sprite 手动改。
位置保留在 Prefab 里,不在 Sprite 里
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 把同一组开关写在「为动画准备美术素材」这一节下面,那里预期的产出是一个能绑骨骼的角色 actor,配 .skeleton 资源和 Skinning Editor。两种读法下位置都能还原,只是一屏 UI 这样导入进来,得到的是一个动画 actor,Canvas 层级还要另外搭。

所以那条讨论其实有答案可用:相对比例和位置已经被处理掉了,每个 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,命名和目录结构跟着文件一起到位。

小结
画布尺寸不是解决这个问题该调的地方。单个文件上,位置已经由 Use as Rig 还原。重新生成的一屏界面,或者一整个文件夹的 PSD,每次再导入时 SpriteRect 还是旧尺寸,每个文件都要再做一遍同样的 rect 调整。