Unity减少发布打包文件的体积(二)——设置WebGL发布时每张图片的压缩方式

这篇具有很好参考价值的文章主要介绍了Unity减少发布打包文件的体积(二)——设置WebGL发布时每张图片的压缩方式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一个项目在发布成WebGL后,其体积至关重要,体积太大,用户加载会经历一个漫长的等待…轻则骂娘,重则用脚把电脑踢烂(扣)…

那么如何减少发布后的体积呢,本文从图片的压缩开始入手。

前传回顾:
Unity减少发布打包文件的体积(一)——获取精灵图片的信息限制它的大小

一、徒手设置每张图片的压缩方法

在assets文件夹里选中一个Image,在Inspector底部有一个各发布平台的压缩设置,如下图中4的部分。
在此处设置压缩格式时,只针对发布时进行压缩,不会修改工程资源的原始文件,这样如果你发布成exe时,可以用高清的设置(而如果直接改了原始图片,则发布成exe时,画质被降低)。
unity webgl 图片格式,unity,webgl,图片压缩

1、压缩格式Format的说明(来源Claude.ai):

  • ASTC (Adaptive Scalable Texture Compression): 这是一个非常灵活的纹理压缩格式,可以提供一系列不同的压缩比,以适应各种不同的应用需求。ASTC由ARM开发,旨在为各种不同的2D和3D内容提供优质的可压缩性能。它被广泛用于移动设备,特别是那些使用ARM集成电路的设备。

  • ETC (Ericsson Texture Compression): ETC是一种开放的、有损的纹理压缩格式,使用在OpenGL和OpenGL ES。ETC1版本不支持alpha通道,而ETC2支持alpha通道。由于其广泛的设备支持和合理的压缩效果,ETC被广泛应用于移动设备。

  • DXT (DirectXTex): 也被称为S3TC,这是一种有损的纹理压缩格式,主要应用在DirectX场景。DXT格式为纹理提供5:1的压缩比率且支持alpha通道,对于PC和一些游戏主机上的3D应用,通常采用DXT格式。

  • BC (Block Compression): BC是一系列DirectX的一部分提供的纹理压缩方法,这其中包括DXT。BC系列(包括BC1-BC7)是几种特殊用途的格式,它们在纹理分辨率、细节和压缩比率上提供多种选择,但并非所有设备都支持。

  • EAC (Ericsson Alpha Compression): 这是ETC2压缩方法的一部分,用于对alpha通道进行压缩。EAC提供了更好的颜色和alpha通道保真度,特别适合那些需要用到透明效果的游戏或者带有alpha混合的特效。

2、MaxSize的计算

Unity中如果你不单独设置,它的默认值大概就是2048,你可以写一个函数,根据分辨力来计算maxSize的值。
unity webgl 图片格式,unity,webgl,图片压缩

/// <summary>
/// 获取图片的分辨率,取分辨率中高宽的最大值,然后返回图片的【MaxSize】
/// MaxSize的定义:assets->Image->【Texture2D ImportSettings】->【Override For WebGL】->【Max Size】 
/// 区间:16,32,64,128,256,512,1024,2048,4096,8192,16384
///
/// 举例:图片分辨率 = 12 * 24,那么图片的MaxSize = 32
/// </summary>
/// <param name="texture"></param>
/// <returns></returns>
public static int GetMaxSize(Texture2D texture)
{
   //分辨率区间的预备
   var start = new List<int> { 0, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384 };
   var end = new List<int> { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 100000 };
   var zones = start.Zip(end, (item1, item2) => (startIdx: item1, endIdx: item2)).ToList();

   //取分辨率高宽的最大值
   var size = new List<int> { texture.width, texture.height }.Max();  //取【宽】【高】中的最大值

   //判断所属的区间
   var maxSize = zones.First(x => x.startIdx <= size && size <= x.endIdx).endIdx;
   //Debug.Log($"图的分辨率 = {texture.width} * {texture.height} size = {size}, MaxSize = {maxSize}");
   return maxSize;
}

3、 Format的设置:

Unity面板上提供的各种压缩算法:
unity webgl 图片格式,unity,webgl,图片压缩
自己亲自指挥亲自部署时,代码中可选的压缩格式:
unity webgl 图片格式,unity,webgl,图片压缩

4、提问:所有的图片能不能一键设置呢?

可以的,你可以自己写一个编辑器脚本(俗称插件),也可以让AI帮你写一个…然后自己慢慢改

二、一键设置所有图片的Build时的压缩选项

