美文网首页Unity3d
从服务器端加载资源,然后读取到本地,再从本地读取资源

从服务器端加载资源,然后读取到本地,再从本地读取资源

作者: 萧非子 | 来源:发表于2017-11-08 06:18 被阅读17次

http://blog.csdn.net/dingxiaowei2013/article/details/19084859
今天要做一个移动平台的版本控制,先做一个前期的工作,就是从服务器端加载资源,然后读取到本地,再从本地读取资源。这里就以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

相关文章

网友评论

    本文标题:从服务器端加载资源,然后读取到本地,再从本地读取资源

    本文链接:https://www.haomeiwen.com/subject/zqtemxtx.html