unity3d本地檔案讀寫
阿新 • • 發佈:2018-11-10
關於資源的打包不理解的,我在之前的博文中有介紹:http://blog.csdn.net/dingxiaowei2013/article/details/17439887,可以去看一下這篇文章。
上面設計到檔案流操作,還有就是Application.persistentDataPath,這裡並沒有用Application.DataPath,後者貌似在移動平臺是找不到的,前者就是所謂的沙盒檔案,具有讀寫許可權。
今天要做一個移動平臺的版本控制,先做一個前期的工作,就是從伺服器端載入資源,然後讀取到本地,再從本地讀取資源。這裡就以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,後者貌似在移動平臺是找不到的,前者就是所謂的沙盒檔案,具有讀寫許可權。