内容简介: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上,基本上加载时间差不多。
加密以后资源就无法被打开了。
注意:Android下的streamingAssets目录不能使用,因为android下是放在jar里并不是文件系统。一定要用的话需要拷贝到 Application.persistentDataPath下。
- 本文固定链接: https://www.xuanyusong.com/archives/4607
- 转载请注明:雨松MOMO 于雨松MOMO程序研究院 发表
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
捐 赠 如果您愿意花20块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- Bitker研究院:加密犯罪报告--解密日益复杂的黑客攻击、暗网市场及骗局(一)
- 巨头们的AI研究院战事
- 清华人工智能研究院成立「知识智能研究中心」,发布四大知识平台
- AWS在上海成立人工智能研究院
- 微软亚洲研究院:NLP将迎来黄金十年
- 微软亚洲研究院27篇论文入选AAAI 2019
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Chinese Authoritarianism in the Information Age
Routledge / 2018-2-13 / GBP 115.00
This book examines information and public opinion control by the authoritarian state in response to popular access to information and upgraded political communication channels among the citizens in co......一起来看看 《Chinese Authoritarianism in the Information Age》 这本书的介绍吧!