[unity3d]保存文件到本地and加载本地文件

简介:

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

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

//不同平台下StreamingAssets的路径是不同的,这里需要注意一下。 public static readonly string PathURL = #if UNITY_ANDROID   //安卓 	"jar:file://" + Application.dataPath + "!/assets/"; #elif UNITY_IPHONE  //iPhone 	Application.dataPath + "/Raw/"; #elif UNITY_STANDALONE_WIN || UNITY_EDITOR  //windows平台和web平台 	"file://" + Application.dataPath + "/StreamingAssets/"; #else         string.Empty; #endif

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

操作步骤:

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

using UnityEngine; using System.Collections; using System.IO; using System.Collections.Generic; using System;   public class Text : MonoBehaviour {     //文本中每行的内容     ArrayList infoall;     //皮肤资源,这里用于显示中文     public GUISkin skin;     void Start ()     {         print("当前文件路径:"+Application.persistentDataPath);         //删除文件         DeleteFile(Application.persistentDataPath,"FileName.txt");           //创建文件,共写入3次数据         CreateFile(Application.persistentDataPath,"FileName.txt","dingxiaowei");         CreateFile(Application.persistentDataPath,"FileName.txt","丁小未");         //CreateFile(Application.persistentDataPath ,"Filename.assetbundle","丁小未");         //下载模型         StartCoroutine(loadasset("http://192.168.1.180/3DShowResource/Products/AssetBundles/HX_DY02.assetbundle"));         //得到文本中每一行的内容         infoall = LoadFile(Application.persistentDataPath,"FileName.txt");               }     //写入模型到本地     IEnumerator loadasset(string url)     {         WWW w = new WWW(url);         yield return w;         if (w.isDone)         {             byte[] model = w.bytes;             int length = model.Length;             //写入模型到本地             CreateModelFile(Application.persistentDataPath, "Model.assetbundle", model,length);         }     }      void CreateModelFile(string path, string name, byte[] info, int length)     {         //文件流信息         //StreamWriter sw;         Stream sw;         FileInfo t = new FileInfo(path + "//" + name);         if (!t.Exists)         {             //如果此文件不存在则创建             sw = t.Create();         }         else         {             //如果此文件存在则打开             //sw = t.Append();             return;         }         //以行的形式写入信息         //sw.WriteLine(info);         sw.Write(info, 0, length);         //关闭流         sw.Close();         //销毁流         sw.Dispose();     }       /**    * path:文件创建目录    * name:文件的名称    *  info:写入的内容    */    void CreateFile(string path,string name,string info)    {       //文件流信息       StreamWriter sw;       FileInfo t = new FileInfo(path+"//"+ name);       if(!t.Exists)       {         //如果此文件不存在则创建         sw = t.CreateText();       }       else       {         //如果此文件存在则打开         sw = t.AppendText();       }       //以行的形式写入信息       sw.WriteLine(info);       //关闭流       sw.Close();       //销毁流       sw.Dispose();    }          /**    * 读取文本文件    * path:读取文件的路径    * name:读取文件的名称    */    ArrayList LoadFile(string path,string name)    {         //使用流的形式读取         StreamReader sr =null;         try{             sr = File.OpenText(path+"//"+ name);         }catch(Exception e)         {             //路径与名称未找到文件则直接返回空             return null;         }         string line;         ArrayList arrlist = new ArrayList();         while ((line = sr.ReadLine()) != null)         {             //一行一行的读取             //将每一行的内容存入数组链表容器中             arrlist.Add(line);         }         //关闭流         sr.Close();         //销毁流         sr.Dispose();         //将数组链表容器返回         return arrlist;    }        //读取模型文件    IEnumerator LoadModelFromLocal(string path, string name)    {        string s = null; #if UNITY_ANDROID        s = "jar:file://"+path+"/"+name; #elif UNITY_IPHONE        s = path+"/"+name; #elif UNITY_STANDALONE_WIN || UNITY_EDITOR        s = "file://"+path+"/"+name; #endif        WWW w = new WWW(s);        yield return w;        if (w.isDone)        {            Instantiate(w.assetBundle.mainAsset);        }    }      /**    * path:删除文件的路径    * name:删除文件的名称    */      void DeleteFile(string path,string name)    {         File.Delete(path+"//"+ name);    }      void OnGUI()    {         //用新的皮肤资源,显示中文         GUI.skin = skin;         //读取文件中的所有内容         foreach(string str in infoall)         {             //绘制在屏幕当中             GUILayout.Label(str);         }         if (GUILayout.Button("加载模型"))         {             StartCoroutine(LoadModelFromLocal(Application.persistentDataPath, "Model.assetbundle"));         }    }   }



上面设计到文件流操作,还有就是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

 



==================== 迂者 丁小未 CSDN博客专栏=================

MyBlog:http://blog.csdn.net/dingxiaowei2013             MyQQ:1213250243

Unity QQ群:858550         cocos2dx QQ群:280818155

====================== 相互学习,共同进步 ===================
















本文转蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366123,如需转载请自行联系原作者

相关文章
|
开发工具 图形学 git
Unity 之 加载工程卡在音频处不动(Unity识别不出音频文件)
在Git上克隆同事上传的工程,打开是卡在音频处不动解决方案分享。
747 0
Unity 之 加载工程卡在音频处不动(Unity识别不出音频文件)
|
3月前
|
图形学 缓存 算法
掌握这五大绝招,让您的Unity游戏瞬间加载完毕,从此告别漫长等待,大幅提升玩家首次体验的满意度与留存率!
【8月更文挑战第31天】游戏的加载时间是影响玩家初次体验的关键因素,特别是在移动设备上。本文介绍了几种常见的Unity游戏加载优化方法,包括资源的预加载与异步加载、使用AssetBundles管理动态资源、纹理和模型优化、合理利用缓存系统以及脚本优化。通过具体示例代码展示了如何实现异步加载场景,并提出了针对不同资源的优化策略。综合运用这些技术可以显著缩短加载时间,提升玩家满意度。
183 5
|
3月前
|
API C# 图形学
Unity3D学习笔记9——加载纹理
Unity3D学习笔记9——加载纹理
41 2
|
5月前
|
存储 JSON 关系型数据库
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——大型游戏存储的最优解
171 2
|
5月前
|
存储 JSON 图形学
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
【unity实战】制作unity数据保存和加载系统——小型游戏存储的最优解
187 0
|
5月前
|
定位技术 图形学 开发者
【Unity实战】切换场景加载进度和如何在后台异步加载具有庞大世界的游戏场景,实现无缝衔接(附项目源码)
【Unity实战】切换场景加载进度和如何在后台异步加载具有庞大世界的游戏场景,实现无缝衔接(附项目源码)
355 0
|
6月前
|
缓存 API 图形学
【Unity 3D】AssetBundle打包、上传、加载、卸载详解及演示(附源码)
【Unity 3D】AssetBundle打包、上传、加载、卸载详解及演示(附源码)
267 0
|
图形学 索引
|
API Android开发 图形学
【Unity3D】Bundle打包及加载流程Android篇
生成Bundle文件主要是如何对资源进行设置Bundle名及其分类的过程。目前有两种方式,第一种就是在编辑器里面设置每个资源的Bundle名称(如图1),这是最简单直观的操作方式;另一种方式就是通过编写代码并配合资源配置文件进行控制,先通过代码遍历项目工程的资源然后根据资源配置设置其Bundle名称,也可以暴力的按照资源类型进行分类,由于不同项目的控制方式不同,因此就不过多介绍。
663 0
【Unity3D】Bundle打包及加载流程Android篇
|
API 图形学 Python
【Unity使用UGUI实现王者荣耀UI界面(三)】登录界面以及加载界面优化
【Unity使用UGUI实现王者荣耀UI界面(三)】登录界面以及加载界面优化
304 0
【Unity使用UGUI实现王者荣耀UI界面(三)】登录界面以及加载界面优化