1、快捷菜单入口

右键全选图片 -> 【设置发布WebGL时贴图的压缩格式】
unity webgl 图片格式,unity,webgl,图片压缩

处理中…
unity webgl 图片格式,unity,webgl,图片压缩
unity webgl 图片格式,unity,webgl,图片压缩

2、压缩效果

压缩结束后,发现包的大小从230M减少到138兆。

3、实现的基本思路

  • (1)找到所有的全选物体
Object[] textures = Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);

注意:上述写法容易爆内存,假如我选取了2000多张图,有的图还是4k的,当图片加载的时候,内存暴涨,然后就是程序崩溃,电脑死机。使用场景就是只能选取少量的图片。

自动获取图片并处理:

  • 获取所有图片的信息
string[] guids = AssetDatabase.FindAssets("t:texture2d");
  • 获取图片路径
string path = AssetDatabase.GUIDToAssetPath(guid);//guid是guids的items
  • 通过路径加载图片
Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>(path);
  • 图片设置
......
  • (2)单个物体的压缩选项设定

      创建特定平台压缩实例
      勾选压缩
      设置参数
      Apply
    
// 创建特定平台压缩实例
TextureImporterPlatformSettings platformSettings = new TextureImporterPlatformSettings();
platformSettings.overridden = true;
platformSettings.name = "WebGL";

// 设置为压缩
platformSettings.textureCompression = TextureImporterCompression.Compressed;

// 设置压缩格式
platformSettings.format = format;                                     //TextureImporterFormat.ASTC_12x12;
platformSettings.compressionQuality = compressionQuality;             //40
platformSettings.maxTextureSize = GetMaxSize(texture as Texture2D);   //32

//设置importSettings
TextureImporter importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(texture)) as TextureImporter;
importer.SetPlatformTextureSettings(platformSettings);

//Apply 设置
importer.SetPlatformTextureSettings(platformSettings);

//保存资源
importer.SaveAndReimport();

三、附录(代码)

运行方式,放到任何Editor文件里

1、选中图片后右键菜单处理方式

using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEditor;

public class SetTextureCompression
{
    //****************************************参数设置区**********begin
    //TODO 做成EditWindow类型

    private static TextureImporterFormat format = TextureImporterFormat.ASTC_12x12;  //图片压缩格式
    private static int compressionQuality = 60;                                      //压缩比例
    private static string platform = "WebGL";                                        //发布的平台 

    //************************************************************end

    /// <summary>
    /// 设置贴图在build时的压缩选项
    /// </summary>
    [MenuItem("Assets/设置发布WebGL时贴图的压缩格式")]
    static void SetCompression()
    {
        int count = 0;

        Object[] textures = Selection.GetFiltered(typeof(Texture2D), SelectionMode.DeepAssets);
        if (textures.Length > 0)
        {
            foreach (Object texture in textures)
            {
                // 创建特定平台压缩实例
                TextureImporterPlatformSettings platformSettings = new TextureImporterPlatformSettings();
                platformSettings.overridden = true;
                platformSettings.name = platform;

                // 设置为压缩
                platformSettings.textureCompression = TextureImporterCompression.Compressed;

                // 设置压缩格式
                platformSettings.format = format;                                     //TextureImporterFormat.ASTC_12x12;
                platformSettings.compressionQuality = compressionQuality;             //40
                platformSettings.maxTextureSize = GetMaxSize(texture as Texture2D);   //32

                //设置importSettings
                TextureImporter importer = AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(texture)) as TextureImporter;
                importer.SetPlatformTextureSettings(platformSettings);

                //Apply 设置
                importer.SetPlatformTextureSettings(platformSettings);

                //保存资源
                importer.SaveAndReimport();

                count++;
            }
            //Debug.Log("Texture Compression Set!");
        }
        else
        {
            Debug.LogWarning("没有选中图片!");
        }
        Debug.Log($"一共处理了{count}张图片!");
    }

    /// <summary>
    /// 获取图片的分辨率,取分辨率中高宽的最大值,然后返回图片的【MaxSize】
    /// MaxSize的定义:assets->Image->【Texture2D ImportSettings】->【Override For WebGL】->【Max Size】 
    /// 区间:16,32,64,128,256,512,1024,2048,4096,8192,16384
    ///
    /// 举例:图片分辨率 = 12 * 24,那么图片的MaxSize = 32
    /// </summary>
    /// <param name="texture"></param>
    /// <returns></returns>
    static int GetMaxSize(Texture2D texture)
    {
        //分辨率区间的预备
        var start = new List<int> { 0, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384 };
        var end = new List<int> { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 100000 };
        var zones = start.Zip(end, (item1, item2) => (startIdx: item1, endIdx: item2)).ToList();

        //取分辨率高宽的最大值
        var size = new List<int> { texture.width, texture.height }.Max();  //取【宽】【高】中的最大值

        //判断所属的区间
        var maxSize = zones
            .First(x => x.startIdx <= size && size <= x.endIdx)
            .endIdx;
        //Debug.Log($"图的分辨率 = {texture.width} * {texture.height} size = {size}, MaxSize = {maxSize}");
        return maxSize;
    }
}

