Ошибка при создании XML файла в Unity3D

316
10 апреля 2017, 03:54

Я имею ошибки и из-за нее не создается файл сохранения.

Код системы сохранения:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
public class Save : MonoBehaviour
{
    public S PlayerInfo;
    public void SaveGame()
    {
        XmlSerializer serializer = new XmlSerializer (typeof(S));
        FileStream stream = new FileStream (Application.dataPath + "/StreamingFiles/XML/Saves.xml", FileMode.Create);
        serializer.Serialize (stream, PlayerInfo);
        stream.Close ();
    }
}

Код игрока:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class S : MonoBehaviour
{
    public bool Damaged;
    public float Health; 
    public float Armor;
}

Ошибка:

InvalidOperationException: To be XML serializable, types which inherit from IEnumerable must have an implementation of Add(System.Object) at all levels of their inheritance hierarchy. UnityEngine.Transform does not implement Add(System.Object).
System.Xml.Serialization.TypeData.get_ListItemType ()
System.Xml.Serialization.TypeData.get_ListItemTypeData ()
System.Xml.Serialization.TypeData..ctor (System.Type type, System.String elementName, Boolean isPrimitive, System.Xml.Serialization.TypeData mappedType, System.Xml.Schema.XmlSchemaPatternFacet facet)
System.Xml.Serialization.TypeData..ctor (System.Type type, System.String elementName, Boolean isPrimitive)
System.Xml.Serialization.TypeTranslator.GetTypeData (System.Type runtimeType, System.String xmlDataType)
System.Xml.Serialization.TypeTranslator.GetTypeData (System.Type type)
System.Xml.Serialization.XmlReflectionImporter.GetReflectionMembers (System.Type type)
System.Xml.Serialization.XmlReflectionImporter.ImportClassMapping (System.Xml.Serialization.TypeData typeData, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace)
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (System.Xml.Serialization.TypeData typeData, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace)
Rethrow as InvalidOperationException: There was an error reflecting type 'S'.
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (System.Xml.Serialization.TypeData typeData, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace)
System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping (System.Type type, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace)
System.Xml.Serialization.XmlSerializer..ctor (System.Type type, System.Xml.Serialization.XmlAttributeOverrides overrides, System.Type[] extraTypes, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace)
System.Xml.Serialization.XmlSerializer..ctor (System.Type type)
Save.SaveGame () (at Assets/Save.cs:34)
UnityEngine.Events.InvokableCall.Invoke (System.Object[] args) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:154)
UnityEngine.Events.InvokableCallList.Invoke (System.Object[] parameters) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:637)
UnityEngine.Events.UnityEventBase.Invoke (System.Object[] parameters) (at C:/buildslave/unity/build/Runtime/Export/UnityEvent.cs:773)
UnityEngine.Events.UnityEvent.Invoke () (at C:/buildslave/unity/build/Runtime/Export/UnityEvent_0.cs:52)
UnityEngine.UI.Button.Press () (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:35)
UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/UI/Core/Button.cs:44)
UnityEngine.EventSystems.ExecuteEvents.Execute (IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:50)
UnityEngine.EventSystems.ExecuteEvents.Execute[IPointerClickHandler] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.EventFunction`1 functor) (at C:/buildslave/unity/build/Extensions/guisystem/UnityEngine.UI/EventSystem/ExecuteEvents.cs:261)
UnityEngine.EventSystems.EventSystem:Update()
Answer 1

Ты пытаешься провести операцию над объектом, который содержит UnityEngine.Transform, в котором не имплементирован (не реализован) метод Add(System.Object). Это скорее всего идет из-за наследования от Monobehaviour.

Можно (и даже нужно) сделать класс S не унаследованный от Monobehaviour с данной структурой, а отдельно, например в игроке как раз унаследоваться от моно и сделать поле с типом S

using System.Xml;
using System.Xml.Serialization;
public class PlayerInfo {
    [XmlAttribute("damaged")]
    public bool Damaged;
    [XmlAttribute("health")]
    public float Health; 
    [XmlAttribute("armor")]
    public float Armor;
}

public class Player : MonoBehaviour {
    public PlayerInfo PlayerInfoField = new PlayerInfo();        
    ...
    Start() {
     ...
    }
}

В таком случае не должно быть проблем.

P.S. я класс S заменил классом PlayerInfo, что логично и информативнее.

Сохранение

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Xml.Serialization;
using System.Xml;
public class Save : MonoBehaviour {
    public Player player;
    public void SaveGame()
    {
        XmlSerializer serializer = new XmlSerializer (typeof(PlayerInfo));
        FileStream stream = new FileStream (Application.dataPath + "/StreamingFiles/XML/Saves.xml", FileMode.Create);
        serializer.Serialize(stream, player.PlayerInfoField);
        stream.Close ();
    }
}
READ ALSO
Aforge.net работа с потоком видео

Aforge.net работа с потоком видео

в программе камера должна отображать всё происходящее в режиме онлайн без записи информации, для этого использую библиотеки AForgeVideo и AForge

356
Как правильно отобразить partial view?

Как правильно отобразить partial view?

У меня есть меню, которое я беру из базы данных и отображаю его на странице, при выборе одного из пунктов меню, мне нужно подгрузить информацию...

261
Привязка данных в WPF, списки

Привязка данных в WPF, списки

Изучаю еще только WPF, есть сложности в понимании привязки данных к отображению

262