• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

游戏开发

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

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/youxikaifa/2018/1022/109.html

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

今天我们常州手机游戏App开发培训专家幻天网络要教大家做一个移动平台的版本控制,先做一个前期的工作,就是从服务器端加载资源,然后读取到本地,再从本地读取资源。这里就以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://www.homeqin.cn/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();

    } 

 

   

   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();

   }

 

   

 

 

   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);

       }

   }

 

 

 

 

   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


上篇:上一篇:UGUI之Selectable功能详解(UI动画)
下篇:下一篇:U3D关于资源加载和内存管理