1. 程式人生 > >unity3d本地檔案讀寫

unity3d本地檔案讀寫



今天要做一個移動平臺的版本控制,先做一個前期的工作,就是從伺服器端載入資源,然後讀取到本地,再從本地讀取資源。這裡就以pc平臺為例,移動平臺也是一樣,就是稍微做一點路徑上的修改,

下面是不同平臺路徑的預編譯:

 

view source print ? 01. //不同平臺下StreamingAssets的路徑是不同的,這裡需要注意一下。 02. public static readonly string PathURL = 03.
#if UNITY_ANDROID   //安卓 04.     "jar:file://" + Application.dataPath + "!/assets/"; 05. #elif UNITY_IPHONE  //iPhone 06.     Application.dataPath + "/Raw/"; 07. #elif UNITY_STANDALONE_WIN || UNITY_EDITOR 
//windows平臺和web平臺
08.     "file://" + Application.dataPath + "/StreamingAssets/"; 09. #else 10.         string.Empty; 11. #endif
關於資源的打包不理解的,我在之前的博文中有介紹:http://blog.csdn.net/dingxiaowei2013/article/details/17439887,可以去看一下這篇文章。

 

操作步驟:

建立指令碼,命名Text.cs,並且將其拖放到MainCamera中

 

view source print ? 001. using UnityEngine; 002. using System.Collections; 003. using System.IO; 004. using System.Collections.Generic; 005. using System; 006.    007. public class Text : MonoBehaviour { 008.     //文字中每行的內容 009.     ArrayList infoall; 010.     //面板資源,這裡用於顯示中文 011.     public GUISkin skin; 012.     void Start () 013.     { 014.         print("當前檔案路徑:"+Application.persistentDataPath); 015.         //刪除檔案 016.         DeleteFile(Application.persistentDataPath,"FileName.txt"); 017.    018.         //建立檔案,共寫入3次資料 019.         CreateFile(Application.persistentDataPath,"FileName.txt","dingxiaowei"); 020.         CreateFile(Application.persistentDataPath,"FileName.txt","丁小未"); 021.         //CreateFile(Application.persistentDataPath ,"Filename.assetbundle","丁小未"); 022.         //下載模型 023.         StartCoroutine(loadasset("http://192.168.1.180/3DShowResource/Products/AssetBundles/HX_DY02.assetbundle")); 024.         //得到文字中每一行的內容 025.         infoall = LoadFile(Application.persistentDataPath,"FileName.txt"); 026.   027.           028.     } 029.     //寫入模型到本地 030.     IEnumerator loadasset(string url) 031.     { 032.         WWW w = new WWW(url); 033.         yield return w; 034.         if (w.isDone) 035.         { 036.             byte[] model = w.bytes; 037.             int length = model.Length; 038.             //寫入模型到本地 039.             CreateModelFile(Application.persistentDataPath, "Model.assetbundle", model,length); 040.         } 041.     } 042.   043.     void CreateModelFile(string path, string name, byte[] info, int length) 044.     { 045.         //檔案流資訊 046.         //StreamWriter sw; 047.         Stream sw; 048.         FileInfo t = new FileInfo(path + "//" + name); 049.         if (!t.Exists) 050.         { 051.             //如果此檔案不存在則建立 052.             sw = t.Create(); 053.         } 054.         else 055.         { 056.             //如果此檔案存在則開啟 057.             //sw = t.Append(); 058.             return; 059.         } 060.         //以行的形式寫入資訊 061.         //sw.WriteLine(info); 062.         sw.Write(info, 0, length); 063.         //關閉流 064.         sw.Close(); 065.         //銷燬流 066.         sw.Dispose(); 067.     } 068.    069.    /** 070.    * path:檔案建立目錄 071.    * name:檔案的名稱 072.    *  info:寫入的內容 073.    */ 074.    void CreateFile(string path,string name,string info) 075.    { 076.       //檔案流資訊 077.       StreamWriter sw; 078.       FileInfo t = new FileInfo(path+"//"+ name); 079.       if(!t.Exists) 080.       { 081.         //如果此檔案不存在則建立 082.         sw = t.CreateText(); 083.       } 084.       else 085.       { 086.         //如果此檔案存在則開啟 087.         sw = t.AppendText(); 088.       } 089.       //以行的形式寫入資訊 090.       sw.WriteLine(info); 091.       //關閉流 092.       sw.Close(); 093.       //銷燬流 094.       sw.Dispose(); 095.    } 096.   097.      098.    099.   /** 100.    * 讀取文字檔案 101.    * path:讀取檔案的路徑 102.    * name:讀取檔案的名稱 103.    */ 104.    ArrayList LoadFile(string path,string name) 105.    { 106.         //使用流的形式讀取 107.         StreamReader sr =null; 108.         try{ 109.             sr = File.OpenText(path+"//"+ name); 110.         }catch(Exception e) 111.         { 112.             //路徑與名稱未找到檔案則直接返回空 113.             return null; 114.         } 115.         string line; 116.         ArrayList arrlist = new ArrayList(); 117.         while ((line = sr.ReadLine()) != null) 118.         { 119.             //一行一行的讀取 120.             //將每一行的內容存入陣列連結串列容器中 121.             arrlist.Add(line); 122.         } 123.         //關閉流 124.         sr.Close(); 125.         //銷燬流 126.         sr.Dispose(); 127.         //將陣列連結串列容器返回 128.         return arrlist; 129.     130.   131.     //讀取模型檔案 132.    IEnumerator LoadModelFromLocal(string path, string name) 133.    { 134.        print("file:///" + path + "/" + name); 135.        WWW w = new WWW("file:///"+path + "/" + name); 136.        yield return w; 137.        if (w.isDone) 138.        { 139.            Instantiate(w.assetBundle.mainAsset); 140.        } 141.    } 142.   143.    144.   /** 145.    * path:刪除檔案的路徑 146.    * name:刪除檔案的名稱 147.    */ 148.    149.    void DeleteFile(string path,string name) 150.    { 151.         File.Delete(path+"//"+ name); 152.    } 153.    154.    void OnGUI() 155.    { 156.         //用新的面板資源,顯示中文 157.         GUI.skin = skin; 158.         //讀取檔案中的所有內容 159.         foreach(string str in infoall) 160.         { 161.             //繪製在螢幕當中 162.             GUILayout.Label(str); 163.         } 164.         if (GUILayout.Button("載入模型")) 165.         { 166.             StartCoroutine(LoadModelFromLocal(Application.persistentDataPath, "Model.assetbundle")); 167.         } 168.    } 169.    170. }
上面設計到檔案流操作,還有就是Application.persistentDataPath,這裡並沒有用Application.DataPath,後者貌似在移動平臺是找不到的,前者就是所謂的沙盒檔案,具有讀寫許可權。