我们在读写例如XML和TXT文件的时候,在电脑上和手机上路径不一致,造成了很多麻烦,其实有个简单的方法,在项目工程中新建一个StreamingAssets文件夹,把你的XML和TXT文件放到这里。
- using UnityEngine;
- using System.Collections;
- using System.Xml;
- using System.Xml.Serialization;
- using System.IO;
- using System.Text;
- public class Reward
- {
- public int taskNo;
- public Task[] task = new Task[15];
- public Attribute attribute;
- public Reward () {}
- public struct Task
- {
- [XmlAttribute("taskReward")]
- public string taskReward{ get; set;}
- public Id id1;
- public Id id2;
- public Id id3;
- }
- public struct Id
- {
- [XmlAttribute("flag")]
- public bool flag{ get; set;}
- [XmlAttribute("name")]
- public string name{ get; set;}
- [XmlText()]
- public string description{get;set;}
- }
- }
- public class AchievementManager: MonoBehaviour {
- Reward reward ;
- FileInfo fileInfo;
- string _data;
- void Start ()
- {
- reward = new Reward();
- LoadXML();
- }
- void LoadXML()
- {
- if(Application.platform == RuntimePlatform.IPhonePlayer)
- {
- fileInfo = new FileInfo(Application.dataPath + "/Raw/" + "Achievement.xml");
- StreamReader r = fileInfo.OpenText();
- _data = r.ReadToEnd();
- r.Close();
- }
- else if(Application.platform == RuntimePlatform.Android)
- {
- fileInfo = new FileInfo(Application.streamingAssetsPath+"/Achievement.xml");
- StartCoroutine("LoadWWW");
- }
- else
- {
- fileInfo = new FileInfo(Application.dataPath + "/StreamingAssets/"+ "Achievement.xml");
- StreamReader r = fileInfo.OpenText();
- _data = r.ReadToEnd();
- r.Close();
- }
- if(_data.ToString() != "")
- {
- reward = (Reward)DeserializeObject(_data);
- }
- }
- void OnGUI()
- {
- GUI.Label(new Rect(0,0,Screen.width,Screen.height),"data:"+_data);
- if(Input.GetKey(KeyCode.Space))
- {
- Application.Quit();
- }
- }
- IEnumerator LoadWWW()
- {
- WWW www = new WWW(Application.streamingAssetsPath+"/Achievement.xml");
- yield return www;
- _data =www.text;
- }
- public void Save()
- {
- _data = SerializeObject(reward);
- StreamWriter writer;
- fileInfo.Delete();
- writer = fileInfo.CreateText();
- writer.Write(_data);
- writer.Close();
- }
- string UTF8ByteArrayToString(byte[] characters)
- {
- UTF8Encoding encoding = new UTF8Encoding();
- string constructedString = encoding.GetString(characters);
- return (constructedString);
- }
- byte[] StringToUTF8ByteArray(string pXmlString)
- {
- UTF8Encoding encoding = new UTF8Encoding();
- byte[] byteArray = encoding.GetBytes(pXmlString);
- return byteArray;
- }
- // Here we serialize our Reward object of reward
- string SerializeObject(object pObject)
- {
- string XmlizedString = null;
- MemoryStream memoryStream = new MemoryStream();
- XmlSerializer xs = new XmlSerializer(typeof(Reward));
- XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
- xs.Serialize(xmlTextWriter, pObject);
- memoryStream = (MemoryStream)xmlTextWriter.BaseStream;
- XmlizedString = UTF8ByteArrayToString(memoryStream.ToArray());
- return XmlizedString;
- }
- // Here we deserialize it back into its original form
- object DeserializeObject(string pXmlizedString)
- {
- XmlSerializer xs = new XmlSerializer(typeof(Reward));
- MemoryStream memoryStream = new MemoryStream(StringToUTF8ByteArray(pXmlizedString));
- XmlTextWriter xmlTextWriter = new XmlTextWriter(memoryStream, Encoding.UTF8);
- return xs.Deserialize(memoryStream);
- }
- }
注:其实每个平台的路径都可以是Application.streamingAssetsPath+"/Achievement.xml"。但是android平台必须要用WWW加载,其他的平台貌似也可以的,自己试试哈,呵呵~~~