1. 程式人生 > >Unity3d 遊戲資源打包加密 圖片/XML/TXT等 C 編碼 一

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