Saya menulis beberapa kode untuk mendapatkan semua folder di dalam folder di dalam StreamingAssets dan kemudian untuk mendapatkan semua file di folder itu. Ini berfungsi dengan baik di Windows tetapi saya tidak bisa membuatnya berfungsi di Android.
Ini kodenya:
foreach (string s in Directory.GetDirectories(model.path + "/Levels")) {
GameObject el = (GameObject)Instantiate(listButton, Vector3.zero, Quaternion.identity);
el.transform.SetParent(grid1.transform);
string[] words = s.Split('/');
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
words = s.Split('\\');
#endif
el.GetComponentInChildren<Text>().text = words[words.Length - 1];
el.GetComponent<Button>().onClick.AddListener(() => {
MapSizeButtonClick(Int32.Parse(el.GetComponentInChildren<Text>().text));
});
}
Saya harus menambahkan #if UNITY_STANDALONE_WIN untuk windows karena '\'.
Kemudian untuk file di dalam folder itu saya menulis ini:
foreach (string s in Directory.GetFiles(model.path + "/Levels/" + model.mapSize + "/" + model.colorNumber)) {
string[] words = s.Split('/');
#if UNITY_STANDALONE_WIN || UNITY_EDITOR_WIN
words = s.Split('\\');
#endif
words = words[words.Length - 1].Split('.');
if (words[1] == "json") {
GameObject el = (GameObject)Instantiate(listButton, Vector3.zero, Quaternion.identity);
el.transform.SetParent(grid3.transform);
el.GetComponentInChildren<Text>().text = words[0];
el.GetComponent<Button>().onClick.AddListener(() => {
levelButtonClick(Int32.Parse(el.GetComponentInChildren<Text>().text));
});
}
}
Saya menggunakan UnityEngine.UI.Directory tetapi saya membacanya tidak dapat digunakan di Android dan saya harus menggunakan WWW. Sesuatu seperti ini :
string xmlSetUpPath = "jar:file://" + Application.dataPath + "!/assets/xml/xmlSetUp.xml";
WWW book1WWW = new WWW(book1Path);
yield return book1WWW;
if(!File.Exists(Application.persistentDataPath + "/xml/book1.xml"))
{
File.WriteAllBytes(Application.persistentDataPath + "/xml/book1.xml", book1WWW.bytes);
}
Namun saya tidak dapat menemukan yang seperti Directory.getFiles() atau Directory.getFolder(). Jadi saya pikir saya bisa menggunakan WWW untuk memeriksa apakah file tersebut ada (karena nama filenya adalah 1.json, 2.json, 3.json) dan mengulanginya hingga file tidak ada.
Tetapi saya juga perlu memeriksa apakah ada folder untuk bagian pertama skrip dan saya tidak dapat menemukan cara memeriksa apakah ada folder dengan WWW. (Nama folder saya juga 1,2,3,4...)
Jadi bagaimana cara memeriksa apakah ada folder dengan WWW?
Atau apa lagi yang bisa saya lakukan?
PEMBARUAN :
Saya memperbarui kodenya, sekarang terlihat seperti ini:
for (int i = 0; i < 100; i++) {
if (Directory.Exists(Path.Combine(model.path, "Levels/" + i.ToString()))){
GameObject el = (GameObject)Instantiate(listButton, Vector3.zero, Quaternion.identity);
el.transform.SetParent(grid1.transform);
el.GetComponentInChildren<Text>().text = i.ToString();
el.GetComponent<Button>().onClick.AddListener(() => {
MapSizeButtonClick(Int32.Parse(el.GetComponentInChildren<Text>().text));
});
}
}
Saya menggunakan path.combine() dan memeriksa setiap folder dari 0 hingga 100. Ini berfungsi di Windows tetapi masih tidak berfungsi di Android.
Jalurnya diatur seperti ini:
#if UNITY_IPHONE
path = Application.dataPath + "/Raw";
#endif
#if UNITY_ANDROID
path = "jar:file://" + Application.dataPath + "!/assets";
#endif
#if UNITY_STANDALONE || UNITY_EDITOR
path = Application.dataPath + "/StreamingAssets";
#endif
PEMBARUAN PERTANYAAN
Saya membuat skrip yang menghasilkan jalur file. Jalurnya selalu sama: "FolderNumerotedFromYToX/FolderNumerotedFromYToX/FileNumerotedFrom1ToX.json". Pembuatannya berfungsi tetapi penulisan ke JSON tidak. Ini menghasilkan "{}".
// Generate level list
List<KeyValuePair<int, List<KeyValuePair<int, List<int>>>>> l;
l = new List<KeyValuePair<int, List<KeyValuePair<int, List<int>>>>>();
for (int i = 1; i < 100; i++) {
if (Directory.Exists(Path.Combine(Path.Combine(Application.dataPath, "StreamingAssets"), "Levels/" + i.ToString()))) {
l.Add(new KeyValuePair<int, List<KeyValuePair<int, List<int>>>>(i, new List<KeyValuePair<int, List<int>>>()));
for (int j = 1; j < 100; j++) {
if (Directory.Exists(Path.Combine(Path.Combine(Application.dataPath, "StreamingAssets"), "Levels/" + i + "/" + j))) {
l[l.Count - 1].Value.Add(new KeyValuePair<int, List<int>>(j, new List<int>()));
int k = 1;
while (true) {
if (File.Exists(Path.Combine(Path.Combine(Application.dataPath, "StreamingAssets"), "Levels/" + i + "/" + j + "/" + k + ".json"))) {
l[l.Count - 1].Value[l[l.Count - 1].Value.Count - 1].Value.Add(k);
}
else
break;
k++;
}
}
}
}
}
string ljson = JsonUtility.ToJson(l);
var lsr = File.CreateText("Assets/StreamingAssets/levels.json");
lsr.WriteLine(ljson);
lsr.Close();
Bisakah Anda membantu saya menemukan cara untuk menyimpannya ke file?
Application.persistentDataPath
di semua kasus - semua platform - di mana pun - apa pun yang terjadi. - person Fattie   schedule 23.02.2016