• 热门专题

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

作者:  发布日期:2014-02-11 19:51:48
Tag标签:unity3d  保存文件  本地  
  • 今天要做一个移动平台的版本控制,先做一个前期的工作,就是从服务器端加载资源,然后读取到本地,再从本地读取资源。这里就以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)
       {
           print("file:///" + path + "/" + name);
           WWW w = new WWW("file:///"+path + "/" + name);
           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,后者貌似在移动平台是找不到的,前者就是所谓的沙盒文件,具有读写权限。

     

    运行后的效果:



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

     

About IT165 - 广告服务 - 隐私声明 - 版权申明 - 免责条款 - 网站地图 - 网友投稿 - 联系方式
本站内容来自于互联网,仅供用于网络技术学习,学习中请遵循相关法律法规