2、自动获取图片一键处理方式

关键代码【编辑器脚本使用】:文章来源地址https://www.toymoban.com/news/detail-767240.html

using System;
using UnityEngine;
using UnityEditor;
using System.Linq;
using System.IO;
using System.Collections.Generic;
class Example : EditorWindow
{
#if UNITY_EDITOR
    [MenuItem("模型处理/查找项目中所有的texture 2d对象并压缩")]
#endif
    static void FindAllTexture2D()
    {

        //****************************************参数设置区**********begin
        //TODO 做成EditWindow类型

        TextureImporterFormat format = TextureImporterFormat.ASTC_12x12; //图片压缩格式
        int compressionQuality = 60; //压缩比例
        string platform = "WebGL"; //发布的平台 

        //************************************************************end

        //查找工程文件中的所有精灵图片
        string[] guids = AssetDatabase.FindAssets("t:texture2d");
        Debug.Log($"Found {guids.Length} Texture2d assets.");
        foreach (string guid in guids)
        {
            try
            {
                string path = AssetDatabase.GUIDToAssetPath(guid);

                Debug.Log($"{path}");
                // 使用AssetDatabase加载Texture2D
                Texture2D texture = AssetDatabase.LoadAssetAtPath<Texture2D>(path);
                //Debug.Log($"{texture.name}");

                if (texture == null) continue;

                // 创建特定平台压缩实例
                TextureImporterPlatformSettings platformSettings = new TextureImporterPlatformSettings();
                platformSettings.overridden = true;
                platformSettings.name = platform;

                // 设置为压缩
                platformSettings.textureCompression = TextureImporterCompression.Compressed;

                // 设置压缩格式
                platformSettings.format = format; //TextureImporterFormat.ASTC_12x12;
                platformSettings.compressionQuality = compressionQuality; //40
                platformSettings.maxTextureSize = GetMaxSize(texture as Texture2D); //32

                //设置importSettings
                TextureImporter importer =
                    AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(texture)) as TextureImporter;
                if (importer == null) continue;

                importer.SetPlatformTextureSettings(platformSettings);

                //Apply 设置
                importer.SetPlatformTextureSettings(platformSettings);

                //保存资源
                importer.SaveAndReimport();
            }
            catch (Exception ex)
            {
                Debug.Log( $" ~~~~~error~~~~~ 设置报错:{ex.Message}");
            }
        }
    }

    /// <summary>
    /// 获取图片的分辨率,取分辨率中高宽的最大值,然后返回图片的【MaxSize】
    /// MaxSize的定义:assets->Image->【Texture2D ImportSettings】->【Override For WebGL】->【Max Size】 
    /// 区间:16,32,64,128,256,512,1024,2048,4096,8192,16384
    ///
    /// 举例:图片分辨率 = 12 * 24,那么图片的MaxSize = 32
    /// </summary>
    /// <param name="texture"></param>
    /// <returns></returns>
    static int GetMaxSize(Texture2D texture)
    {
        //分辨率区间的预备
        var start = new List<int> { 0, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384 };
        var end = new List<int> { 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 100000 };
        var zones = start.Zip(end, (item1, item2) => (startIdx: item1, endIdx: item2)).ToList();

        //取分辨率高宽的最大值
        var size = new List<int> { texture.width, texture.height }.Max();  //取【宽】【高】中的最大值

        //判断所属的区间
        var maxSize = zones
            .First(x => x.startIdx <= size && size <= x.endIdx)
            .endIdx;
        //Debug.Log($"图的分辨率 = {texture.width} * {texture.height} size = {size}, MaxSize = {maxSize}");
        return maxSize;
    }
}

