unity Android 打包後讀取 xml 文件

學習學習!原帖地址:http://www.cnblogs.com/wuzhang/p/wuzhang20140731.html?utm_source=tuicool&utm_medium=referral

問題: 前天在做東西的過程中發現了一個讓人很糾結的問題,爲什麼Unity 程序在PC上測試一點都沒問題但是打包發佈到Android後卻無法讀取XML文件。

通過查找自資料發現打包發不到安卓後的路徑和PC上測試時的路徑發生了變化,因此讀取就出bug了。

那麼解決方法很簡單:

1,建立一個新工程

2,添加兩個GUItext組件一個用於顯示測試平臺另一個用於顯示讀取到的XML數據,

如下:

3,該貼代碼了

//------------------------------------------------------------------------------
// <auto-generated>
//	 此代碼由工具生成。
//	 運行時版本:4.0.30319.18063
//
//	 對此文件的更改可能會導致不正確的行爲,並且如果
//	 重新生成代碼,這些更改將會丟失。
// </auto-generated>
//------------------------------------------------------------------------------
using System;
using UnityEngine;
using System.IO;
using System.Xml;
using System.Linq;
using System.Text;
using System.Collections;
using System.Collections.Generic;


namespace AssemblyCSharp1
{
  
  public class AddressData1
  {
    public string timeURL;
    public static string all;
    public static string hp;		
    public static string speed;
    public static string demage;
    
    public static string localPath;
    public static string id;
    public static string score;
    public static List<int> allScore;

    public void AddressData ()
    {
      Debug.Log (localPath);
    }

    public static List<int> getAllScore()
    {
      return allScore;
    }

    /// <summary>
    /// 獲取XML路徑
    /// </summary>
    /// <returns>The XM.</returns>
    public static IEnumerator GetXML()
    {
      if(Application.platform==RuntimePlatform.Android)
      {
        localPath = Application.streamingAssetsPath+"/score.xml"; //在Android中實例化WWW不能在路徑前面加"file://"
        Debug.Log (localPath);
      }
      else
      {
        localPath = "file://"+UnityEngine.Application.streamingAssetsPath + "/score.xml";//在Windows中實例化WWW必須要在路徑前面加"file://"
        
        Debug.Log (localPath);
      }
      WWW www = new WWW(localPath);
      while (!www.isDone)
      {
        Debug.Log("Getting GetXML");
        yield return www;
        all = www.text;
        ParseXml(www);
      }
    }
    
    /// <summary>
    ///按屬性獲取節點
    /// </summary>
    /// <param name="www">Www.</param>
    public static void ParseXml(WWW www) 
    {
      if(allScore == null)
      {
        allScore =new List<int>();
      }
      XmlDocument xmlDoc = new XmlDocument();
      xmlDoc.LoadXml(www.text);
      XmlNodeList nodeList=xmlDoc.SelectSingleNode("rank").ChildNodes;
      
      foreach(XmlElement xe in nodeList)
      {
        id = xe.GetAttribute("id");
        score = xe.GetAttribute("score");
        allScore.Add(int.Parse(score));  //將所有得分讀入List

        Debug.Log ("ID:"+id+" Score:"+score);
      }
      allScore.Sort();
      allScore.Reverse();
      foreach(var score in allScore )
      {
        Debug.Log (score.ToString());
      }
    }
    
    /// <summary>
    /// 讀取xml內容
    /// </summary>
    public static IEnumerator load()
    {
      string url = string.Empty;
      string path = string.Empty;
      string line1 = string.Empty;
      if(Application.platform==RuntimePlatform.Android)
      {
        url=Application.streamingAssetsPath+"/hp.xml"; //在Android中實例化WWW不能在路徑前面加"file://"
        
        WWW wWA=new WWW(path);///WWW讀取在各個平臺上都可使用
        yield return wWA; 
        line1=wWA.text;
        Debug.Log (line1);
      }
      else
      {
        url="file://"+Application.streamingAssetsPath+"/hp.xml";//在Windows中實例化WWW必須要在路徑前面加"file://"
        WWW wWA=new WWW("file://"+url);
        yield return wWA; 
        line1=wWA.text;
        Debug.Log (line1);
      }
      yield return null;
    }


    /// <summary>
    /// 加載xml文檔
    /// </summary>
    /// <returns></returns>
    public static  XmlDocument ReadAndLoadXml()
    {
      XmlDocument doc = new XmlDocument();
      //Debug.Log("加載xml文檔");
      doc.Load(localPath);
      return doc;
    }

    /// <summary>
    /// 增加節點
    /// </summary>
    /// <returns>The node.</returns>
    /// <param name="score">Score.</param>
    public static void insertNode(int score)
    {
      int minute=int.Parse((System.DateTime.Now.Minute.ToString()));
      string order = System.DateTime.Now.Hour+""+System.DateTime.Now.Minute+""+System.DateTime.Now.Second;
      XmlDocument xmlDoc=new XmlDocument();
      xmlDoc.Load(Application.dataPath + "/StreamingAssets/score.xml");
      XmlNode root=xmlDoc.SelectSingleNode("rank");
      
      XmlElement xel=xmlDoc.CreateElement("rank");	//建立節點
      xel.SetAttribute("id",order);
      xel.SetAttribute("score",score.ToString());
      
      root.AppendChild(xel);
      xmlDoc.Save(Application.dataPath + "/StreamingAssets/score.xml");
      return;
    }

  }


}

測試讀取數據代碼:

using UnityEngine;
using System.Collections;
using AssemblyCSharp1;

public class testinsert : MonoBehaviour 
{
  public GUIText guitext;
  public GUIText platform;
  string allscores="";

  void Awake()
  {
    if(Application.platform==RuntimePlatform.Android)
    {
      platform.text = "Android";
    }
    else
    {
      platform.text = "PC";
    }
  }

  // Use this for initialization
  void Start () 
  {

    StartCoroutine(AddressData1.GetXML());
    //AddressData1.insertNode(22);

  }

  void OnGUI()
  {
    if(GUI.Button(new Rect(100,100,40,40),"load"))
    {
      foreach(int score in AddressData1.allScore)
      {
        allscores+=score.ToString();
        guitext.text+="\t";
      }
      guitext.text = allscores;
    }
  }

  // Update is called once per frame
  void Update () 
  {
  
  }
}
<?xml version="1.0" encoding="UTF-8" ?>
<rank>
    <rank id="5618" score="12" ></rank>
    <rank id="1712" score="14" ></rank>
</rank>

那下面雞凍的時刻來了: PC端 運行前:

運行後:

點擊load按鈕:

看看控制檯都輸出哪些內容了:

PC上測試Ok了吧。

接下來Android測試,本人的手機哦:

到此結束了,以後程序關於數據處理的都是浮雲了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章