unity3d 场景文件压缩_unity3d 压缩so文件 - CSDN
  • Unity3d压缩文件

    2015-10-22 15:35:00
    申明:本文转载:... 的内容,本声明以示尊重作者! ...之前提到过通过AssetBundle.CreateFromFile读取本地AssetBundle,因为该方法只能读取未压缩的AssetBundle,所以打包AssetBundle时,需要选择BuildAsset

    申明:本文转载:http://blog.csdn.net/chenggong2dm/article/details/24488469 的内容,本声明以示尊重作者!


    之前提到过通过AssetBundle.CreateFromFile读取本地AssetBundle,因为该方法只能读取未压缩的AssetBundle,所以打包AssetBundle时,需要选择BuildAssetBundleOptions.UncompressedAssetBundle未压缩模式,然后使用LZMA或GZIP压缩后上传服务器。本地下载后需要解压缩保存在Application.persistentDataPath目录下。

    下面说明如何压缩AssetBundle。

    首先需要下载7-zip的C#核心文件,下载地址http://www.7-zip.org/sdk.html


    解压后将CS文件夹下的7zip文件夹导入Unity工程,下面是一个Demo,可以直接用。
    [csharp] view plaincopy在CODE上查看代码片派生到我的代码片
    1. using UnityEngine;  
    2. using System.Collections;  
    3. using UnityEditor;  
    4. using SevenZip.Compression.LZMA;  
    5. using System.IO;  
    6. using System;  
    7.   
    8. // 压缩或解压文件  
    9. public class CompressAndDecompress : Editor {  
    10.   
    11.     // 压缩Unity3D文件  
    12.     [MenuItem("Compress/Compress Unity3D File")]  
    13.     static void CompressUnity3DFile()  
    14.     {  
    15.         string path = EditorUtility.OpenFilePanel("Compress file""""unity3d");  
    16.         CompressFile(path);  
    17.     }  
    18.   
    19.     // 压缩Lua文件  
    20.     [MenuItem("Compress/Compress Lua File")]  
    21.     static void CompressLuaFile()  
    22.     {  
    23.         string path = EditorUtility.OpenFilePanel("Compress file""""lua");  
    24.         CompressFile(path);  
    25.     }  
    26.   
    27.     // 压缩文件  
    28.     static void CompressFile(string path)  
    29.     {  
    30.         if (path.Length != 0)  
    31.         {  
    32.             int lastDotIndex = path.LastIndexOf(".");  
    33.             string outputPath = path.Substring(0, lastDotIndex + 1) + "zip";  
    34.             CompressFileLZMA(path, outputPath);  
    35.             AssetDatabase.Refresh();  
    36.             EditorUtility.DisplayDialog("压缩文件""文件已压缩完成""确认");  
    37.         }  
    38.     }  
    39.   
    40.     // 解压Unity3D文件  
    41.     [MenuItem("Compress/Decompress Unity3D File")]  
    42.     static void DecompressUnity3DFile()  
    43.     {  
    44.         DecompressFile("unity3d");  
    45.     }  
    46.   
    47.     // 解压Lua文件  
    48.     [MenuItem("Compress/Decompress Lua File")]  
    49.     static void DecompressLuaFile()  
    50.     {  
    51.         DecompressFile("lua");  
    52.     }  
    53.   
    54.     static void DecompressFile(string extension)  
    55.     {  
    56.         string path = EditorUtility.OpenFilePanel("Decompress file""""zip");  
    57.   
    58.         if (path.Length != 0)  
    59.         {  
    60.             int lastDotIndex = path.LastIndexOf(".");  
    61.             string outputPath = path.Substring(0, lastDotIndex + 1) + extension;  
    62.             DecompressFileLZMA(path, outputPath);  
    63.             AssetDatabase.Refresh();  
    64.             EditorUtility.DisplayDialog("解压文件""文件已解压完成""确认");  
    65.         }  
    66.     }  
    67.   
    68.     // 压缩文件夹中的文件  
    69.     [MenuItem("Compress/Compress Files In Directory")]  
    70.     static void CompressFilesInDirectory()  
    71.     {  
    72.         string path = EditorUtility.OpenFolderPanel("Compress Files In Directory""""");  
    73.   
    74.         if (path.Length != 0)  
    75.         {  
    76.             DirectoryInfo source = new DirectoryInfo(path);  
    77.             DirectoryInfo target = new DirectoryInfo(path + "_compress");  
    78.   
    79.             if (target.Exists)  
    80.             {  
    81.                 target.Delete(true);  
    82.             }  
    83.   
    84.             target.Create();  
    85.             target.Refresh();  
    86.   
    87.             // 复制源文件夹到目标文件夹  
    88.             CopyAll(source, target);  
    89.             ListFiles((FileSystemInfo)target, true);  
    90.             EditorUtility.DisplayDialog("压缩文件夹""文件夹中所有的文件已压缩完成""确认");  
    91.         }  
    92.     }  
    93.   
    94.     // 解压文件夹中的文件  
    95.     //[MenuItem("Compress/Decompress Files In Directory")]  
    96.     static void DecompressFilesInDirectory()  
    97.     {  
    98.         string path = EditorUtility.OpenFolderPanel("Decompress Files In Directory""""");  
    99.   
    100.         if (path.Length != 0)  
    101.         {  
    102.             DirectoryInfo source = new DirectoryInfo(path);  
    103.             DirectoryInfo target = new DirectoryInfo(path + "_decompress");  
    104.   
    105.             if (target.Exists)  
    106.             {  
    107.                 target.Delete(true);  
    108.             }  
    109.   
    110.             target.Create();  
    111.             target.Refresh();  
    112.   
    113.             // 复制源文件夹到目标文件夹  
    114.             CopyAll(source, target);  
    115.             ListFiles(target, false);  
    116.             EditorUtility.DisplayDialog("解压文件夹""文件夹中所有的文件已解压完成""确认");  
    117.         }  
    118.     }  
    119.   
    120.     // 使用LZMA算法压缩文件  
    121.     private static void CompressFileLZMA(string inFile, string outFile)  
    122.     {  
    123.         Encoder coder = new Encoder();  
    124.         FileStream input = new FileStream(inFile, FileMode.Open);  
    125.         FileStream output = new FileStream(outFile, FileMode.Create);  
    126.   
    127.         coder.WriteCoderProperties(output);  
    128.   
    129.         byte[] data = BitConverter.GetBytes(input.Length);  
    130.   
    131.         output.Write(data, 0, data.Length);  
    132.   
    133.         coder.Code(input, output, input.Length, -1, null);  
    134.         output.Flush();  
    135.         output.Close();  
    136.         input.Close();  
    137.     }  
    138.   
    139.     // 使用LZMA算法解压文件  
    140.     private static void DecompressFileLZMA(string inFile, string outFile)  
    141.     {  
    142.         Decoder coder = new Decoder();  
    143.         FileStream input = new FileStream(inFile, FileMode.Open);  
    144.         FileStream output = new FileStream(outFile, FileMode.Create);  
    145.   
    146.         byte[] properties = new byte[5];  
    147.         input.Read(properties, 0, 5);  
    148.   
    149.         byte[] fileLengthBytes = new byte[8];  
    150.         input.Read(fileLengthBytes, 0, 8);  
    151.         long fileLength = BitConverter.ToInt64(fileLengthBytes, 0);  
    152.   
    153.         coder.SetDecoderProperties(properties);  
    154.         coder.Code(input, output, input.Length, fileLength, null);  
    155.         output.Flush();  
    156.         output.Close();  
    157.         input.Close();  
    158.     }  
    159.   
    160.     // 复制源文件夹到目标文件夹  
    161.     public static void CopyAll(DirectoryInfo source, DirectoryInfo target, ArrayList extensions = null)  
    162.     {  
    163.         if (source.FullName.ToLower() == target.FullName.ToLower())  
    164.         {  
    165.             return;  
    166.         }  
    167.   
    168.         // 检测目标文件是否存在,如果不存在,则创建  
    169.         if (!Directory.Exists(target.FullName))  
    170.         {  
    171.             Directory.CreateDirectory(target.FullName);  
    172.             target.Refresh();  
    173.         }  
    174.   
    175.         // 复制文件至目标文件夹  
    176.         foreach (FileInfo fi in source.GetFiles())  
    177.         {  
    178.             if (extensions == null || extensions.Count == 0)  
    179.             {  
    180.                 if (fi.Extension != ".meta")  
    181.                 {  
    182.                     fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);  
    183.                 }  
    184.             }  
    185.             else  
    186.             {  
    187.                 if (extensions.Contains(fi.Extension))  
    188.                 {  
    189.                     fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);  
    190.                 }  
    191.             }  
    192.               
    193.         }  
    194.   
    195.         // 使用递归复制子文件夹  
    196.         foreach (DirectoryInfo sourceSubDir in source.GetDirectories())  
    197.         {  
    198.             DirectoryInfo targetSubDir = target.CreateSubdirectory(sourceSubDir.Name);  
    199.             CopyAll(sourceSubDir, targetSubDir, extensions);  
    200.         }  
    201.     }  
    202.   
    203.     // 遍历文件夹中的所有文件,压缩或解压缩  
    204.     public static void ListFiles(FileSystemInfo info, bool isCompress)  
    205.     {  
    206.         if (!info.Exists)  
    207.         {  
    208.             return;  
    209.         }  
    210.   
    211.         DirectoryInfo dir = info as DirectoryInfo;  
    212.   
    213.         // 不是目录  
    214.         if (dir == null)  
    215.         {  
    216.             return;  
    217.         }  
    218.   
    219.         FileSystemInfo[] files = dir.GetFileSystemInfos();  
    220.   
    221.         for (int i = 0; i < files.Length; i++)  
    222.         {  
    223.             FileInfo file = files[i] as FileInfo;  
    224.   
    225.             // 是文件  
    226.             if (file != null)  
    227.             {  
    228.                 string fullName = file.FullName;  
    229.   
    230.                 // 如果是压缩文件  
    231.                 if (isCompress)  
    232.                 {  
    233.                     if (file.Extension == ".unity3d" || file.Extension == ".lua")  
    234.                     {  
    235.                         string outputPath = file.FullName.Replace(file.Extension, ".zip");  
    236.                         CompressFileLZMA(fullName, outputPath);  
    237.                         File.Delete(fullName);  
    238.                     }  
    239.                 }  
    240.                 // 如果是解压文件  
    241.                 else  
    242.                 {  
    243.                     if (file.Extension == ".zip")  
    244.                     {  
    245.                         string outputPath = file.FullName.Replace(file.Extension, ".unity3d");  
    246.                         DecompressFileLZMA(fullName, outputPath);  
    247.                         File.Delete(fullName);  
    248.                     }  
    249.                 }  
    250.   
    251.             }  
    252.             else  
    253.             {  
    254.                 ListFiles(files[i], isCompress);  
    255.             }  
    256.         }  
    257.     }  
    258. }  
    展开全文
  • UNITY3D 贴图格式压缩说明关于压缩后的在储存上的大小,假设高清(ARGB32)大小为1,那么大概数据如下:RGB PVRTC 4BITS:0.25ARGB PVRTC 4BITS:0.25RGB PVRTC 2BITS:0.13ARGB PVRTC 2BITS:0.13RGBA ETC2 4BITS:0.25...

    UNITY3D 贴图格式压缩说明

    关于压缩后的在储存上的大小,假设高清(ARGB32)大小为1,那么大概数据如下:

    RGB PVRTC 4BITS:0.25

    ARGB PVRTC 4BITS:0.25

    RGB PVRTC 2BITS:0.13

    ARGB PVRTC 2BITS:0.13

    RGBA ETC2 4BITS:0.25

    RGBA ETC2 8BITS:0.25

    RGB + 1-bit ALPHA ETC2 8BITS:0.2

    DXT1 :0.3

    DXT5 : 0.6

    ARGB 16BITS:0.33

    RGB 16BITS:0.5

    RGB 24BITS:0.85

    ARGB 32BITS:1

    当然每个都是根据图片不一样而不一样的,以上只是大致数据并非准确数据。

    测试方法:单独为改为这样贴图格式的文件打成ASSETBUNDLE看大小。

    对此抱有比较大疑问的是ARGB 16 和RGB 16,感觉可能这里U3D的BUNDLE有BUG。

    内存中的大小,假设高清(ARGB32)大小为1,那么大概数据如下:

    RGB PVRTC 2BITS:0.0625

    ARGB PVRTC 2BITS:0.0625

    RGB PVRTC 4BITS:0.125

    ARGB PVRTC 4BITS:0.125

    RGBA ETC2 4BITS:0.125

    RGBA ETC2 8BITS:0.25

    RGB + 1-bit ALPHA ETC2 8BITS:0.125

    DXT1 :0.125

    DXT5 : 0.25

    ARGB 16BITS:0.5

    RGB 16BITS:0.5

    RGB 24BITS:0.8

    ARGB 32BITS:1


    建议如下:

    一般来说3D游戏我们压缩贴图的时候会把贴图分为UI贴图和场景模型贴图来考虑,主要是因为有多重采样的缘故。3D游戏一般来说都是受摄像机远近大小改变而采取不同的采样大小,假设不设置多重纹理采样的话,在远处会有非常多的白色噪点。

    2D游戏的话,所有都不需要勾选多重采样,具有3D性质的贴图,我们都需要勾选上GENERATE MIP MAPS,这样会使贴图大小增加25%这样。

    正方贴图与非正方贴图也要区分。非正方贴图只有16位的压缩(相当于真彩色减半),所以最好游戏中都是正方的贴图。以下是个人选择贴图压缩格式遵循的一些规则,大家可以参考下,若有问题可以一起交流一下。

    正方贴图:

    IOS下:

    a.普通不透明:RGB PVRTC 4BITS

    b.普通透明:RGBA PVRTC 4BITS

    Android下:

    a.普通不透明:RGB ETC 4BITS

    b.普通透明:

    因为没有通用最兼容的格式,所以一般情况是用RGBA 16BIT或有针对性的选择DXT5/ATC8 BITS/ETC2 8BITS。如果有技术支持,可以采用RGB ETC 4BITS加一张ALPHA 8的贴图来实现透明效果。

    非正方贴图:

    一般采用16位压缩,16位会带来颜色损失,但如果本来美术就是按16BITS画的话,就不会损失,日本好些手游都是按16BITS来画的。这样的游戏一般少渐变艳度高比较容易看出来。

    a.不透明贴图: RGB 16BITS

    d.透明贴图:RGBA 16BITS

    高清不压缩贴图:

    RGBA 32BIT

    另外:

    对于不重要的贴图,模糊度低的贴图,建议不仅要采取像素压缩,还要直接压缩其大小。如光照贴图压到512或256。如背景原本1024的图直接压到256。玩家不注意到就可以了。

    展开全文
  • unity 3d 资源解包

    2020-07-30 23:30:30
    命令行工具,可以解包unity的 .assets 和 .unity3d 文件,把里面的模型、音效、贴图都提取出来。 使用前,请确保按照 JDK ,并配置好相关环境。亲测可用!! 具体用法请看 README.md 文件。 示例,以下命令可以...
  • Unity3D之如何将包大小减少到极致,图片是游戏app里最最占空间的资源,所以请各位还没有理解u3d对图片文件存储方式理解的请看《unity3d-texture图片空间和内存占用分析》。因为u3d对资源的压缩并不阐述的十分详细,...

    Unity3D之如何将包大小减少到极致,图片是游戏app里最最占空间的资源,所以请各位还没有理解u3d对图片文件存储方式理解的请看《unity3d-texture图片空间和内存占用分析》。因为u3d对资源的压缩并不阐述的十分详细,所以很多项目在遇到包大小瓶颈时非常头疼。我也不是神仙,也同样痛苦过,但经历几个项目的折腾,最终能梳理出一套能将u3d包大小减少到合理范围的方法。

    首先来展示下,官方如何说的:

    http://docs.unity3d.com/Manual/ReducingFilesize.html 官方手册)

    1.替换jpg,使用psd,减少重复资源

    2.剔除不必要的资源

    3.打包时查看log纪录,由此判断需要减少的文件类型

    4.优化,压缩图片,减少图片大小

    5.优化,压缩网格和动画,减少文件大小

    6.剔除system.dll和system.xml.dll ,尽量不要依赖他们,或用其他组件来代替。

    这些官方解释对我们帮助甚少。我把包分成三段:1.首包(里面包含了最最必要的资源)。2.首次进入包加载(加载游戏运行必要的资源)。3.游戏运行中资源加载(按每个游戏不同各自定义,以场景和单位个体为主要,在画面进入时加载资源,加载结束后再运行并显示)。

    关于u3d的AssetBundle资源加载与打包封装,请查看《unity3d之assetbundle资源加载封装》这篇文章。

    下面说说关于动态资源加载和资源导入内存的所有方式,这是优化资源的必要条件,因为只有你知道了所有的加载和导入途径你才能对项目资源优化进行全面的分析。知道了有哪几条路你才能选择一条最好的。如下:

    利用动态资源加载有几种方式:

    1.将资源放入assetstream文件夹随打包一起打入文件。

    2.将部分资源放在服务器,游戏前或游戏中进行加载,并保存到本地。

    3.将资源压缩成多个zip文件放在服务器,客户端下载这些zip文件合成一个zip文件进行解压。

    其实www.LoadFromCacheOrDownload加载机制也可以算一种,但好像u3d4.5.2开始已经摒弃这个接口,不再开放,因为它也开始意识到这个接口容易给人造成误解,而且不好用。

    资源导入内存的方式有几种:

    1.从Resources文件夹中导入。这是阻塞加载最常见的方式,接口Resources.Load();

    2.从某地址加载资源www。这是异步加载最常见方式,接口new www(path);

    3.直接从文件或者bytes[]生成AssetBundl,接口:AssetBundle.CreateFromFile阻塞方法, AssetBundle.CreateFromMemory异步方法,AssetBundle.CreateFromMemoryImmediate阻塞方法

    4.使用File类加载文件,File.ReadAllBytes,File.ReadAllText。

    有了资源加载和内存导入后,还需要配备资源验证方式,这样整个项目动态加载体制才完善。资源版本更新方式可以使用json格式并以文件形式查看。验证方式的理解,还需要大家使用在项目里才能体会到真正的用途,才能将原理牢记于心。

    验证资源版本有几种:

    1.资源整体验证。步骤:1.客户端向服务器发送资源版本。2.服务器匹配最近版本号,若版本号不同,比较两个版本号之间的内容差异,发送差异资源地址。3.客户端删除差异内容中需要删除的文件资源,加载需要下载的文件资源并保存文件。最后保存版本号。

    2.单个资源文件的时间戳验证。步骤:1.客户端向服务器发送资源版本号。2.服务器匹配最新版本号,如果不同就重新发送一份资源版本列表,里面包含了资源文件的时间戳。3.保存版本列表。4.在客户端需要加载该资源时比较时间戳是否一致,如果不一样或这不存在就加载资源文件并保存固定时间戳。

    3.单个资源文件md5验证。步骤:1.客户端向服务器发送资源版本号。2.服务器匹配最新版本号,如果不同重新发送一分资源版本列表,里面包含了资源文件的md5码。3.客户端比较新旧资源版本列表中的,删除需要删除的和更新的资源。4.在客户端需要加载该资源时查看文件是否存在,如果存在就说明资源是最新的。如果不存在则需要实时下载。

    展开全文
  • 配套博文:《【浅墨Unity3D Shader编程】之一 游戏场景的创建 & 第一个Shader的书写》 博文链接:http://blog.csdn.net/poem_qianmo/article/details/40723789 说明 --------------------------------------------...
  • unity3d 减少文件大小

    2014-12-22 21:54:10
    Unity 始终后处理导入的文件,因此,在使用多层 psd 文件代替 jpg 储存文件,对将要部署的播放器大小没有任何影响。保存文件为正在使用的格式(例如 .mb 文件、.psd 文件、.tiff文件)将使得工作更加轻松简单。 ...

    减少文件大小

    Unity 后处理所有导入的资源

    Unity 始终后处理导入的文件,因此,在使用多层 psd 文件代替 jpg 储存文件,对将要部署的播放器大小没有任何影响。保存文件为正在使用的格式(例如 .mb 文件、.psd 文件、.tiff文件)将使得工作更加轻松简单。

    Unity 剔除未使用的资源

    工程文件夹中的资源数量不会影响所构建播放器的大小。Unity 可以非常智能地检测哪些资源已在游戏中使用,而哪些没有使用。Unity 在构建游戏之前会跟踪所有资源的引用,并生成一个需要包含在游戏中的资源列表。因此,可以将未使用的资源安全保存在工程文件夹中。

    Unity 输出已使用文件大小的概述

    Unity 完成构建播放器之后,将输出概览,说明占据最大文件尺寸的资源类型,它也将输出包含在游戏构建中的资源。只需打开编辑器控制台日志便可查看:单击控制台窗口(窗口 (Window) -> 控制台 (Console))中的打开编辑器日志 (Open Editor Log) 按钮。

    文件标题不属于资源,但代表用来维持资源引用和设置的数据,如资源资产。换言之,它是文件中除原始数据内容以外的附加数据。通常,它占据的比例很小,如果数值较大,就应该检查资源 (Resources) 文件夹中是否包含资产。如果是,可以将部分或所有文件移出文件夹。可以切换到使用资源包 (AssetBundles) 以动态加载资源。

    优化纹理尺寸

    通常纹理会在构建中占用大量空间。首先要做的是在可能的地方压缩纹理格式(DXT(台式机平台)或 PVRTC)。

    如果压缩之后纹理尺寸依然没有变小,请试着减少纹理的大小。这里有个技巧:不需要修改实际的源内容,只需在项目视图的导入设置 (Import Settings) 菜单下选择最大纹理尺寸 (Max Texture Size)。这样就可以放大使用此纹理的对象,然后调整最大纹理尺寸 (Max Texture Size),直到对象在场景视图 (Scene View) 中画质变差为止。


    更改最大纹理尺寸不会影响纹理资源,它只会影响游戏的分辨率

    纹理究竟占用多少内存?

    Unity3D技术之Advanced减少文件大小详解 - 第3张  | 游戏开发网-最好的游戏编程开发技术网站! Desktop

    压缩 内存消耗
    RGB Compressed DXT1 0.5 bpp (bytes/pixel)
    RGBA Compressed DXT5 1 bpp
    RGB 16bit 2 bpp
    RGB 24bit 3 bpp
    Alpha 8bit 1 bpp
    RGBA 16bit 2 bpp
    RGBA 32bit 4 bpp

    Unity3D技术之Advanced减少文件大小详解 - 第4张  | 游戏开发网-最好的游戏编程开发技术网站! iOS

    压缩 内存占用
    RGB Compressed PVRTC 2 bits 0.25 bpp (bytes/pixel)
    RGBA Compressed PVRTC 2 bits 0.25 bpp
    RGB Compressed PVRTC 4 bits 0.5 bpp
    RGBA Compressed PVRTC 4 bits 0.5 bpp
    RGB 16bit 2 bpp
    RGB 24bit 3 bpp
    Alpha 8bit 1 bpp
    RGBA 16bit 2 bpp
    RGBA 32bit 4 bpp

    Unity3D技术之Advanced减少文件大小详解 - 第5张  | 游戏开发网-最好的游戏编程开发技术网站! Android

    压缩 内存占用
    RGB Compressed DXT1 0.5 bpp (bytes/pixel)
    RGBA Compressed DXT5 1 bpp
    RGB Compressed ETC1 0.5 bpp
    RGB Compressed PVRTC 2 bits 0.25 bpp (bytes/pixel)
    RGBA Compressed PVRTC 2 bits 0.25 bpp
    RGB Compressed PVRTC 4 bits 0.5 bpp
    RGBA Compressed PVRTC 4 bits 0.5 bpp
    RGB 16bit 2 bpp
    RGB 24bit 3 bpp
    Alpha 8bit 1 bpp
    RGBA 16bit 2 bpp
    RGBA 32bit 4 bpp

    纹理总大小:宽 * 高 * bpp。 如果使用 Mipmap 增加 33%。

    默认情况下,Unity 会在导入时对纹理进行压缩。为了加速工作,可以在首选项 (Preferences) 中关闭此功能。但在构建游戏时,所有尚未被压缩的纹理都将被重新压缩。

    优化网格和动画尺寸

    您可以压缩网格和导入的动画片段,以便在游戏文件中占用较小的空间。压缩可以在网格导入设置 (Mesh Import Settings) 中打开。

    网格和动画压缩使用量化,这意味着它会占用较小的空间,但压缩可能产生一些误差。应通过实验确定哪个级别的压缩是模型可以接受的。

    请注意:网格压缩只会产生较小的数据文件,在运行时不会使用较少内存。动画的关键帧 (Keyframe) 减少可以产生较小的数据文件,并在运行时使用较少的内存,一般都应该使用关键帧减少。

    此外,您可以选择不把法线和/或切线存储在网格中,这样可以节约运行时在游戏构建和内存中占用的空间。可以在网格导入设置 (Mesh Import Settings) 中的切线空间生成 (Tangent Space Generation) 下拉菜单中进行设置。经验法则:

    • 切线用于法线贴图。如果不使用法线贴图,则无需在网格中存储这些切线。
    • 法线用于照明。如果某些网格不使用实时照明,则无需将法线存储在网格中。

    减少播放器包含的 dll 文件

    在构建播放器时(台式机、Android 或 iOS)有一点非常重要,也就是不要依赖 System.dll 或 System.Xml.dll。Unity 的播放器安装中不包含 System.dll 或 System.Xml.dll。这意味着,如果想要使用 Xml 或 System.dll 中的通用容器,那么必要的 dll 文件将包含在播放器中。这通常使得下载文件大小增加 1mb,这显然无益于播放器的分发,因而应该避免使用。如需解析一些 Xml 文件,可以使用更小的 xml 库,如 Mono.Xml.zip。大多数通用容器都包含在 mscorlib 中,Stack<> 和其他一小部分位于 System.dll。因此,应该尽量避免。


    正如所见,Unity 在构建播放器时包含了 System.Xml.dll 和 System.dll。

    在播放器分发包中,Unity 包含了如下的 DLL:mscorlib.dll、Boo.Lang.dll、UnityScript.Lang.dll 和 UnityEngine.dll。

    展开全文
  • Unity 模型压缩

    2018-01-24 17:31:02
    模型压缩 using UnityEngine; using UnityEditor; using System.IO; using System.Collections.Generic; //using Babybus.Framework.Serialization; using System.Text; public class MoodelCheck { [MenuItem...
  • 原创文章如需转载请注明转载自 脱莫柔Unity3D学习之旅 本文链接地址 Unity3D 声音格式和导入文件类型转换属性音频侦听器 Audio Listener音频源 Audio Source 属性 D声音设置3D Sound SettingsD声音设置2D...
  • unity 3D里有两种动态加载机制: 一是Resources.Load; 一是通过AssetBundle; 其实两者本质上没有什么区别。Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你...
  • 因为有不少人都问过我压缩格式的问题,今天飞哥又重新提醒了一次。整理一下发个贴,以供大家查阅和讨论。 各种纹理格式,大家参照下U3D MANUAL里面的具体描述介绍,这是官方的东西。...http://docs.unity3d.
  • Unity3d资源管理分析

    2017-06-26 22:48:50
    转自:Unity3d资源管理分析 基本信息 美术资源应导出为AssetBundle文件。这种AssetBundle有两种存储方式:可以是未压缩的,也可以使用7z算法压缩,默认压缩。以我手头的一个蒙皮动画角色为例,压缩文件大小由...
  •  Scene【场景面板】:该面板为Unity3D的编辑面板;你可以将你所有的模型、灯光、以及其他材质对象拖放到该场景中。构建游戏中所能呈现景象。  Game【游戏面板】:与场景面板不同,该面板是用来渲染场景面板中...
  • 要学会如何优化Unity3D的贴图,首先要了解Unity3D图片上的各项设置大概是干嘛的,修改之后会导致什么样的变化。另外,贴图资源在Unity3D中占用的内存大小不等于文件本身的大小,而是与贴图资源的设置有关,不论你放...
  • Alpha 测试 与桌面机不同,iOS 设备在进行alpha测试(或在像素着色器中使用丢弃和裁剪操作)时会造成很高的性能开销。所以,如果可以的话,您应该尽可能地用alpha混合替换alpha测试。如果alpha测试不能避免,那么...
  • 在flash时代,资源的动态加载非常的普遍,主要是受限于网速的快慢,我们在用unity3d制作在线项目的时候,不可避免的要考虑到优化加载的问题,这篇文章算是比较好的经验之谈了,转来大家看看!用Unity3D制作基于web的...
  • 原创文章如需转载请注明:转载自 脱莫柔Unity3D学习之旅 QQ群:【119706192】本文链接地址: Unity3D 声音格式和导入 Unity支持压缩的和原生的音频。任何类型的文件(MP3/Ogg Vorbis的除外),最初都以原生...
  • Unity3D 导入资源

    2020-06-22 14:37:23
    打开Unity3D的:window-asset store 就会出来这样的界面: 我们选择一个天空纹理,注意这里的标签只有一个,如果有多个就会显示所有标签的内容: 找个比较小的免费的下载一下试试,比如这个: 下载以后...
  • 1.首先我们创建俩场景用于切换。 2.编辑俩脚本。 脚本1(放入Editor文件夹):可以在unity菜单栏的Assets下方找到Build AssetBundle MyScene。如下图: CreatAssetsBundle: using UnityEngine; using System....
  • Unity3D常见面试题

    2017-08-11 20:20:00
    Unity3D常见面试题
  • 对于Unity,虽然Unity自身会进行压缩加密,但是其解密算法在网上随处可见,如果自己觉得游戏里面的资料具有保密性质,请对其进行自行加密。 本文只是讲述一下过程,采用很简单的打包加密方法,至于需要什么样的加密...
1 2 3 4 5 ... 20
收藏数 3,009
精华内容 1,203
关键字:

unity3d 场景文件压缩