开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

教程分享

关注:595

当前位置:游戏蛮牛 技术专区 教程分享

查看: 738|回复: 0

[基础知识] Unity发布后资源路径问题(XML反序列化)

[复制链接]  [移动端链接]
7日久生情
3820/5000
排名
2465
昨日变化

1477

主题

1485

帖子

3820

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
132510
好友
17
蛮牛币
33903
威望
0
注册时间
2015-12-24
在线时间
307 小时
最后登录
2017-3-24
发表于 2016-9-2 10:59:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x
  前些天将在windows上做好的程序发布一个版本,要拿出去给人家看看,本来最初我是做了针对各个平台的xml反序列化的,按照网上大多数说的路径如下:

  根目录:StreamingAssets文件夹

  #if UNITY_EDITOR

  string filepath = Application.dataPath +"/StreamingAssets"+"/my.xml";

  #elif UNITY_IPHONE

  string filepath = Application.dataPath +"/Raw"+"/my.xml";

  #elif UNITY_

  string filepath = "jar:file://" + Application.dataPath + "!/assets/"+"/my.xml;  //只是文件看似在那里,并不能直接使用

  #endif

  发布一个apk出来,将其解压,发现跟网上说的路径是一致的,但是Android真机上就是读取不了,后来用File exists查看,返回false,就是说找不到这个文件,当时很纳闷,路径看上去应该没错的,怎么就不行呢,后来查到Android好像不能通过这个路径读取,在真机中文件都是以包的形式存在的,所以只能通过resource load 或者www的方式获取了然后再读出来。我选择了WWW的方式读取相关资源文件。

  我的项目的相关xml在assets/StreamingAssets/AssetBundles/下,(记住:要想读取到必须放到StreamingAssets下)

  针对各个平台的xml反序列化相关代码如下:


[AppleScript] 纯文本查看 复制代码
  using System;

  using System.IO;

  using System.Xml.Serialization;

  using UnityEngine;

  using System.Text;

  using Game.Jeson.Utils;

  namespace Game.Jeson.Utils

  {

  public class SerializeXmlUtils

  {

  FileInfo fileInfo;

  string _data;

  string _filename;

  /// <summary>

  /// 读取/StreamingAssets/AssetBundles/文件夹下指定的文件

  /// </summary>

  /// <param name="filename">文件名,如果文件所在目录是AssetBundles的子目录,则必须带上</param>

  /// <returns></returns>

  public static Stream LoadXML(string filename)

  {

  MemoryStream memoryStream = null;

  string data = string.Empty;

  string fullFileName = filename;

  FileInfo fileInfo = null;

  if (Application.platform == RuntimePlatform.IPhonePlayer)

  {

  fullFileName = Application.dataPath + "/Raw/AssetBundles/" + filename;

  fileInfo = new FileInfo(fullFileName);

  StreamReader r = fileInfo.OpenText();

  data = r.ReadToEnd();

  r.Close();

  }

  else if (Application.platform == RuntimePlatform.Android)

  {

  fullFileName = Application.streamingAssetsPath + "/AssetBundles/" + filename;

  // WWW类会即时返回,导致后面于此相关的操作就会失败

  // 我们读文件的时候还是需要阻塞,不然真心坑爹

  //StartCoroutine(LoadWWW());

  WWW www = new WWW(fullFileName);

  while (www.error == null && !www.isDone) ;

  data = www.text;

  }

  else

  {

  fullFileName = Application.dataPath + "/StreamingAssets/AssetBundles/" + filename;

  fileInfo = new FileInfo(fullFileName);

  StreamReader r = fileInfo.OpenText();

  data = r.ReadToEnd();

  r.Close();

  }

  if (data.ToString() != string.Empty)

  {

  byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(data);

  memoryStream = new MemoryStream(byteArray, true);

  }

  return memoryStream;

  }

  /// <summary>

  /// 将指定的xml文件反序列化为对象

  /// </summary>

  /// <typeparam name="T"></typeparam>

  /// <param name="path"></param>

  /// <returns></returns>

  public static T DeserializeXml<T>(string path) where T : class

  {

  MemoryStream memoryStream = SerializeXmlUtils.LoadXML(path) as MemoryStream;

  //Debug.LogError("memoryStream == null ? " + (memoryStream == null));

  if (memoryStream == null) return null;

  T t;

  try

  {

  XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));

  T t1 = xmlSerializer.Deserialize(memoryStream) as T;

  if (t1 == null)

  {

  return (T)null;

  }

  else

  {

  t = t1;

  }

  }

  catch (Exception)

  {

  return (T)null;

  }

  finally

  {

  memoryStream.Close();

  }

  return t;

  }

  }

  }




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表