首页 > 代码库 > 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 = http://www.mamicode.com/new byte[filesize];>

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

我是可爱的分割线

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

代码浅显易懂 ( # ▽ # )


首先新建一个配置文件

MyPackRes.ini


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

技术分享

看看我们运行结果。

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

技术分享


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

技术分享


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


最后附上工程:

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


Unity3d 游戏资源打包加密(图片/XML/TXT等) C#编码 (一)