Unity3D研究院之加密Assetbundle不占内存(一百零五)

栏目: 后端 · 发布时间: 4年前

内容简介:AssetBundle.LoadFromMemory基本上是无法在手机上用的,因为要多占一份内存,所以大多Unity项目都不进行资源加密。Unity2017.2提供了一个新的API AssetBundle.LoadFromStream,通过名字就可以知道它是流加载,那么就不会像AssetBundle.LoadFromMemory那样多占一份很大的内存了。打包Assetbundle的同时生成加密文件的两个文件分别加载它。

AssetBundle.LoadFromMemory基本上是无法在手机上用的,因为要多占一份内存,所以大多Unity项目都不进行资源加密。

Unity2017.2提供了一个新的API AssetBundle.LoadFromStream,通过名字就可以知道它是流加载,那么就不会像AssetBundle.LoadFromMemory那样多占一份很大的内存了。

打包Assetbundle的同时生成加密文件的两个文件分别加载它。

myab.unity3d

encypt_myab.unity3d

    [MenuItem("Tools/BuildAB")]
    static void BuildAB() 
    {
        FileUtil.DeleteFileOrDirectory(Application.streamingAssetsPath);
        Directory.CreateDirectory(Application.streamingAssetsPath);
        var manifest  = BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.ChunkBasedCompression | BuildAssetBundleOptions.ForceRebuildAssetBundle, BuildTarget.iOS);
        foreach (var name in manifest.GetAllAssetBundles())
        {
            var uniqueSalt = Encoding.UTF8.GetBytes(name);
            var data = File.ReadAllBytes(Path.Combine(Application.streamingAssetsPath, name));
            using (var myStream = new MyStream(Path.Combine(Application.streamingAssetsPath, "encypt_" + name),FileMode.Create))
            {
                myStream.Write(data, 0, data.Length);
            }
        }
        AssetDatabase.Refresh();
    }

这里测试的Assetbundle一共有20M, 使用LZ4压缩格式。

加密和解密我这里随便写个简单的异或 ^ 。后面也可以用一些更好的算法,总之加密可以慢,但是解密一定要快。

using System.IO;
 
public class MyStream : FileStream
{
 
    const byte KEY = 64;
    public MyStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, bool useAsync) : base(path, mode, access, share, bufferSize, useAsync)
    {
    }
    public MyStream(string path, FileMode mode) : base(path, mode)
    {
    }
    public override int Read(byte[] array, int offset, int count)
    {
        var index =  base.Read(array, offset, count);
        for (int i = 0 ; i < array.Length; i++)
        {
            array[i] ^= KEY;
        }
        return index;
    }
    public override void Write(byte[] array, int offset, int count)
    {
        for (int i = 0; i < array.Length; i ++)
        {
            array[i] ^= KEY;
        }
        base.Write(array, offset, count);
    }
}

界面上放两个Image 分别加载它。

using System.IO;
using UnityEngine;
using UnityEngine.UI;
 
public class TestStream : MonoBehaviour
{
    [Header("是否启用Stream加载")]
    public bool isStream = true;
    float m_LoadTime ;
    void Start()
    {
        if (isStream)
        {
            float t = Time.realtimeSinceStartup;
            using (var fileStream = new MyStream(Application.streamingAssetsPath + "/encypt_myab.unity3d", FileMode.Open, FileAccess.Read, FileShare.None, 1024 * 4, false))
            {
                var myLoadedAssetBundle = AssetBundle.LoadFromStream(fileStream);
                m_LoadTime = Time.realtimeSinceStartup - t;
                GetComponent<Image>().sprite = myLoadedAssetBundle.LoadAsset<Sprite>("1");
                myLoadedAssetBundle.Unload(false);
            }
        }
        else
        {
            float t = Time.realtimeSinceStartup;
            var myLoadedAssetBundle = AssetBundle.LoadFromFile(Application.streamingAssetsPath + "/myab.unity3d");
            m_LoadTime = Time.realtimeSinceStartup - t;
            GetComponent<Image>().sprite = myLoadedAssetBundle.LoadAsset<Sprite>("1");
            myLoadedAssetBundle.Unload(false);
        }
    }
 
    private void OnGUI()
    {
        if (isStream)
        {
            GUILayout.Label(string.Format("<size=50>\nAssetBundle.LoadFromStream :{0} </size>", m_LoadTime));
        }
        else
        {
            GUILayout.Label(string.Format("<size=50>AssetBundle.LoadFromFile :{0} </size>", m_LoadTime));
        }
 
    }
}

如下图所示,在iPhone7上,基本上加载时间差不多。

Unity3D研究院之加密Assetbundle不占内存(一百零五)

加密以后资源就无法被打开了。

Unity3D研究院之加密Assetbundle不占内存(一百零五)

注意:Android下的streamingAssets目录不能使用,因为android下是放在jar里并不是文件系统。一定要用的话需要拷贝到 Application.persistentDataPath下。

雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!

最后编辑:

作者:雨松MOMO

专注移动互联网,Unity3D游戏开发

站内专栏 QQ交谈 腾讯微博 新浪微博

捐 赠 如果您愿意花20块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

硅谷热

硅谷热

埃弗雷特.M.罗杰斯 / 范国鹰 等 / 1985.8 / 经济科学出版社 / 1.9

《硅谷热》总共分三部分。第一部分为“硅谷的崛起”,以苹果电脑的传奇故事为主线,讲述了硅谷的发展历史。第二部分为“高技术文明”,从风险投资、创业故事、人物传奇等各个方面描绘了硅谷的生态状况。第三部分为“硅谷的明天”,讲述了硅谷模式在全球的扩散、硅谷面临的全球竞争和深远影响。 书中,硅谷这场传奇的主要角色:人物、公司、技术、产品等都综合在其中,一锅子端给了嗷嗷待哺的人们:PC革命、半导体传奇、软......一起来看看 《硅谷热》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

html转js在线工具
html转js在线工具

html转js在线工具