2016-05-13 6 views
1

私はいくつかのコンテンツを持つ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; 
} 
} 
+0

あなたはいつでもhttp://stackoverflow.com/a/36236745/294884を使用していると思いますか? – Fattie

+0

私はいつもApplication.persistentDataPathを使用する必要がありますか?そのフォルダはどこですか? – user2686299

+0

Application.persistentDataPathのみを使用する必要があります。 (これはUnityドキュメンテーションがこれまでに何か他のことを言及していることを非常に混乱させています。)「どこにいるか」を知ることはできません。あなたのMacやPC上で、フォルダを調べて(何かをチェックする)、このコードを 'Debug.Log(Application.persistentDataPath);のどこにでも追加すれば、それを見ることができます。それが役に立てば幸い。 – Fattie

答えて

2

は、「私は、このフォルダ内の私のxmlファイルを置き、それを読んでもらいたい。それはゲームのためのデフォルトの情報のようなものだ」ちょうどあなたの資産に入れて、簡単

。このようにしてください...

public TextAsset myXMLFile; 

インスペクタでファイルをドラッグします。あなたは終わった。


"しかし、私はまた、そのファイルを変更して保存したい"

十分なフェア。あなたがしなければならないことは

は、(1)経路p = Application.persistentDataPath + "values.txt"

(2)プログラムの起動を行うことです。

(3) "p"が存在するかどうかを確認します。そうならば、それを読んで、(6)

に行くされていない場合(4)、(5)(3)

(6を指すように行く

textassetを読んで、 "P" にそれを保存します)あなたは終わった。

これは唯一の方法です。これは本当にUnityの通常の手順です。すべてのUnityアプリケーションでそれを行います。他の方法はありません!

+0

ええのためのデフォルト情報のようですが、私はまた、そのファイルを変更して保存したい – user2686299

+0

gotchya、回答を参照してください – Fattie

+1

私は期待通りに、xDの答えをありがとう – user2686299

関連する問題