Я имею ошибки и из-за нее не создается файл сохранения.
Код системы сохранения:
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()
Ты пытаешься провести операцию над объектом, который содержит 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 ();
}
}
в программе камера должна отображать всё происходящее в режиме онлайн без записи информации, для этого использую библиотеки AForgeVideo и AForge
У меня есть меню, которое я беру из базы данных и отображаю его на странице, при выборе одного из пунктов меню, мне нужно подгрузить информацию...
Изучаю еще только WPF, есть сложности в понимании привязки данных к отображению