私はいくつかのコンテンツを持つxmlファイルを準備していて、iOSデバイスで再生中にロードするだけでなく、ロードしたデータを変更して、同じファイルで再度シリアル化したいと思います。 Unity Editor(Windows)では完全に動作しますが、iOSデバイスでテストすると、WWWクラスを使用してStreamingAssetsから読み込むことができますが、書き込むことはできません。 また、私はApplication.persistentDataPathによって作成されたパスに読み書きすることができます。しかし、それはデバイスのどこかの場所と私はその場所に自分のxmlを置くことができないとユーザーは良いソリューションではないように、そのフォルダにアクセスしているようですね?XMLファイルを同じ場所に読み書きする方法は?
ここでは、データのロードと保存に使用するコードです。
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.IO;
using System.Xml;
public class testxml : MonoBehaviour {
public Text result;
public InputField firstPart, secondPart;
public Toggle toggle;
private List<int> listToSave;
// Use this for initialization
void Start() {
listToSave = new List<int>();
}
public void Save()
{
Serialize();
}
public void Load()
{
StartCoroutine(Deserialize());
}
private void Serialize()
{
string path = GetPath();
try
{
Debug.Log("trying to save");
var serializer = new XmlSerializer(typeof(List<int>));
using (var fs = new FileStream(path, FileMode.OpenOrCreate))
{
serializer.Serialize(fs, listToSave);
}
}
catch (XmlException e)
{
result.text = "error";
Debug.LogError(path + " with " + (toggle.isOn ? "persistent data path" : "data path"));
Debug.LogError("xml exc while des file : " + e.Message);
}
catch (System.Exception e)
{
result.text = "error";
Debug.LogError("exc while des file : " + e.Message);
Debug.LogError(path + " with " + (toggle.isOn ? "persistent data path" : "data path"));
System.Exception exc = e.InnerException;
int i = 0;
while (exc != null)
{
Debug.Log("inner " + i + ": " + exc.Message);
i++;
exc = exc.InnerException;
}
}
}
private IEnumerator Deserialize()
{
Debug.Log("trying to load");
string path = GetPath();
var www = new WWW(path);
yield return www;
if (www.isDone && string.IsNullOrEmpty(www.error))
{
try
{
var serializer = new XmlSerializer(typeof(List<int>));
MemoryStream ms = new MemoryStream(www.bytes);
listToSave = serializer.Deserialize(ms) as List<int>;
ms.Close();
result.text += "Done\n";
foreach (var i in listToSave)
result.text += i + "\n";
}
catch (XmlException e)
{
result.text = "error";
Debug.LogError(path + " with " + (toggle.isOn?"persistent data path":"data path"));
Debug.LogError("xml exc while des file : " + e.Message);
}
catch (System.Exception e)
{
result.text = "error";
Debug.LogError("exc while des file : " + e.Message);
Debug.LogError(path + " with " + (toggle.isOn ? "persistent data path" : "data path"));
System.Exception exc = e.InnerException;
int i = 0;
while(exc!=null)
{
Debug.Log("inner "+i+": " + exc.Message);
i++;
exc = exc.InnerException;
}
}
yield break;
}
else
{
Debug.LogError("www exc while des file " + www.error);
Debug.LogError(path + " with " + (toggle.isOn ? "persistent data path" : "data path"));
yield break;
}
}
private string GetPath()
{
string path = firstPart.text;
if (toggle.isOn)
{
path += Application.persistentDataPath;
}
else
path += Application.dataPath;
path += secondPart.text;
return path;
}
}
あなたはいつでもhttp://stackoverflow.com/a/36236745/294884を使用していると思いますか? – Fattie
私はいつもApplication.persistentDataPathを使用する必要がありますか?そのフォルダはどこですか? – user2686299
Application.persistentDataPathのみを使用する必要があります。 (これはUnityドキュメンテーションがこれまでに何か他のことを言及していることを非常に混乱させています。)「どこにいるか」を知ることはできません。あなたのMacやPC上で、フォルダを調べて(何かをチェックする)、このコードを 'Debug.Log(Application.persistentDataPath);のどこにでも追加すれば、それを見ることができます。それが役に立てば幸い。 – Fattie