unity3d 加密资源并缓存加载

首先要鄙视下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<data.Length-1;i++){
            tmp[i] = data[i];    
        }
        return tmp;
        
    }

    
}
复制代码

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

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

AssetBundleCreateRequest acr = AssetBundle.CreateFromMemory(decryptedData);           

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

完。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值