unity 批量处理贴图大小

2015年01月18日 11:11 0 点赞 0 评论 更新于 2025-11-21 14:42

背景介绍

在 Unity 中,默认情况下,场景烘焙后每张烘焙贴图的大小为 1024。然而,对于一些简单的场景,使用 1024 大小的贴图会造成资源浪费。例如,在我的一个场景的烘焙贴图中,右上角有一大部分区域完全未被使用,但依然占用着空间。

常规修改方法的问题

有时候,我们可能会尝试修改烘焙贴图的大小。之前我曾在 Inspector 视图中直接修改烘焙贴图大小,虽然贴图整体缩小了,但在手机上测试时发现存在问题,尤其是在接缝处理方面。而且,每次场景烘焙完成后都需要手动进行这样的缩放操作,这种方式并不可取,不建议采用这种直接缩图的方法。

解决方案:使用脚本设置烘焙贴图大小

由于 Unity 的烘焙菜单中没有直接设置烘焙贴图大小的选项,我想到了一个巧妙的办法,即使用脚本来烘焙场景并顺便设置烘焙贴图的大小。以下是具体的实现思路和代码:

脚本功能说明

  • Clear():该方法用于删除当前场景的烘焙贴图。
  • Bake():直接对当前场景进行烘焙操作。我们还可以在烘焙场景之前添加一些额外的代码,实现脚本化的操作流程。
  • maxAtlasHeightmaxAtlasWidth:分别表示每张烘焙贴图的高度和宽度。一般来说,每个场景使用一张 512 大小的贴图就足够了。需要注意的是,烘焙贴图的大小必须是 2 的幂次方,并且为正方形。

示例代码

[MenuItem("Test/Test")]
static void Init()
{
// 设置烘焙贴图的高度为 512
LightmapEditorSettings.maxAtlasHeight = 512;
// 设置烘焙贴图的宽度为 512
LightmapEditorSettings.maxAtlasWidth = 512;
// 清除当前场景的烘焙贴图
Lightmapping.Clear();
// 开始烘焙当前场景
Lightmapping.Bake();
}

使用方法

美术人员只需在 Lightmapping 窗口中设置好当前烘焙场景的参数,然后调用我们编写的拓展菜单方法即可。在上述代码中,我将烘焙贴图的大小设置为 512。

效果验证

通过上述方法,我们成功地将一张 1024 大小的贴图缩小到了 512,在效果几乎没有变化的情况下,贴图占用的空间缩小了 4 倍。以 IOS PVRTC 压缩为例,512 大小的贴图压缩后仅占用 170.8KB 的空间,节省了大量的资源。