博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
unity3d 加密资源并缓存加载
阅读量:4622 次
发布时间:2019-06-09

本文共 3754 字,大约阅读时间需要 12 分钟。

首先要鄙视下unity3d的文档编写人员极度不负责任,到发帖为止依然没有更新正确的示例代码。

// C# Example    // Builds an asset bundle from the selected objects in the project view.    // Once compiled go to "Menu" -> "Assets" and select one of the choices    // to build the Asset Bundle        using UnityEngine;    using UnityEditor;	using System.IO;    public class ExportAssetBundles {        [MenuItem("Assets/Build AssetBundle Binary file From Selection - Track dependencies ")]        static void ExportResource () {            // Bring up save panel            string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");            if (path.Length != 0) {                // Build the resource file from the active selection.                Object[] selection = Selection.GetFiltered(typeof(Object), SelectionMode.DeepAssets);                BuildPipeline.BuildAssetBundle(Selection.activeObject, selection, path, BuildAssetBundleOptions.CollectDependencies | BuildAssetBundleOptions.CompleteAssets);                Selection.objects = selection;            						FileStream fs = new FileStream(path,FileMode.Open,FileAccess.ReadWrite);				byte[] buff = new byte[fs.Length+1];				fs.Read(buff,0,(int)fs.Length);				buff[buff.Length-1] = 0;				fs.Close();				File.Delete(path);							string BinPath = path.Substring(0,path.LastIndexOf('.'))+".bytes"; //				FileStream cfs = new FileStream(BinPath,FileMode.Create);				cfs.Write(buff,0,buff.Length);				buff =null;				cfs.Close();				//				string AssetsPath = BinPath.Substring(BinPath.IndexOf("Assets"));//				Object ta = AssetDatabase.LoadAssetAtPath(AssetsPath,typeof(Object));//              BuildPipeline.BuildAssetBundle(ta, null, path);			}        }        [MenuItem("Assets/Build AssetBundle From Selection - No dependency tracking")]        static void ExportResourceNoTrack () {            // Bring up save panel            string path = EditorUtility.SaveFilePanel ("Save Resource", "", "New Resource", "unity3d");            if (path.Length != 0) {                // Build the resource file from the active selection.                BuildPipeline.BuildAssetBundle(Selection.activeObject, Selection.objects, path);            }        }			    }

  把打包的文件转换成了binary文件并多加了一个字节加密。

  当bytes文件生成好后再选中它,使用"Assets/Build AssetBundle From Selection - No dependency tracking"再次打包。

 

using UnityEngine;using System.Collections;using System;public class WWWLoadTest : MonoBehaviour{    public string BundleURL;    public string AssetName;    IEnumerator Start()    {          WWW www =WWW.LoadFromCacheOrDownload(BundleURL,2);                yield return www;                TextAsset txt = www.assetBundle.Load("characters",typeof(TextAsset)) as TextAsset;                byte[]  data = txt.bytes;                byte[] decryptedData = Decryption(data);        Debug.LogError("decryptedData length:"+decryptedData.Length);        StartCoroutine(LoadBundle(decryptedData));    }        IEnumerator LoadBundle(byte[] decryptedData){                AssetBundleCreateRequest acr = AssetBundle.CreateFromMemory(decryptedData);                    yield return acr;        AssetBundle bundle = acr.assetBundle;                Instantiate(bundle.Load(AssetName));            }        byte[] Decryption(byte[] data){        byte[] tmp = new byte[data.Length-1];        for(int i=0;i

的作用就是下载并缓存资源,要注意后面的版本号参数,如果替换了资源却没有更新版本号,客户端依然会加载缓存中的文件。

www.assetBundle.Load("characters",typeof(TextAsset)) as TextAsset  //characters是加密文件的名字

AssetBundleCreateRequest acr = AssetBundle.CreateFromMemory(decryptedData);           

这句是官网最坑爹的,AssetBundle.CreateFromMemory明明返回的是AssetBundleCreateRequest官网却写得是AssetBundle,而且AssetBundleCreateRequest是一个异步加载,必须用协程的方式加载官网也没有提到。跟多兄弟就倒在了这里

完。

 

转载于:https://www.cnblogs.com/88999660/archive/2013/04/10/3011912.html

你可能感兴趣的文章
排序算法3---直接插入排序算法
查看>>
用matalb、python画聚类结果图
查看>>
JDK提供的几个基本注解
查看>>
Firebird数据库值得信赖吗?为什么我要在开发中选择...
查看>>
__rept__和__str__
查看>>
docker镜像基本操作
查看>>
算法第五章上机实践报告
查看>>
SHELL学习笔记----IF条件判断,判断条件
查看>>
RegisterWaitForSingleObject的使用
查看>>
UML第三次作业
查看>>
000 Python教程
查看>>
2013能量篇终止,2014精致篇起航
查看>>
力扣——分数排名(数据库的题
查看>>
力扣——行程与用户(数据库的题
查看>>
3.java基础语法(下)
查看>>
ios 11 系统CPU过高,xib中textfield使用导致出过高
查看>>
JS应用(资料很全)
查看>>
JAVA 自动生成对应数据库表的JPA代码工具
查看>>
一个用 C 语言写的迷你版 2048 游戏,仅仅有 500个字符
查看>>
Linux虚拟文件系统VFS解决
查看>>