Unity读写资源包里面的文件

Unity打包资源有两种形式。
第一种,它自己加密后打包导出的.assset .split等等一堆。这是什么意思?意思是你打开生成后的apk,data目录里面下面一大堆那些。这些文件怎么读呢?网上有一大堆相关的代码。可以直接从里面用Resource.Load方式去加载prefab啊各种sprite什么一大堆。但是这种方式对于非unity资源就不太适用了。当然,你要是蛋疼的话也可以用。但是我不去研究应该怎么用。
第二种,你自己的配置文件,数据库,自己的二进制文件。那么这些文件是要放在StreamingAssets下面。哪里的StreamingAssets?就是unity编辑器里面左下角那个Assets文件夹里面,有个StreamingAssets。如果没有,就自己创建一个。然后丢你的东西进去。这个文件夹里面的东西,unity不进行自己的打包,而是照原样打到apk里面去,这里例如XX.db。打到apk的哪里呢?打开生成后的apk看下。xxx.apk/assets/XX.db。


先来讨论为什么要这样?读这个有什么用?适用于什么场合?比如我有个游戏,要存储玩家的信息到数据库里面。而数据库里面原本是有了一些其他的基础信息,例如界面,NPC敌人血量这些。那么这个数据库里面的大部分信息是已经写好了的。但是运行的时候,你还要额外的添加一些条目到这个文件里面去。比如说,存档文件什么的。这时候就要求这个东西可以写。而初始的信息太过繁杂,为了适应更新,不可能固化在程序代码里。所以XX.DB的存在是合理的。


然后安装的时候,就可以从apk包里面读这个db文件出来,写入到该项目的可写目录里。需求就这样产生了。当然,你也可以蛋疼的给每台机器去独立安装


数据库,使用这样一条命令:adb push XX.db /data/data/XX.XX.XX/files/XX.db.


先点名批评某些故作神秘的人。
http://blog.csdn.net/u013537131/article/details/47014287
然后上完整代码


首先 ,在某个脚本的start函数里
#if UNITY_ANDROID && !UNITY_EDITOR
        //检查数据库文件是否已存在。不存在则从资源中读取并写入特定目录。然后程序退出。
        string conn = Application.persistentDataPath + "/sysGameDB.db";
        if (!System.IO.File.Exists(conn))
        {
            Debug.Log("app data path"+Application.dataPath);
            System.IO.Directory.CreateDirectory(Application.persistentDataPath);


            StartCoroutine(LoadXML());
        }
#endif


然后 LoadXML函数的实现如下。。。请不要在意为什么数据库用LOadXML这个名字。。。。
   IEnumerator LoadXML()
    {
        string sPath = Application.streamingAssetsPath + "/sysGameDB.db";
        db_file = new WWW(sPath);
        yield return db_file;
    }


然后在Update函数里等待 www加载完成。代码如下
#if UNITY_ANDROID && !UNITY_EDITOR
        if (db_file != null && db_file.isDone)
        {
            Debug.Log("db file size:" + db_file.size);
            if (db_file.size > 0)
            {
                Stream t_sStreamWriter; // 文件流信息
                FileInfo t_fFileInfo = new FileInfo(Application.persistentDataPath + "/sysGameDB.db");
                if (!t_fFileInfo.Exists)
                {
                    t_sStreamWriter = t_fFileInfo.Create();  // 如果此文件不存在则创建
                }
                else
                {
                    return;
                }
                t_sStreamWriter.Write(db_file.bytes, 0, db_file.size); // 以行的形式写入信息 
                t_sStreamWriter.Close(); //关闭流
                t_sStreamWriter.Dispose(); // 销毁流
                db_file = null;
            }
        }
#endif


这样就完成了程序的初次安装。它会将资源里的XX。db读出来,然后放到安卓的可写目录下。大功告成。
参考的资料一大堆,例如unity Application.dataPath代表什么意义一类的,为什么要用www一类的。这里就不列举出来了。看官有疑问自己去搜索。

你可能感兴趣的:(Unity读写资源包里面的文件)