Сохранение и загрузка XML Файл в IOS создает проблему в моем проекте Unity - PullRequest
0 голосов
/ 03 марта 2020

Я создаю игру с Unity3d и использую редактор 2019.3.3.

У меня проблема с IOS сборками.

Я пробую свою игру на устройстве android и он работает нормально, однако вчера я попробовал свою игру на IOS devide, и у меня были проблемы с сохранением и загрузкой файла xml на IOS.

Я использую этот код для сохранения:

SaveAvatar() {

XmlSerializer serializer = new XmlSerializer(typeof(AvatarData));        
FileStream stream = new FileStream(Application.persistentDataPath + "avatar_data.xml", FileMode.Create);        
serializer.Serialize(stream, avatarData);        
stream.Close();
}

и я использую этот код для загрузки:

LoadAvatar() {
XmlSerializer serializer = new XmlSerializer(typeof(AvatarData));        
FileStream stream = new FileStream(Application.persistentDataPath + "avatar_data.xml", FileMode.Open);        
avatarData = (AvatarData)serializer.Deserialize(stream);        
stream.Close();
}

Also in OnEnable function I create my xml file if it does not exists: Without this code, it is not saving the game in editor or android as well.

OnEnable () { 
if (!File.Exists(Application.persistentDataPath + "avatar_data.xml"))        {            avatarData.jobID = 10000;
            
SaveAvatar();        
}

Эти коды не работают в IOS, даже если сериализация класса содержит только один тип int. (Я попытался сохранить другой класс, чтобы увидеть, есть ли у моего основного класса сохранения проблемы или нет)

Мой класс сохранения содержит типы переменных:

Строки, Ints, Enums, float, list, другие классы и переменные собственного класса

Вот примеры переменных из моего класса: (Выборки из всех типов переменных)

[System.Serializable]
public class AvatarData{ 
   
public bool dead;

public string avatarName; 
      
public int age;   
    
public float health;

public AvatarData father; (Self Class variable) 

public EnumGender gender; (Enum)
        
public JobClass job; (Another Class variable)

public List<GroupClass> groups; (Another Class List variable) 
   
public List<AvatarData> children; (Self Class List variable) 
   
public List<PetClass> pets;    
public List<LogClass> logs;    
public List<JobClass> Jobs;    
public List<EventClass> tempEvents;    
public List<ItemsClass> myItems;
}

Когда я использую функции SaveAvatar или LoadAvatar, в IOS это вызывает ошибки и код не продолжает дальнейшие строки. без сохранений работает нормально.

Может кто-нибудь сказать мне, что не так с моим кодом

Спасибо

1 Ответ

0 голосов
/ 04 марта 2020

Как сказано в комментариях:

Никогда использовать простую конкатенацию строк для системных путей!

И обратите внимание, что особенно

Application.persistentDataPath + "avatar_data.xml" 

без какого-либо разделителя не имеет смысла, поскольку это будет файл вне папки

Application.persistentDataPath

, так как это приведет к чему-то вроде

/rootfolder/applicationfolderavatar_data.xml

Вам нужен либо \, либо / между ними, например,

/rootfolder/applicationfolder/avatar_data.xml

Причиной, по которой он работал на Android, могут быть менее строгие правила доступа к файлам поэтому вам разрешено записывать файл вне папки приложения, в iOs afaik по умолчанию вы строго помещены в «песочницу» для папки приложения.


Поэтому лучше использовать Path.Combine который использует правильные разделители пути в соответствии с работающей ОС.

Path.Combine(Application.persistentDataPath, "avatar_data.xml")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...