到了这里,关于Unity减少发布打包文件的体积(二)——设置WebGL发布时每张图片的压缩方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue项目打包优化:缩小体积productionSourceMap设置,使用cdn加速

    一、vue项目打包体积大优化之productionSourceMap设置 1、productionSourceMap 的作用 productionSourceMap 在构建时生成完整的 SourceMap 文件,默认情况下开启。生产环境中启用 productionSourceMap 有助于开发者调试代码,可以在浏览器的调试工具中查看到源文件中错误的代码位置,而不是编译后

    2024年02月21日
    浏览(44)
  • Unity打包WebGL: 导入Vue

    1.1 任务 记录将 Unity 项目打包成 WebGL ,并集成到 Vue 项目中的过程。 1.2 环境 Unity : 2021.3 Vue : 2 2.1 UI 界面 2.2 添加插件 构建 WebGL 项目需要添加一个 .jslib 文件,用于 Unity 脚本函数与 JavaScript 函数交互 详细内容参考:Unity(WebGL)与JS通讯2022最新姿势 web.jslib 文件内容 2.3 添加脚

    2024年02月11日
    浏览(36)
  • Unity打包WebGL的优化常用操作?

    如果贴图格式时2048,在不影响画面效果的情况下,改成1024或者5#12,还可以缩小包体。 WebGL打包的时候分三种压缩情况: gzip:比Brotli文件打,但打包快,http和https都支持 Brotli:压缩格式最小,打包慢,只有谷歌和火狐支持。 Disabled:不压缩。 直接打包一份不压缩的版本,在

    2024年02月06日
    浏览(49)
  • Unity WebGL发布页面报错

    1、报错内容 Unable to parse Build/test.framework.js.gz! This can happen if build compression was enabled but web server hosting the content was misconfigured to not serve the file with HTTP Response Header \\\"Content-Encoding: gzip\\\" present. Check browser Console and Devtools Network tab to debug. 2、报错页面 解决方案,在Unity的WebGL Player S

    2024年02月16日
    浏览(39)
  • unity WebGL 发布服务后出错

    解决办法:需要在IIS中添加unity3d和unityweb两个mime 1、电脑怎么添加mime 2、UNITY3D WEBGL IIS发布添加MIME类型 我在添加unity3d和unityweb两个mime后 已经解决此问题

    2024年02月11日
    浏览(46)
  • unity发布WebGL遇到的坑(持续更新)

    1、unity默认字体在网页中不会显示 解决方法:自己新导入一个字体,使用导入的字体 2、之前打过包并运行过,后面又在unity中进行了修改,重新打包,运行发现还是修改之前的效果,虽然是新包, 解决方法:这是因为网页中有缓存, 点击浏览器右边的三个点,选择设置–隐

    2024年02月12日
    浏览(45)
  • 将WebGL打包的unity项目部署至Vue中

    创建一个空项目(或者直接使用现成的项目都可以)这里以该空项目为例子 注意: 如果你的unity项目中有文字,不需要使用unity默认的字体,需要更改它的字体,否则在最后生成的页面中会显示不出来文字 好在你的windows在C盘自带了字体,我这里使用的微软雅黑来进行了替换

    2024年02月02日
    浏览(35)
  • Unity发布webgl获取浏览器的URL

    Unity发布webgl之后获取浏览器的url 在unity中创建文件夹 Plugins ,然后添加添加文件 UnityGetBrowserURL.jslib 在Unity中添加代码 场景布局 发布webgl 拷贝到nginx 运行结果 在地址栏输入 Ip:端口号/?serligblsdhroivbaelirbgvkersab , /? 后面是随便打的字符,然后按下enter会刷新网页并重新显示URL,(

    2024年03月20日
    浏览(54)
  • unity webgl开发踩坑——从开发、发布到优化

    又是一个阳光明媚的早上,突然老板召集开会说要将一个android项目适配webgl,没办法赶紧用unity改一下踩踩坑;这里记录一下这些天的踩坑过程。 使用unity2021.3.4f1c1,visual studio2019,visual studio code videoplayer仅适用于安卓和PC,如果有苹果适配的需求的话,那就要用到这个插件:

    2024年02月02日
    浏览(43)
  • Unity 发布WebGL、去Logo、网络端通信 、本地运行

    以下内容将和大家详细分享 Unity 在 WebGL平台的发布方法、 如何去除unity的Logo和加载界面、 WebGL与网络端通信 、以及 如何在本地运行html。 一、Unity在 WebGL平台的发布方法 1、如下图,选择webgl平台,没安装的点击下载安装。  安装后如图。  选择需要打包的场景,无特殊要求

    2024年02月06日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包