Unity发布后资源路径问题(XML反序列化)

前端之家收集整理的这篇文章主要介绍了Unity发布后资源路径问题(XML反序列化)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

根目录:StreamingAssets文件

#if UNITY_EDITOR
string filepath = Application.dataPath +"/StreamingAssets"+"/my.xml";
#elif UNITY_IPHONE
string filepath = Application.dataPath +"/Raw"+"/my.xml";
#elif UNITY_ANDROID
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反序列化相关代码如下:

  1. using System;
  2. using System.IO;
  3. using System.Xml.Serialization;
  4. using UnityEngine;
  5. using System.Text;
  6. using Game.Jeson.Utils;
  7.  
  8. namespace Game.Jeson.Utils
  9. {
  10. public class SerializeXmlUtils
  11. {
  12. FileInfo fileInfo;
  13. string _data;
  14. string _filename;
  15.  
  16. /// <summary>
  17. /// 读取/StreamingAssets/AssetBundles/文件夹下指定的文件
  18. /// </summary>
  19. /// <param name="filename">文件名,如果文件所在目录是AssetBundles的子目录,则必须带上</param>
  20. /// <returns></returns>
  21. public static Stream LoadXML(string filename)
  22. {
  23. MemoryStream memoryStream = null;
  24. string data = string.Empty;
  25. string fullFileName = filename;
  26. FileInfo fileInfo = null;
  27.  
  28. if (Application.platform == RuntimePlatform.IPhonePlayer)
  29. {
  30. fullFileName = Application.dataPath + "/Raw/AssetBundles/" + filename;
  31. fileInfo = new FileInfo(fullFileName);
  32. StreamReader r = fileInfo.OpenText();
  33. data = r.ReadToEnd();
  34. r.Close();
  35. }
  36. else if (Application.platform == RuntimePlatform.Android)
  37. {
  38. fullFileName = Application.streamingAssetsPath + "/AssetBundles/" + filename;
  39.  
  40. // WWW类会即时返回,导致后面于此相关的操作就会失败
  41. // 我们读文件的时候还是需要阻塞,不然真心坑爹
  42. //StartCoroutine(LoadWWW());
  43. WWW www = new WWW(fullFileName);
  44. while (www.error == null && !www.isDone) ;
  45. data = www.text;
  46. }
  47. else
  48. {
  49. fullFileName = Application.dataPath + "/StreamingAssets/AssetBundles/" + filename;
  50. fileInfo = new FileInfo(fullFileName);
  51. StreamReader r = fileInfo.OpenText();
  52. data = r.ReadToEnd();
  53. r.Close();
  54. }
  55. if (data.ToString() != string.Empty)
  56. {
  57. byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(data);
  58. memoryStream = new MemoryStream(byteArray,true);
  59. }
  60.  
  61. return memoryStream;
  62. }
  63.  
  64. /// <summary>
  65. /// 将指定的xml文件反序列化为对象
  66. /// </summary>
  67. /// <typeparam name="T"></typeparam>
  68. /// <param name="path"></param>
  69. /// <returns></returns>
  70. public static T DeserializeXml<T>(string path) where T : class
  71. {
  72. MemoryStream memoryStream = SerializeXmlUtils.LoadXML(path) as MemoryStream;
  73.  
  74. //Debug.LogError("memoryStream == null ? " + (memoryStream == null));
  75. if (memoryStream == null) return null;
  76.  
  77. T t;
  78.  
  79. try
  80. {
  81. XmlSerializer xmlSerializer = new XmlSerializer(typeof(T));
  82.  
  83. T t1 = xmlSerializer.Deserialize(memoryStream) as T;
  84.  
  85. if (t1 == null)
  86. {
  87. return (T)null;
  88. }
  89. else
  90. {
  91. t = t1;
  92. }
  93. }
  94. catch (Exception)
  95. {
  96. return (T)null;
  97. }
  98. finally
  99. {
  100. memoryStream.Close();
  101. }
  102. return t;
  103. }
  104. }
  105. }

猜你在找的XML相关文章