unity3d 资源打包加密 整理

资源打包脚本,放到Assets\Editor 文件夹下

using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO;

public class assetPack : Editor
{


/*
[MenuItem("Custom Editor/Build AssetBundle From Selection - Track dependencies")]
static void ExportResource2()
{
    // 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;
    }
}
 * */
/*
[MenuItem("Custom Editor/Build AssetBundle Complited  to  bytes")]
static void ExportResource5()
{
    // 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, BuildTarget.StandaloneWindows);
        Selection.objects = selection;


        FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
        byte[] buff = new byte[fs.Length];
        fs.Read(buff, 0, (int)fs.Length);
        string password = "shanghaichaolan";
        packXor(buff,buff.Length,password);
        Debug.Log("filelength:"+ buff.Length);
        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);
        Debug.Log("filelength:" + buff.Length);
        buff = null;
        cfs.Close();
 
    }
}
    */

[MenuItem("Custom Editor/Save Scene2")]
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;
    }
}

[MenuItem("Custom Editor/Make unity3d file to bytes file")]
static void ExportResourceNoTrackSS()
{
    string path = EditorUtility.SaveFilePanel("Save Resource", "", "New Resource", "unity3d");
    if (path.Length != 0)
    {

        FileStream fs = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
        byte[] buff = new byte[fs.Length];
        fs.Read(buff, 0, (int)fs.Length);
        string password = "shanghaichaolan";
        packXor(buff, buff.Length, password);
        Debug.Log("filelength:" + buff.Length);
        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);
        Debug.Log("filelength:" + buff.Length);
        buff = null;
        cfs.Close();

    }
}

static void packXor(byte[] _data, int _len, string _pstr)
{
    int length = _len;
    int strCount = 0;


    for (int i = 0; i < length; ++i)
    {
        if (strCount >= _pstr.Length)
            strCount = 0;
        _data[i] ^= (byte)_pstr[strCount++];


    }


}

}

 菜单上就会出现两个, 把要打包的资源做成Prefab,选中资源,然后菜单Custom Editor/Save Scene2  输入名字

新生成的文件,再选中新生成的文件,点击菜单Custom Editor/Make unity3d file to bytes file   输入名字

又生成了一个文件,再点击这个文件,菜单Custom Editor/Save Scene2  ,这样就打包加密好了

using UnityEngine;
using System.Collections;

public class loadnew : MonoBehaviour 
{
    public string filename;
    private string BundleURL;
    private string AssetName;
    void Start()
    {
        //StartCoroutine(loadScenee());
        StartCoroutine(LoadResource());
    }

    IEnumerator loadScenee()
    {
        string path;
        path = "file://" + Application.dataPath + "/" + filename + ".unity3d";
        Debug.Log(path);
        WWW www = new WWW(path);
        yield return www;
        AssetBundle bundle = www.assetBundle;
        //GameObject go = bundle.Load("gCube",typeof(GameObject)) as GameObject;

        GameObject ObjScene = Instantiate(www.assetBundle.mainAsset) as GameObject;
        bundle.Unload(false);

    }

    IEnumerator LoadResource()
    {
        BundleURL = "file://" + Application.dataPath + "/" + filename + ".unity3d";
        Debug.Log("path:" + BundleURL);
        WWW m_Download = new WWW(BundleURL);

        yield return m_Download;
        if (m_Download.error != null)
        {
            //   Debug.LogError(m_Download.error);
            Debug.LogError("Warning errow: " + "NewScene");
            yield break;
        }

        TextAsset txt = m_Download.assetBundle.Load(filename, typeof(TextAsset)) as TextAsset;
        byte[] data = txt.bytes;

        byte[] decryptedData = Decryption(data);
        Debug.Log("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.mainAsset);

    }

    byte[] Decryption(byte[] data)
    {
        byte[] tmp = new byte[data.Length];
        for (int i = 0; i < data.Length; i++)
        {
            tmp[i] = data[i];
        }
                     //   shanghaichaolan
        string password ="shanghaichaolan";
        packXor(tmp,tmp.Length,password);
        return tmp;

    }
    static void packXor(byte[] _data, int _len, string _pstr)
    {
        int length = _len;
        int strCount = 0;


        for (int i = 0; i < length; ++i)
        {
            if (strCount >= _pstr.Length)
                strCount = 0;
            _data[i] ^= (byte)_pstr[strCount++];


        }


    }

    void update()
    {

    }
}

 加载加密和不加密的资源

posted on 2014-11-10 16:45  c_dragon  阅读(10548)  评论(0编辑  收藏  举报

导航