【转载】保存文件到本地and加载本地文件

本文介绍了如何在Unity中进行资源管理和版本控制的基础工作,包括跨平台文件路径配置、资源的下载与本地读取、文件的创建与删除等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 原文地址:http://www.360doc.com/content/14/0212/11/11670799_351840295.shtml

今天要做一个移动平台的版本控制,先做一个前期的工作,就是从服务器端加载资源,然后读取到本地,再从本地读取资源。这里就以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.youkuaiyun.com/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,后者貌似在移动平台是找不到的,前者就是所谓的沙盒文件,具有读写权限。

运行后的效果:

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

转载于:https://www.cnblogs.com/cokefenta/p/8023590.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值