unity3d解密图片_unity .unity3d资源解密 - CSDN
  • 新建一个unity3d项目,新建一个Test.unity场景,场景里面需要有一个摄像机,并且在摄像机上附加一个SaveAESFile.cs组件类,另外还需要在项目新建一个Resources文件夹,这个文件夹为了存放加密的文件。    ...
    今天小编为大家介绍如何把保存的文件采用AES 方式加密/解密
       1.新建一个unity3d项目,新建一个Test.unity场景,场景里面需要有一个摄像机,并且在摄像机上附加一个SaveAESFile.cs组件类,另外还需要在项目新建一个Resources文件夹,这个文件夹为了存放加密的文件。

           


       2.首先需要一个辅助类AES.cs和一个实体类People.cs,然后代码如下:

          ①AES.cs代码如下:

    using System;
    using System.IO;
    using System.Security.Cryptography;
    using System.Text;
     
    namespace Utils
    {
        /// <summary>
        /// AES加密解密
        /// </summary>
        public class AES
        {
            #region 加密
            #region 加密字符串
            /// <summary>
            /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
            /// </summary>
            /// <param name="EncryptString">待加密密文</param>
            /// <param name="EncryptKey">加密密钥</param>
            public static string AESEncrypt(string EncryptString, string EncryptKey)
            {
                return Convert.ToBase64String(AESEncrypt(Encoding.Default.GetBytes(EncryptString), EncryptKey));
            }
            #endregion
     
            #region 加密字节数组
            /// <summary>
            /// AES 加密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
            /// </summary>
            /// <param name="EncryptString">待加密密文</param>
            /// <param name="EncryptKey">加密密钥</param>
            public static byte[] AESEncrypt(byte[] EncryptByte, string EncryptKey)
            {
                if (EncryptByte.Length == 0) { throw (new Exception("明文不得为空")); }
                if (string.IsNullOrEmpty(EncryptKey)) { throw (new Exception("密钥不得为空")); }
                byte[] m_strEncrypt;
                byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
                byte[] m_salt = Convert.FromBase64String("gsf4jvkyhye5/d7k8OrLgM==");
                Rijndael m_AESProvider = Rijndael.Create();
                try
                {
                    MemoryStream m_stream = new MemoryStream();
                    PasswordDeriveBytes pdb = new PasswordDeriveBytes(EncryptKey, m_salt);
                    ICryptoTransform transform = m_AESProvider.CreateEncryptor(pdb.GetBytes(32), m_btIV);
                    CryptoStream m_csstream = new CryptoStream(m_stream, transform, CryptoStreamMode.Write);
                    m_csstream.Write(EncryptByte, 0, EncryptByte.Length);
                    m_csstream.FlushFinalBlock();
                    m_strEncrypt = m_stream.ToArray();
                    m_stream.Close(); m_stream.Dispose();
                    m_csstream.Close(); m_csstream.Dispose();
                }
                catch (IOException ex) { throw ex; }
                catch (CryptographicException ex) { throw ex; }
                catch (ArgumentException ex) { throw ex; }
                catch (Exception ex) { throw ex; }
                finally { m_AESProvider.Clear(); }
                return m_strEncrypt;
            }
            #endregion
            #endregion
     
            #region 解密
            #region 解密字符串
            /// <summary>
            /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
            /// </summary>
            /// <param name="DecryptString">待解密密文</param>
            /// <param name="DecryptKey">解密密钥</param>
            public static string AESDecrypt(string DecryptString, string DecryptKey)
            {
                return Convert.ToBase64String(AESDecrypt(Encoding.Default.GetBytes(DecryptString), DecryptKey));
            }
            #endregion
     
            #region 解密字节数组
            /// <summary>
            /// AES 解密(高级加密标准,是下一代的加密算法标准,速度快,安全级别高,目前 AES 标准的一个实现是 Rijndael 算法)
            /// </summary>
            /// <param name="DecryptString">待解密密文</param>
            /// <param name="DecryptKey">解密密钥</param>
            public static byte[] AESDecrypt(byte[] DecryptByte, string DecryptKey)
            {
                if (DecryptByte.Length == 0) { throw (new Exception("密文不得为空")); }
                if (string.IsNullOrEmpty(DecryptKey)) { throw (new Exception("密钥不得为空")); }
                byte[] m_strDecrypt;
                byte[] m_btIV = Convert.FromBase64String("Rkb4jvUy/ye7Cd7k89QQgQ==");
                byte[] m_salt = Convert.FromBase64String("gsf4jvkyhye5/d7k8OrLgM==");
                Rijndael m_AESProvider = Rijndael.Create();
                try
                {
                    MemoryStream m_stream = new MemoryStream();
                    PasswordDeriveBytes pdb = new PasswordDeriveBytes(DecryptKey, m_salt);
                    ICryptoTransform transform = m_AESProvider.CreateDecryptor(pdb.GetBytes(32), m_btIV);
                    CryptoStream m_csstream = new CryptoStream(m_stream, transform, CryptoStreamMode.Write);
                    m_csstream.Write(DecryptByte, 0, DecryptByte.Length);
                    m_csstream.FlushFinalBlock();
                    m_strDecrypt = m_stream.ToArray();
                    m_stream.Close(); m_stream.Dispose();
                    m_csstream.Close(); m_csstream.Dispose();
                }
                catch (IOException ex) { throw ex; }
                catch (CryptographicException ex) { throw ex; }
                catch (ArgumentException ex) { throw ex; }
                catch (Exception ex) { throw ex; }
                finally { m_AESProvider.Clear(); }
                return m_strDecrypt;
            }
            #endregion
            #endregion
     
        }
    }


    ②People.cs 代码如下:
    using System;
    namespace Assets
    {
        [Serializable]
     
        public class People
        {
            public People()
            {
            }
            public int ID;
            public string Name;
            public int Age;
        }
    }

     3.直接是SaveAESFile.cs的核心代码

    using UnityEngine;
    using Assets;
    using System.Text;
    using System;
    using System.IO;
    using Utils;
     
    public class SaveAESFile : MonoBehaviour
    {
     
        public string FilePath = "";
        private People _people;
        private string info = "";
     
        /// <summary>
        /// AES 密码保存
        /// </summary>
        private const string _password = "qq123";
     
        /// <summary>
        /// 一次处理的明文字节数
        /// </summary>
        public static readonly int encryptSize = 10000000;
        /// <summary>
        /// 一次处理的密文字节数
        /// </summary>
        public static readonly int decryptSize = 10000016;
     
     
        void Awake()
        {
            FilePath = Application.dataPath + @"/Resources/SaveAESFile.json";
        }
     
        void OnGUI()
        {
            // 文本显示
            GUI.Label(new Rect(50, 200, 200, 50), info);
     
     
            // 第一个文字按钮
            GUI.color = Color.yellow;  //按钮文字颜色  
            GUI.backgroundColor = Color.red; //按钮背景颜色
     
            if (GUI.Button(new Rect(50, 250, 200, 30), "保存加密文件"))
            {
                info = "保存加密文件!";
                AESSaveFile();
            }
     
            // 第二个图片按钮
            GUI.color = Color.white;  //按钮文字颜色  
            GUI.backgroundColor = Color.red; //按钮背景颜色
     
            if (GUI.Button(new Rect(50, 300, 200, 30), "显示解密文件"))
            {
                ShowAESFile();
                info = "显示解密文件!";
                People temp = _people;
                info = "ID:" + _people.ID + "   " + "Name:" + _people.Name + "    " + "Age:" + _people.Age;
            }
     
        }
     
     
        void AESSaveFile()
        {
            AddData();
            byte[] texts = new byte[] { };
            try
            {
                string autoSaveJson = JsonUtility.ToJson(_people);
                //加密
                texts = Utils.AES.AESEncrypt(Encoding.UTF8.GetBytes(autoSaveJson), _password);
            }
            catch (Exception e)
            {
                Debug.LogError("Message:" + e.Message);
            }
            if (File.Exists(FilePath))
            {
                File.Delete(FilePath);
            }
            using (FileStream fs = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write))
            {
                if (fs != null)
                {
                    fs.Write(texts, 0, texts.Length);
                    fs.Flush();
                    fs.Dispose();
                }
            }
        }
     
        void ShowAESFile()
        {
            try
            {
                string DecrypText = string.Empty;
                using (FileStream fs = new FileStream(FilePath, FileMode.Open, FileAccess.Read))
                {
                    if (fs.Length > 0)
                    {
                        int blockCount = ((int)fs.Length - 1) / decryptSize + 1;
                        for (int i = 0; i < blockCount; i++)
                        {
                            int size = decryptSize;
                            if (i == blockCount - 1) size = (int)(fs.Length - i * decryptSize);
                            byte[] bArr = new byte[size];
                            fs.Read(bArr, 0, size);
                            //解密
                            byte[] result = AES.AESDecrypt(bArr, _password);
                            DecrypText += Encoding.UTF8.GetString(result);
                        }
                        fs.Close();
                        fs.Dispose();
                    }
                }
                _people = JsonUtility.FromJson<People>(DecrypText);
            }
            catch (Exception e)
            {
                Debug.LogError("Message:" + e.Message);
            }
        }
     
        void AddData()
        {
            _people = new People();
            _people.ID = 1;
            _people.Name = "小白兔";
            _people.Age = 18;
        }
    }

      4.最后便是执行项目看效果啦!
        ①点击解密保存文件,我们会发现在Resources下面会生成一个.json文件,如图下:
        
            


            
             
        ②当我们点击按钮解密显示文件时,会发现加密的文件的内容被解密,如图下:
       
            

    2——0.png

    展开全文
  • 基于深思云授权平台,有一套Unity3D代码及资源加密保护方案,可通过Virbox Protector加壳工具对代码及资源进行加壳,再配合精锐5加密锁或者云锁及软锁,可达到极高的安全性,可防止代码被反编译及资源被拷贝。...

    https://blog.csdn.net/love_hot_girl

     

    很多VR企业开发的软件有很多文件资源需要保护,而目前行业鲜有好的加密方案可供开发者使用。基于深思云授权平台,有一套Unity3D代码及资源加密保护方案,可通过Virbox Protector加壳工具对代码及资源进行加壳,再配合精锐5加密锁或者云锁及软锁,可达到极高的安全性,可防止代码被反编译及资源被拷贝。

     

    Unity3D主要使用C#语法和开源mono运行开发商的代码逻辑,所有代码都不是编译到EXE,而是位于{APP}\build\game_Data\Managed\Assembly-CSharp.dll(注意Unity-2017位置略有不同)。而且mono执行原理跟微软.NETFramework兼容但是执行原理完全不一样。传统的.NET Framework加壳全部失效,因为Assembly-CSharp.dll不是PE格式的动态库也不是.NET的动态库,无法从.NET Framework加载,而是由mono.dll读取 Assembly-CSharp.dll的里面C#脚本解释执行。

     

    基于此背景,深思研发的加壳工具Virbox Protector可对Unity3D开发的软件进行一键加壳,保护软件的安全。

    VirboxProtector (Unity3D 加密外壳)

    国内首家Unity3D的保护外壳,解决代码反编译和内存反dump代码,从而解决软件盗版与算法抄袭。

     

    VirboxProtector核心优点:

    1.一键加密你的代码逻辑,无法反编译,无法dump内存。

    2.不降低游戏帧数, 甚至某些情况下还能提高游戏帧数。

    3. Assembly-CSharp.dll代码按需解密,只有相关算法被调用到才在内存解密,不调用不解密。黑客无法一次解出所有的代码。

    4.完整授权方案,支持云授权/软锁授权/USB加密锁授权/网络锁授权,支持时间限制,次数限制,并发限制。

    5.自带反黑引擎,驱动级别反调试,秒杀常见调试器(WinDbg/OllyDbg/X64Dbg)。(注意:如果需要最高安全强度的游戏反外挂请参考反黑引擎http://www.sense.com.cn/ahs.html )

     

    效果截图1.:

    1、dnspy 反编译被加壳的结果

     

    对比:

     

     

    2.PC上OllyDbg 调试失败与附加失败。

    3.Cheat-Engine 读取内存失败(需要新的反黑引擎支持)

    典型客户场景:

    1.Unity3D游戏客户。

    2.医疗/工业/航天等VR交互。

    3.制造业/机器人等交互体验教学软件。

    可加群进行交流QQ群【Unity3D保护】(群号730803578),发现精彩内容。

    深思Virbox Protector 体验版免费下载 :http://www.sense.com.cn/VirboxProtector.html

    深思Virbox AHS 反黑引擎下载 : http://www.sense.com.cn/ahs.html

    展开全文
  • Unity3d 游戏资源打包加密 图片/XML/TXT等 C 编码 一
                   

    本文只是讲述一下过程,采用很简单的打包加密方法,至于需要什么样的加密结果,请大家按照需求去修改,字节偏移、前后颠倒加算法都可以,不过一般无需这么复杂,而且太复杂的加密对于极其追求运行效率的游戏来说,也是一重负担。


    对于Unity,虽然Unity自身会进行压缩加密,但是其解密算法在网上随处可见,如果自己觉得游戏里面的资料具有保密性质,请对其进行自行加密。


    打包加密的原理:

    1、大家都知道文件都是由字节组成的。

    2、一张图片之所以看起来很漂亮,是因为其数据按照一定顺序排列。

    漂亮的剑灵妹子


    我们可以用一个文本编辑器将其打开。

    是乱码,不然你还想看到什么呢?


    3、如果我们把图片数据打乱,或者在前面加一些很乱的数据,会怎么样呢?


    嗯,图片不显示了。

    这很容易理解,就像你看片的时候被打了马赛克嘛。。

    仔细想想,为什么打马赛克?

    不就是为了保密嘛。。。


    好的,上面我们就起到了保密-加密功能。


    4、我又找来一张图片……萌萌哒的。。



    同样用一个文本编辑器打开这个图片。

    复制所有的内容到第一个图片文件后面。

    结果会怎么样?

    两个图片会拼在一起吗?



    真不幸……

    不过这是符合我的主题的。加密嘛,就是要让人看不出来。


    原理就讲到这里,下面就是代码了。

    代码不是针对单个文件,而是对多个文件夹进行打包加密。

    加密方法仅仅是多个文件打包。


    -----------------------------------------------------------------------------------

    我是可爱的分割线

    -----------------------------------------------------------------------------------


    用到的知识点:

    1、读写文件

    2、对文件夹、文件的操作,获取所有的文件


    -----------------------------------------------------------------------------------

    我是可爱的分割线

    -----------------------------------------------------------------------------------

    下面是主要的代码:


    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace MyPackRes{    class Helper    {        public static void Log(string str)        {            Console.Write(str+"\n\n");        }        public static void Pause()        {            Console.Write("Press any key to continue . . . ");            Console.ReadKey(true);        }    }}

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.IO;using System.Diagnostics;namespace MyPackRes{    class Program    {        private static int m_id=0;        private static int m_totalSize = 0;//         private static List<int> m_idList = new List<int>();//         private static List<int> m_startPosList = new List<int>();//         private static List<int> m_sizeList = new List<int>();//         private static List<string> m_pathList = new List<string>();        private static Dictionary<int,OneFileInfor> m_allFileInfoDic = new Dictionary<int,OneFileInfor>();        private static string m_currentDir = "";        static void Main(string[] args)        {            m_currentDir = Environment.CurrentDirectory;            Helper.Log("MyPackRes Start " + m_currentDir);            List<string> folderToPackList = new List<string>();            /**  读取配置文件  **/            Helper.Log("需要打包的文件夹:");            StreamReader streamReader = new StreamReader("MyPackRes.ini", Encoding.Default);            string line;            while ((line=streamReader.ReadLine())!=null)            {                Helper.Log(line);                if (!folderToPackList.Contains(line))                {                    folderToPackList.Add(line);                }            }            streamReader.Close();            /**  遍历打包文件夹 **/            for (int index = 0; index < folderToPackList.Count;index++ )            {                PackFolder(folderToPackList[index]);            }            Helper.Log("打包完毕!");            Helper.Pause();        }        /** 遍历文件夹获取所有文件信息 **/        private static void TraverseFolder(string foldername)        {            Helper.Log("遍历文件夹 " + foldername);            /** 读取文件夹下面所有文件的信息 **/            DirectoryInfo dirInfo = new DirectoryInfo(foldername);            foreach (FileInfo fileinfo in dirInfo.GetFiles("*.*",SearchOption.AllDirectories))            {                string filename = (fileinfo.FullName.Replace(m_currentDir+"\\","")).Replace("\\","/");                int filesize = (int)fileinfo.Length;                Helper.Log(m_id + " : " + filename + " 文件大小: " + filesize);                OneFileInfor info = new OneFileInfor();                info.m_id = m_id;                info.m_Size = filesize;                info.m_Path = filename;                                /**  读取这个文件  **/                FileStream fileStreamRead = new FileStream(fileinfo.FullName, FileMode.Open, FileAccess.Read);                if (fileStreamRead == null)                {                    Helper.Log("读取文件失败 : "+fileinfo.FullName);                    Helper.Pause();                    return;                }                else                {                    byte[] filedata = new byte[filesize];                    fileStreamRead.Read(filedata, 0, filesize);                    info.m_data = filedata;                }                fileStreamRead.Close();                m_allFileInfoDic.Add(m_id,info);                m_id++;                m_totalSize += filesize;            }        }        /**  打包一个文件夹  **/        private static void PackFolder(string foldername)        {            TraverseFolder(foldername);            Helper.Log("文件数量 : " + m_id);            Helper.Log("文件总大小 : " + m_totalSize);            /**  更新文件在UPK中的起始点  **/            int firstfilestartpos = 4 + (4 + 4 + 4 + 256) * m_allFileInfoDic.Count;            int startpos = 0;            for (int index = 0; index < m_allFileInfoDic.Count; index++)            {                if (index == 0)                {                    startpos = firstfilestartpos;                }                else                {                    startpos = m_allFileInfoDic[index - 1].m_StartPos + m_allFileInfoDic[index - 1].m_Size;//上一个文件的开始+文件大小;                }                m_allFileInfoDic[index].m_StartPos = startpos;            }            /**  写文件  **/            FileStream fileStream = new FileStream(foldername + ".UPK", FileMode.Create);            /**  文件总数量  **/            byte[] totaliddata=System.BitConverter.GetBytes(m_id);            fileStream.Write(totaliddata, 0, totaliddata.Length);            for (int index = 0; index < m_allFileInfoDic.Count;index++ )            {                /** 写入ID **/                byte[] iddata = System.BitConverter.GetBytes(m_allFileInfoDic[index].m_id);                fileStream.Write(iddata, 0, iddata.Length);                /**  写入StartPos  **/                byte[] startposdata = System.BitConverter.GetBytes(m_allFileInfoDic[index].m_StartPos);                fileStream.Write(startposdata, 0, startposdata.Length);                /**  写入size  **/                byte[] sizedata = System.BitConverter.GetBytes(m_allFileInfoDic[index].m_Size);                fileStream.Write(sizedata, 0, sizedata.Length);                /**  写入path  **/                byte[] pathdata = new byte[256];                byte[] mypathdata = new UTF8Encoding().GetBytes(m_allFileInfoDic[index].m_Path);                for (int i = 0; i < mypathdata.Length; i++)                {                    pathdata[i] = mypathdata[i];                }                pathdata[mypathdata.Length] = 0;                fileStream.Write(pathdata, 0, pathdata.Length);                            }            /**  写入文件数据  **/            for (int index = 0; index < m_allFileInfoDic.Count; index++)            {                fileStream.Write(m_allFileInfoDic[index].m_data, 0, m_allFileInfoDic[index].m_Size);            }            fileStream.Flush();            fileStream.Close();            /** 重置数据 **/            m_id = 0;            m_totalSize = 0;            m_allFileInfoDic.Clear();        }    }    public class OneFileInfor    {        public int m_id=0;        public int m_StartPos=0;        public int m_Size=0;        public string m_Path="";        public byte[] m_data = null;    };}

    -----------------------------------------------------------------------------------

    我是可爱的分割线

    -----------------------------------------------------------------------------------

    代码浅显易懂 ( # ▽ # )


    首先新建一个配置文件

    MyPackRes.ini


    里面添加需要打包的文件夹 每行一个:


    看看我们运行结果。

    首先看看我准备的图。从碧之轨迹中TP抽取的哦。


    打包结束后,会生成UPK文件。


    UPK,这个后缀是虚幻引擎的默认资源文件格式哦。


    最后附上工程:

    http://download.csdn.net/detail/cp790621656/8393457


               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • Unity3D游戏资源的提取

    2014-09-16 22:37:07
    前言 ...国内一些比较小的Unity3D游戏基本上资源文件都打包在了apk的assets文件夹中,如下图中的《爸爸去哪儿2》资源结构。 我们知道,国外的游戏一般体验较高 画质一流,所以资源文件会更大
    现在越来越多的安卓游戏用Unity3D引擎编写,以前关注的地方都是内购破解方面,所以修改比较多的地方是C/C++编写的dll逻辑,资源的提取很少操作。看了 @林哥 的分享,http://www.kanxue.com/bbs/showthread.php?t=191380 ,觉得这方面提升的空间很大,就折腾了一番。
    
    
    前言
    在游戏中看到一张优美的画面,想作为手机壁纸;听到一首好听的音乐,想作为手机铃声。想啊 但是怎么找到它们?这就是资源的提取,下面我就说说对他们的浅显认识。
    Unity3D资源的存在形式
    国内一些比较小的Unity3D游戏基本上资源文件都打包在了apk的assets文件夹中,如下图中的《爸爸去哪儿2》资源结构:

    我们知道,国外的游戏一般体验较高 画质一流,所以资源文件会更大。并且貌似在国外 有一个规则就是资源文件大于60M的apk,必须要外带obb资源包。obb的引入方法就是放在SDCard的游戏目录下,obb其实就是一个压缩文件,文件内容同单独apk包下的 \assets\data\ 路径文件。如《死亡航线 Dead Route》的obb文件结构:


    一般资源文件夹中的文件类型的说明
    Shader:文本文件,后缀为.shader,配置有关;
    Texture2D:图片文件,一般的格式为tga或ktx,前者比较常用,后前网上说需要安装PowerVR 
                          Tools & SDK v3.3才可以打开;
    AudioClip:游戏的声音文件,格式是常见的wav或mp3等;
    Mesh:游戏全部的模型文件,格式obj,需要在3DMax或Maya中打开。

    如下图《死亡航线 Dead Route》提取出来的文件目录:


    obb中资源文件的提取

    强大的开源工具:Disunity。作者付出的努力和无私 @林哥 在那篇帖子中已经溢于言表..它是个Java程序,编译之后用命令行bat就行,将从obb解压出来的Data文件夹直接拖到cmd框中,即可自动试下解密,如下图:


    由于每个文件夹都有不同的资源 不便于特定资源的查找,所以就网罗了一个工具:IrfanView,它能够将不同文件夹下的资源放在一起进行预览,方法及效果如下图:


    后记
    资源算是提取出来,进阶是不是应该试试修改操作呢,比如替换图片,汉化等?遗憾的是Disunity并没有提供回编的功能,这就需要我们自己阅读它的源码,看它是怎么解出来文件的 才能做下一步的回编..(里面的表述和方式一定会有错误 还望看出来的高手不吝指出,谢谢)


    展开全文
  • unity加密与解密

    2019-02-18 11:54:04
    解密 通常unity的代码都是c#的,通过工具基本可以直接看到源码。 netReflector ILSpy 以上2个工具,可以非常方便的实现解密操作。   加密 比较常见的加密操作是: 对于Assembly-CSharp.dll,使用一定的方式...
  • 本文只是讲述一下过程,采用很简单的打包...对于Unity,虽然Unity自身会进行压缩加密,但是其解密算法在网上随处可见,如果自己觉得游戏里面的资料具有保密性质,请对其进行自行加密。    打包加密的原理:  1
  • string base64 = Convert.ToBase64String(byte[] bytes); //加密 byte[] bytes =Convert.FromBase64String... //解密 Unity环境应用 /// <summary> /// 将图片数据转换为Base64字符串 /// </sum...
  • 对于Unity,虽然Unity自身会进行压缩加密,但是其解密算法在网上随处可见,如果自己觉得游戏里面的资料具有保密性质,请对其进行自行加密。 本文只是讲述一下过程,采用很简单的打包加密方法,至于需要什么样的加密...
  • 0x00 Disunity 一个很老的开源工具,好久没有更新了(暂不支持Unity5.x,建议使用Jdk7的版本),只持支命令行解包 源代码下载 https://github.com/ata4/disunity/ 编译版下载 ...
  • Unity3D手游开发实践

    2018-04-29 10:58:53
    虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:架构设计、原生插件/平台交互、版本与补丁、用脚本,还是不用?这是一个问题、资源管理、性能优化、异常与Crash、适配与兼容、调试及开发工具...
  • Unity3D游戏框架设计

    2018-07-03 20:00:09
    Unity框架设计将Unity Api、.NetFramework Api(4.6)以及部分原生库和托管库封装到一个抽象层,游戏本身的业务仅依赖于该抽象层从而提高业务逻辑的独立性和可维护性。 框架部分提供项目中使用的基础设施,包括资源...
  • 版本:unity 5.4.1 语言:C#   实战核心技术来到了第五章,这一章我准备分两篇来分析一下其中的代码,这一篇重点讲一下文件的读取,以及获取到数据后如何反射出对应类。作者的注释寥寥数语,所以很多代码要自己...
  • Unity的资源管理是一个比较复杂的模块,如果管理不好,可能导致最终包体大小偏大,程序运行时候内存居高不下,因此了解并掌握Unity的资源管理显得特别重要。 Unity中资源一般存放在两个目录下,一个是Resource目录...
  • 今天博主想和大家探讨的是RPG游戏中剧情呈现的相关策略,我们知道一个RPG游戏主要是通过将玩家带入到游戏世界中进行某种“体验”进而影响角色的成长。这句话其实指出了RPG游戏的两个特点,即高度的代入感和角色的可...
  • 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、...
  • 自上一篇 Unity3d 游戏资源打包加密(图片/XML/TXT等) C#编码 (一) 介绍如何打包加密游戏资源已经好几月,却没有详细说明如何在游戏中去读取加密的资源,虽然聪明的程序员看一眼就知道如何逆向编码,但是还是详细...
  • 什么是热更新 热:就是刚出炉 简单来说就是当游戏某个功能出现bug,或者修改了某个功能,或者增加了某个功能的时候,我们不需要重新下载安装安装包,就可以更新游戏内容。 热更新的好处:不用浪费流量重新下载,不用...
  • 欢迎加入Unity业内qq交流群:956187480 qq扫描二维码加群 本文从以下10大点进行阐述: 1.架构设计 2.原生插件/平台交互 3.版本与补丁 4.用脚本,还是不用?这是一个问题 5.资源管理 6.性能优化 7.异常与Crash 8...
  • 之前介绍了Unity4.x时代的AssetBundle的基本API和简单应用,主要分析一下Unity5.x后新版本的AssetBundle的一些API用法,以及新版AssetBundle系统的优点。 一、AssetBundle系统的新功能1.新增AssetBundleName属性...
  • http://www.gameres.com/654759.html 游戏程序 平台类型:   程序设计: 设计思想/框架 客户端  ...Unity3D/2D   GameRes游资网授权发布 文 / 吴秦
1 2 3 4 5 ... 16
收藏数 312
精华内容 124
关键字:

unity3d解密图片