找回密码
 立即注册

转载 u3d路径保存

已有 450 次阅读2015-5-17 20:42 | 服务器, 资源

今天要做一个移动平台的版本控制,先做一个前期的工作,就是从服务器端加载资源,然后读取到本地,再从本地读取资源。这里就以pc平台为例,移动平台也是一样,就是稍微做一点路径上的修改,

下面是不同平台路径的预编译:

[csharp] view plaincopyprint? SHAPE  \* MERGEFORMAT

1.  //不同平台下StreamingAssets的路径是不同的,这里需要注意一下。  

2.  public static readonly string PathURL =  

3.  #if UNITY_ANDROID   //安卓  

4.      "jar:file://" + Application.dataPath + "!/assets/";  

5.  #elif UNITY_IPHONE  //iPhone  

6.      Application.dataPath + "/Raw/";  

7.  #elif UNITY_STANDALONE_WIN || UNITY_EDITOR  //windows平台和web平台  

8.      "file://" + Application.dataPath + "/StreamingAssets/";  

9.  #else  

10.         string.Empty;  

11. #endif  


关于资源的打包不理解的,我在之前的博文中有介绍:http://blog.csdn.net/dingxiaowei2013/article/details/17439887,可以去看一下这篇文章。

操作步骤:

创建脚本,命名Text.cs,并且将其拖放到MainCamera

[csharp] view plaincopyprint? SHAPE  \* MERGEFORMAT

1.  using UnityEngine;  

2.  using System.Collections;  

3.  using System.IO;  

4.  using System.Collections.Generic;  

5.  using System;  

6.     

7.  public class Text : MonoBehaviour {  

8.      //文本中每行的内容  

9.      ArrayList infoall;  

10.     //皮肤资源,这里用于显示中文  

11.     public GUISkin skin;  

12.     void Start ()  

13.     {  

14.         print("当前文件路径:"+Application.persistentDataPath);  

15.         //删除文件  

16.         DeleteFile(Application.persistentDataPath,"FileName.txt");  

17.    

18.         //创建文件,共写入3次数据  

19.         CreateFile(Application.persistentDataPath,"FileName.txt","dingxiaowei");  

20.         CreateFile(Application.persistentDataPath,"FileName.txt","丁小未");  

21.         //CreateFile(Application.persistentDataPath ,"Filename.assetbundle","丁小未");  

22.         //下载模型  

23.         StartCoroutine(loadasset("http://192.168.1.180/3DShowResource/Products/AssetBundles/HX_DY02.assetbundle"));  

24.         //得到文本中每一行的内容  

25.         infoall = LoadFile(Application.persistentDataPath,"FileName.txt");  

26.   

27.           

28.     }  

29.     //写入模型到本地  

30.     IEnumerator loadasset(string url)  

31.     {  

32.         WWW w = new WWW(url);  

33.         yield return w;  

34.         if (w.isDone)  

35.         {  

36.             byte[] model = w.bytes;  

37.             int length = model.Length;  

38.             //写入模型到本地  

39.             CreateModelFile(Application.persistentDataPath, "Model.assetbundle", model,length);  

40.         }  

41.     }  

42.   

43.     void CreateModelFile(string path, string name, byte[] info, int length)  

44.     {  

45.         //文件流信息  

46.         //StreamWriter sw;  

47.         Stream sw;  

48.         FileInfo t = new FileInfo(path + "//" + name);  

49.         if (!t.Exists)  

50.         {  

51.             //如果此文件不存在则创建  

52.             sw = t.Create();  

53.         }  

54.         else  

55.         {  

56.             //如果此文件存在则打开  

57.             //sw = t.Append();  

58.             return;  

59.         }  

60.         //以行的形式写入信息  

61.         //sw.WriteLine(info);  

62.         sw.Write(info, 0, length);  

63.         //关闭流  

64.         sw.Close();  

65.         //销毁流  

66.         sw.Dispose();  

67.     }   

68.    

69.    /** 

70.    * path:文件创建目录 

71.    * name:文件的名称 

72.    *  info:写入的内容 

73.    */  

74.    void CreateFile(string path,string name,string info)  

75.    {  

76.       //文件流信息  

77.       StreamWriter sw;  

78.       FileInfo t = new FileInfo(path+"//"+ name);  

79.       if(!t.Exists)  

80.       {  

81.         //如果此文件不存在则创建  

82.         sw = t.CreateText();  

83.       }  

84.       else  

85.       {  

86.         //如果此文件存在则打开  

87.         sw = t.AppendText();  

88.       }  

89.       //以行的形式写入信息  

90.       sw.WriteLine(info);  

91.       //关闭流  

92.       sw.Close();  

93.       //销毁流  

94.       sw.Dispose();  

95.    }  

96.   

97.      

98.    

99.   /** 

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.        string s = null;  

135. #if UNITY_ANDROID  

136.        s = "jar:file://"+path+"/"+name;  

137. #elif UNITY_IPHONE  

138.        s = path+"/"+name;  

139. #elif UNITY_STANDALONE_WIN || UNITY_EDITOR  

140.        s = "file://"+path+"/"+name;  

141. #endif  

142.        WWW w = new WWW(s);  

143.        yield return w;  

144.        if (w.isDone)  

145.        {  

146.            Instantiate(w.assetBundle.mainAsset);  

147.        }  

148.    }  

149.   

150.    

151.   /** 

152.    * path:删除文件的路径 

153.    * name:删除文件的名称 

154.    */  

155.    

156.    void DeleteFile(string path,string name)  

157.    {  

158.         File.Delete(path+"//"+ name);  

159.    }  

160.    

161.    void OnGUI()  

162.    {  

163.         //用新的皮肤资源,显示中文  

164.         GUI.skin = skin;  

165.         //读取文件中的所有内容  

166.         foreach(string str in infoall)  

167.         {  

168.             //绘制在屏幕当中  

169.             GUILayout.Label(str);  

170.         }  

171.         if (GUILayout.Button("加载模型"))  

172.         {  

173.             StartCoroutine(LoadModelFromLocal(Application.persistentDataPath, "Model.assetbundle"));  

174.         }  

175.    }  

176.    

177. }  





上面设计到文件流操作,还有就是Application.persistentDataPath,这里并没有用Application.DataPath,后者貌似在移动平台是找不到的,前者就是所谓的沙盒文件,具有读写权限。

运行后的效果:

 

这里演示了读取操作文本和打包文件,如果切换到移动平台可能中文字体无法显示,就需要做个字体即可,后面继续版本控制后续工作。

 

 

补充:假设你的程序中已经预先将2进制文件做好,如下图所示,你需要把二进制文件放在StreamingAssets这个文件夹中,一定要放在这里。

 

举个例子,放在StreamingAssets中二进制文件打包后,Unity会将这些二进制文件放置在对应平台下的路径下。所以根据不同平台,访问的路径是不一样的。切记,你的二进制文件一定要放在StreamingAssets !!!!!!

01

#if UNITY_EDITOR

02

        string filepath = Application.dataPath +"/StreamingAssets"+"/my.xml";

 

03

 

04

#elif UNITY_IPHONE

 

05

      string filepath = Application.dataPath +"/Raw"+"/my.xml";

06

 

 

07

#elif UNITY_ANDROID

08

      string filepath = "jar:file://" + Application.dataPath + "!/assets/"+"/my.xml;

 

09

 

10

#endif


路过

雷人

握手

鲜花

鸡蛋

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-5-15 20:58 , Processed in 0.049352 second(s), 16 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

返回顶部