尝试将List保存到PlayerPrefs。这是我尝试使用的方法......
列表是一个列表...
BaseEnemy类是......
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[System.Serializable]
public class BaseEnemy: MonoBehaviour {
private StatCalculations statCalculationsScript = new StatCalculations();
private CalculateXP calculateXPScript = new CalculateXP();
public bool isAlive;
public float timeOfDeath;
public bool isCaptured;
public int number;
public string enemyName;
public string description;
public bool isFromTrade;
public int level;
public int evolveLevel;
public Types.TypesList type01;
public Types.TypesList type02;
public Sexes.SexesList sex;
public Natures.NaturesList nature;
public string ability01;
public string ability02;
public int baseHP;
public int baseATK;
public int baseDEF;
public int baseSPATK;
public int baseSPDEF;
public int baseSPD;
public int maxHP;
public int maxATK;
public int maxDEF;
public int maxSPATK;
public int maxSPDEF;
public int maxSPD;
public int curHP;
public int curATK;
public int curDEF;
public int curSPATK;
public int curSPDEF;
public int curSPD;
public float evasion;
public float accuracy;
public int hpEV;
public int atkEV;
public int defEV;
public int spatkEV;
public int spdefEV;
public int spdEV;
public int hpIV;
public int atkIV;
public int defIV;
public int spatkIV;
public int spdefIV;
public int spdIV;
public int baseEXPYield;
public LevelingRates.LevelingRatesList levelingRate;
public int currentXP;
public int requiredXP;
public int hpEVYield;
public int atkEVYield;
public int defEVYield;
public int spatkEVYield;
public int spdefEVYield;
public int spdEVYield;
public int baseFriendship;
public int catchRate;
public StatusConditions.StatusConditionsList statusCondition;
public List<BaseMove> enemyMoves = new List<BaseMove>();
public BaseItem equippedItem;
public BaseItem EquippedItem{
get{return equippedItem;}
set{equippedItem = value;}
}
public bool IsCaptured{
get{return isCaptured;}
set{isCaptured = value;}
}
public string EnemyName{
get{return enemyName;}
set{enemyName = value;}
}
public string Description{
get{return description;}
set{description = value;}
}
public bool IsFromTrade{
get{return isFromTrade;}
set{isFromTrade = value;}
}
public int Number{
get{return number;}
set{number = value;}
}
public int Level{
get{return level;}
set{level = value;}
}
public int EvolveLevel{
get{return evolveLevel;}
set{evolveLevel = value;}
}
public Types.TypesList Type01{
get{return type01;}
set{type01 = value;}
}
public Types.TypesList Type02{
get{return type02;}
set{type02 = value;}
}
public Sexes.SexesList Sex{
get{return sex;}
set{sex = value;}
}
public Natures.NaturesList Nature{
get{return nature;}
set{nature = value;}
}
public string Ability01{
get{return ability01;}
set{ability01 = value;}
}
public string Ability02{
get{return ability02;}
set{ability02 = value;}
}
public int BaseHP{
get{return baseHP;}
set{baseHP = value;}
}
public int BaseATK{
get{return baseATK;}
set{baseATK = value;}
}
public int BaseDEF{
get{return baseDEF;}
set{baseDEF = value;}
}
public int BaseSPATK{
get{return baseSPATK;}
set{baseSPATK = value;}
}
public int BaseSPDEF{
get{return baseSPDEF;}
set{baseSPDEF = value;}
}
public int BaseSPD{
get{return baseSPD;}
set{baseSPD = value;}
}
public int CurHP{
get{return curHP;}
set{curHP = value;}
}
public int CurATK{
get{return curATK;}
set{curATK = value;}
}
public int CurDEF{
get{return curDEF;}
set{curDEF = value;}
}
public int CurSPATK{
get{return curSPATK;}
set{curSPATK = value;}
}
public int CurSPDEF{
get{return curSPDEF;}
set{curSPDEF = value;}
}
public int CurSPD{
get{return curSPD;}
set{curSPD = value;}
}
public int MaxHP{
get{return maxHP;}
set{maxHP = value;}
}
public int MaxATK{
get{return maxATK;}
set{maxATK = value;}
}
public int MaxDEF{
get{return maxDEF;}
set{maxDEF = value;}
}
public int MaxSPATK{
get{return maxSPATK;}
set{maxSPATK = value;}
}
public int MaxSPDEF{
get{return maxSPDEF;}
set{maxSPDEF = value;}
}
public int MaxSPD{
get{return maxSPD;}
set{maxSPD = value;}
}
public float Evasion{
get{return evasion;}
set{evasion = value;}
}
public float Accuracy{
get{return accuracy;}
set{accuracy = value;}
}
public int HPEV{
get{return hpEV;}
set{hpEV = value;}
}
public int ATKEV{
get{return atkEV;}
set{atkEV = value;}
}
public int DEFEV{
get{return defEV;}
set{defEV = value;}
}
public int SPATKEV{
get{return spatkEV;}
set{spatkEV = value;}
}
public int SPDEFEV{
get{return spdefEV;}
set{spdefEV = value;}
}
public int SPDEV{
get{return spdEV;}
set{spdEV = value;}
}
public int HPIV{
get{return hpIV;}
set{hpIV = value;}
}
public int ATKIV{
get{return atkIV;}
set{atkIV = value;}
}
public int DEFIV{
get{return defIV;}
set{defIV = value;}
}
public int SPATKIV{
get{return spatkIV;}
set{spatkIV = value;}
}
public int SPDEFIV{
get{return spdefIV;}
set{spdefIV = value;}
}
public int SPDIV{
get{return spdIV;}
set{spdIV = value;}
}
public int BaseEXPYield{
get{return baseEXPYield;}
set{baseEXPYield = value;}
}
public LevelingRates.LevelingRatesList LevelingRate{
get{return levelingRate;}
set{levelingRate = value;}
}
public int CurrentXP{
get{return currentXP;}
set{currentXP = value;}
}
public int RequiredXP{
get{return requiredXP;}
set{requiredXP = value;}
}
public int HPEVYield{
get{return hpEVYield;}
set{hpEVYield = value;}
}
public int ATKEVYield{
get{return atkEVYield;}
set{atkEVYield = value;}
}
public int DEFEVYield{
get{return defEVYield;}
set{defEVYield = value;}
}
public int SPATKEVYield{
get{return spatkEVYield;}
set{spatkEVYield = value;}
}
public int SPDEFEVYield{
get{return spdefEVYield;}
set{spdefEVYield = value;}
}
public int SPDEVYield{
get{return spdEVYield;}
set{spdEVYield = value;}
}
public int BaseFriendship{
get{return baseFriendship;}
set{baseFriendship = value;}
}
public int CatchRate{
get{return catchRate;}
set{catchRate = value;}
}
public StatusConditions.StatusConditionsList StatusCondition{
get{return statusCondition;}
set{statusCondition = value;}
}
void Awake(){
isAlive = true;
SetupEnemy();
}
void Start(){
}
void Update(){
SetupGrowingStats();
}
public void SetupEnemy(){
SetupIV();
ChooseEnemySex();
ChooseEnemyNature();
SetupStats();
}
private void SetupIV(){
HPIV = Random.Range(0,15);
ATKIV = Random.Range(0,15);
DEFIV = Random.Range(0,15);
SPATKIV = Random.Range(0,15);
SPDEFIV = Random.Range(0,15);
SPDIV = Random.Range(0,15);
}
private void ChooseEnemySex(){
if(ATKIV > 2){
Sex = Sexes.SexesList.MALE;
}else if(ATKIV <= 2){
Sex = Sexes.SexesList.FEMALE;
}
}
private void ChooseEnemyNature(){
System.Array natures = System.Enum.GetValues (typeof(Natures.NaturesList));
Nature = (Natures.NaturesList)natures.GetValue (Random.Range(0,24));
}
private void SetupStats(){
MaxHP = statCalculationsScript.CalculateHP (BaseHP, Level, HPIV, HPEV);
MaxATK = statCalculationsScript.CalculateStat (BaseATK, Level, ATKIV, ATKEV, Nature, StatCalculations.StatTypes.ATTACK);
MaxDEF = statCalculationsScript.CalculateStat (BaseDEF, Level, DEFIV, DEFEV, Nature, StatCalculations.StatTypes.DEFENSE);
MaxSPATK = statCalculationsScript.CalculateStat (BaseSPATK, Level, SPATKIV, SPATKEV, Nature, StatCalculations.StatTypes.SPECIALATTACK);
MaxSPDEF = statCalculationsScript.CalculateStat (BaseSPDEF, Level, SPDEFIV, SPDEFEV, Nature, StatCalculations.StatTypes.SPECIALDEFENSE);
MaxSPD = statCalculationsScript.CalculateStat (BaseSPD, Level, SPDIV, SPDEV, Nature, StatCalculations.StatTypes.SPEED);
CurHP = MaxHP;
CurATK = MaxATK;
CurDEF = MaxDEF;
CurSPATK = MaxSPATK;
CurSPDEF = MaxSPDEF;
CurSPD = MaxSPD;
Evasion = 1.0f;
Accuracy = 1.0f;
CurrentXP = calculateXPScript.CalculateCurrentXP(Level, LevelingRate);
RequiredXP = calculateXPScript.CalculateRequiredXP(Level, LevelingRate);
}
public void AdjustCurrentHP(int adj){
CurHP += adj;
if(CurHP < 0){
CurHP = 0;
}
if(CurHP > MaxHP){
CurHP = MaxHP;
}
}
public void AdjustCurrentATK(int adj){
CurATK += adj;
if(CurATK < 0){
CurATK = 0;
}
if(CurATK > MaxATK){
CurATK = MaxATK;
}
}
public void AdjustCurrentDEF(int adj){
CurDEF += adj;
if(CurDEF < 0){
CurDEF = 0;
}
if(CurDEF > MaxDEF){
CurDEF = MaxDEF;
}
}
public void AdjustCurrentSPATK(int adj){
CurSPATK += adj;
if(CurSPATK < 0){
CurSPATK = 0;
}
if(CurSPATK > MaxSPATK){
CurSPATK = MaxSPATK;
}
}
public void AdjustCurrentSPDEF(int adj){
CurSPDEF += adj;
if(CurSPDEF < 0){
CurSPDEF = 0;
}
if(CurSPDEF > MaxSPDEF){
CurSPDEF = MaxSPDEF;
}
}
public void AdjustCurrentSPD(int adj){
CurSPD += adj;
if(CurSPD < 0){
CurSPD = 0;
}
if(CurSPD > MaxSPD){
CurSPD = MaxSPD;
}
}
public void AdjustEXP(int adj){
CurrentXP += adj;
if(CurrentXP >= RequiredXP){
Level += 1;
RequiredXP = calculateXPScript.CalculateRequiredXP(Level, LevelingRate);
SetupGrowingStats();
}
}
private void SetupGrowingStats(){
MaxHP = statCalculationsScript.CalculateHP (BaseHP, Level, HPIV, HPEV);
MaxATK = statCalculationsScript.CalculateStat (BaseATK, Level, ATKIV, ATKEV, Nature, StatCalculations.StatTypes.ATTACK);
MaxDEF = statCalculationsScript.CalculateStat (BaseDEF, Level, DEFIV, DEFEV, Nature, StatCalculations.StatTypes.DEFENSE);
MaxSPATK = statCalculationsScript.CalculateStat (BaseSPATK, Level, SPATKIV, SPATKEV, Nature, StatCalculations.StatTypes.SPECIALATTACK);
MaxSPDEF = statCalculationsScript.CalculateStat (BaseSPDEF, Level, SPDEFIV, SPDEFEV, Nature, StatCalculations.StatTypes.SPECIALDEFENSE);
MaxSPD = statCalculationsScript.CalculateStat (BaseSPD, Level, SPDIV, SPDEV, Nature, StatCalculations.StatTypes.SPEED);
CurrentXP = calculateXPScript.CalculateCurrentXP(Level, LevelingRate);
RequiredXP = calculateXPScript.CalculateRequiredXP(Level, LevelingRate);
}
public void SetDead(){
this.isAlive = false;
this.timeOfDeath = Time.time;
ReSpawner.deadEnemy.Add(this);
this.gameObject.SetActive(false);
}
}
持有List的类是EnemyRoster ......这是......
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[System.Serializable]
public class EnemyRoster : MonoBehaviour {
public List<BaseEnemy> enemyRoster = new List<BaseEnemy>();
void Start () {
}
void Update () {
}
}
我必须处理保存和加载的脚本是这个......
using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
public class GameMaster : MonoBehaviour {
public Camera mainCamera;
private GameObject playerCharacter;
private GameObject headsUpDisplay;
private GameObject eventSystem;
private GameObject pc;
private GameObject cam;
private PlayerCharacter pcScript;
private Vector3 playerSpawnPointPos;
void Awake(){
DontDestroyOnLoad(this);
}
void Start () {
playerSpawnPointPos = ChooseSpawnPoint.PickSpawnPoint(Application.loadedLevelName.ToString(), PlayerPrefs.GetString("Last Zone", "Town"));
playerCharacter = (GameObject)Resources.Load("Prefabs/Player Character Prefab");
pc = Instantiate(playerCharacter, playerSpawnPointPos, Quaternion.identity) as GameObject;
if(Application.loadedLevelName == "Main Menu" || Application.loadedLevelName == "Character Generation"){
pc.GetComponent<Movement>().enabled = false;
pc.GetComponent<BallThrow>().enabled = false;
pc.GetComponent<Encounter>().enabled = false;
}
pc.name = "Player Character";
pcScript = pc.GetComponent<PlayerCharacter>();
cam = Instantiate(mainCamera, Vector3.zero, Quaternion.identity) as GameObject;
if(Application.loadedLevelName != "Main Menu" || Application.loadedLevelName != "Character Generation"){
LoadCharacterData();
headsUpDisplay = (GameObject)Resources.Load("Prefabs/HUD Prefab");
eventSystem = (GameObject)Resources.Load("Prefabs/Event System Prefab");
Instantiate(headsUpDisplay, Vector3.zero, Quaternion.identity);
Instantiate(eventSystem, Vector3.zero, Quaternion.identity);
}
pcScript.LastZone = Application.loadedLevelName.ToString();
SaveCharacterData();
}
public static string ObjectToStr<BaseEnemy> (BaseEnemy _saveMe)
{
BinaryFormatter _bin = new BinaryFormatter ();
MemoryStream _mem = new MemoryStream ();
_bin.Serialize (_mem, _saveMe);
return Convert.ToBase64String (_mem.GetBuffer());
}
public static BaseEnemy StrToObject<BaseEnemy> (string _data) where BaseEnemy : class
{
if (!String.IsNullOrEmpty (_data)) {
BinaryFormatter _bin = new BinaryFormatter ();
try {
MemoryStream _mem = new MemoryStream (Convert.FromBase64String (_data));
BaseEnemy _obj = _bin.Deserialize (_mem) as BaseEnemy;
return _obj;
} catch (Exception ex) {
throw new Exception (ex.Message);
}
} else {
throw new Exception ("_data is null or empty");
}
}
public void SaveCharacterData(){
GameObject pc = GameObject.Find("Player Character");
PlayerCharacter pcClass = pc.GetComponent<PlayerCharacter>();
EnemyRoster pcERoster = pc.GetComponent<EnemyRoster>();
EnemyInventory pcEInventory = pc.GetComponent<EnemyInventory>();
PlayerPrefs.SetString("Player Name", pcClass.PlayerName);
PlayerPrefs.SetInt("Player Sex", (int)pcClass.PlayerSex);
PlayerPrefs.SetInt("Player Money", pcClass.PlayerMoney);
PlayerPrefs.SetString("Last Zone", pcClass.LastZone);
PlayerPrefs.SetString ("EnemyRoster", ObjectToStr<List<BaseEnemy>> (pcERoster.enemyRoster));
PlayerPrefs.SetString ("EnemyInventory", ObjectToStr<List<BaseEnemy>> (pcEInventory.enemyInventory));
}
public void LoadCharacterData(){
GameObject pc = GameObject.Find("Player Character");
PlayerCharacter pcClass = pc.GetComponent<PlayerCharacter>();
EnemyRoster pcERoster = pc.GetComponent<EnemyRoster>();
EnemyInventory pcEInventory = pc.GetComponent<EnemyInventory>();
pcClass.PlayerName = PlayerPrefs.GetString("Player Name", "Name Me");
pcClass.PlayerSex = (Sexes.SexesList)PlayerPrefs.GetInt("Player Sex", 0);
pcClass.PlayerMoney = PlayerPrefs.GetInt("Player Money", 0);
pcClass.LastZone = PlayerPrefs.GetString("Last Zone", "Pallet Town");
pcERoster.enemyRoster = StrToObject<List<BaseEnemy>> (PlayerPrefs.GetString ("EnemyRoster"));
pcEInventory.enemyInventory = StrToObject<List<BaseEnemy>> (PlayerPrefs.GetString ("EnemyInventory"));
}
}
问题是......我收到以下错误......
SerializationException:在程序集中键入UnityEngine.MonoBehaviour UnityEngine,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null 未标记为可序列化。 System.Runtime.Serialization.FormatterServices.GetSerializableMembers (System.Type类型,StreamingContext上下文)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization/FormatterServices.cs:101) System.Runtime.Serialization.Formatters.Binary.CodeGenerator.GenerateMetadataTypeInternal (System.Type类型,StreamingContext上下文)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/CodeGenerator.cs:78) System.Runtime.Serialization.Formatters.Binary.CodeGenerator.GenerateMetadataType (System.Type类型,StreamingContext上下文)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/CodeGenerator.cs:64) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.CreateMemberTypeMetadata (System.Type类型)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:442) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.GetObjectData (System.Object obj, System.Runtime.Serialization.Formatters.Binary.TypeMetadata&安培;元数据, System.Object的&安培;数据)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:430) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObject (System.IO.BinaryWriter writer,Int64 id,System.Object obj)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:306) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObjectInstance (System.IO.BinaryWriter writer,System.Object obj,Boolean isValueObject)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:293) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteQueuedObjects (System.IO.BinaryWriter writer)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:271) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObjectGraph (System.IO.BinaryWriter writer,System.Object obj, System.Runtime.Remoting.Messaging.Header [] headers)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:256) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream,System.Object图, System.Runtime.Remoting.Messaging.Header [] headers)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:232) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream,System.Object图)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:211) GameMaster.ObjectToStr [列表
1] (System.Collections.Generic.List
1 _saveMe)(在Assets / Scripts / Game Master / GameMaster.cs:58)GameMaster.SaveCharacterData()(在Assets / Scripts / Game) Master / GameMaster.cs:91)CharacterGeneratorGUI.LetsGo()(at 资产/脚本/图形用户界面/ CharacterGeneratorGUI.cs:128) UnityEngine.Events.InvokableCall.Invoke(System.Object [] args)(at C:/BuildAgent/work/d63dfc6385190b60/Runtime/Export/UnityEvent.cs:109) UnityEngine.Events.InvokableCallList.Invoke(System.Object [] 参数)(at C:/BuildAgent/work/d63dfc6385190b60/Runtime/Export/UnityEvent.cs:575) UnityEngine.Events.UnityEventBase.Invoke(System.Object []参数) (在 C:/BuildAgent/work/d63dfc6385190b60/Runtime/Export/UnityEvent.cs:717) UnityEngine.Events.UnityEvent.Invoke()(at C:/BuildAgent/work/d63dfc6385190b60/Runtime/Export/UnityEvent_0.cs:53) UnityEngine.UI.Button.Press()(at C:/BuildAgent/work/d63dfc6385190b60/Extensions/guisystem/guisystem/UI/Core/Button.cs:35) UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData)(at C:/BuildAgent/work/d63dfc6385190b60/Extensions/guisystem/guisystem/UI/Core/Button.cs:44) UnityEngine.EventSystems.ExecuteEvents.Execute(IPointerClickHandler handler,UnityEngine.EventSystems.BaseEventData eventData)(at C:/BuildAgent/work/d63dfc6385190b60/Extensions/guisystem/guisystem/EventSystem/ExecuteEvents.cs:52) UnityEngine.EventSystems.ExecuteEvents.Execute [IPointerClickHandler] (UnityEngine.GameObject目标,UnityEngine.EventSystems.BaseEventData eventData,UnityEngine.EventSystems.EventFunction`1仿函数)(at C:/BuildAgent/work/d63dfc6385190b60/Extensions/guisystem/guisystem/EventSystem/ExecuteEvents.cs:269) UnityEngine.EventSystems.EventSystem:更新()
有人可以告诉我,我做错了吗?感谢。
编辑 - 所以我添加了BaseEnemy脚本:
protected BaseEnemy(SerializationInfo info, StreamingContext context)
{
this.isAlive = info.GetBoolean("isAlive");
this.Number = info.GetInt32("number");
this.EnemyName = info.GetString("enemyName");
this.Description = info.GetString("description");
this.IsFromTrade = info.GetBoolean("isFromTrade");
this.Level = info.GetInt32("level");
this.EvolveLevel = info.GetInt32("evolveLevel");
//this.Type01 = info.GetEnumerator("type01");
//this.Type02 = info.GetEnumerator("type02");
//this.sex = info.GetEnumerator("sex");
//this.Nature = info.GetEnumerator("nature");
this.Ability01 = info.GetString("ability01");
this.Ability02 = info.GetString("ability02");
this.BaseHP = info.GetInt32("baseHP");
this.BaseATK = info.GetInt32("baseATK");
this.BaseDEF = info.GetInt32("baseDEF");
this.BaseSPATK = info.GetInt32("baseSPATK");
this.BaseSPDEF = info.GetInt32("baseSPDEF");
this.BaseSPD = info.GetInt32("baseSPD");
this.MaxHP = info.GetInt32("maxHP");
this.MaxATK = info.GetInt32("maxATK");
this.MaxDEF = info.GetInt32("maxDEF");
this.MaxSPATK = info.GetInt32("maxSPATK");
this.MaxSPDEF = info.GetInt32("maxSPDEF");
this.MaxSPD = info.GetInt32("maxSPD");
this.CurHP = info.GetInt32("curHP");
this.CurATK = info.GetInt32("curATK");
this.CurDEF = info.GetInt32("curDEF");
this.CurSPATK = info.GetInt32("curSPATK");
this.CurSPDEF = info.GetInt32("curSPDEF");
this.CurSPD = info.GetInt32("curSPD");
this.Evasion = info.GetInt32("evasion");
this.Accuracy = info.GetInt32("accuracy");
this.HPEV = info.GetInt32("hpEV");
this.ATKEV = info.GetInt32("atkEV");
this.DEFEV = info.GetInt32("defEV");
this.SPATKEV = info.GetInt32("spatkEV");
this.SPDEFEV = info.GetInt32("spdefEV");
this.SPDEV = info.GetInt32("spdEV");
this.HPIV = info.GetInt32("hpIV");
this.ATKIV = info.GetInt32("atkIV");
this.DEFIV = info.GetInt32("defIV");
this.SPATKIV = info.GetInt32("spatkIV");
this.SPDEFIV = info.GetInt32("spdefIV");
this.SPDIV = info.GetInt32("spdIV");
this.BaseEXPYield = info.GetInt32("baseEXPYield");
//this.LevelingRate = info.GetEnumerator("levelingRate");
this.CurrentXP = info.GetInt32("currentXP");
this.RequiredXP = info.GetInt32("requiredXP");
this.HPEVYield = info.GetInt32("hpEVYield");
this.ATKEVYield = info.GetInt32("atkEVYield");
this.DEFEVYield = info.GetInt32("defEVYield");
this.SPATKEVYield = info.GetInt32("spatkEVYield");
this.SPDEFEVYield = info.GetInt32("spdefEVYield");
this.SPDEVYield = info.GetInt32("spdEVYield");
this.BaseFriendship = info.GetInt32("baseFriendship");
this.CatchRate = info.GetInt32("catchRate");
//this.StatusCondition = info.GetEnumerator("statusCondition");
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("isAlive", isAlive);
info.AddValue("number", number);
info.AddValue("enemyName", enemyName);
info.AddValue("description", description);
info.AddValue("isFromTrade", isFromTrade);
info.AddValue("level", level);
info.AddValue("evolveLevel", evolveLevel);
//info.AddValue("type01", type01);
//info.AddValue("type02", type02);
//info.AddValue("sex", sex);
//info.AddValue("nature", nature);
info.AddValue("ability01", ability01);
info.AddValue("ability02", ability02);
info.AddValue("baseHP", baseHP);
info.AddValue("baseATK", baseATK);
info.AddValue("baseDEF", baseDEF);
info.AddValue("baseSPATK", baseSPATK);
info.AddValue("baseSPDEF", baseSPDEF);
info.AddValue("baseSPD", baseSPD);
info.AddValue("maxHP", maxHP);
info.AddValue("maxATK", maxATK);
info.AddValue("maxDEF", maxDEF);
info.AddValue("maxSPATK", maxSPATK);
info.AddValue("maxSPDEF", maxSPDEF);
info.AddValue("maxSPD", maxSPD);
info.AddValue("curHP", curHP);
info.AddValue("curATK", curATK);
info.AddValue("curDEF", curDEF);
info.AddValue("curSPATK", curSPATK);
info.AddValue("curSPDEF", curSPDEF);
info.AddValue("curSPD", curSPD);
info.AddValue("evasion", evasion);
info.AddValue("accuracy", accuracy);
info.AddValue("hpEV", hpEV);
info.AddValue("atkEV", atkEV);
info.AddValue("defEV", defEV);
info.AddValue("spatkEV", spatkEV);
info.AddValue("spdefEV", spdefEV);
info.AddValue("spdEV", spdEV);
info.AddValue("hpIV", hpIV);
info.AddValue("atkIV", atkIV);
info.AddValue("defIV", defIV);
info.AddValue("spatkIV", spatkIV);
info.AddValue("spdefIV", spdefIV);
info.AddValue("spdIV", spdIV);
info.AddValue("baseEXPYield", baseEXPYield);
info.AddValue("levelingRate", levelingRate);
info.AddValue("currentXP", currentXP);
info.AddValue("requiredXP", requiredXP);
info.AddValue("hpEVYield", hpEVYield);
info.AddValue("atkEVYield", atkEVYield);
info.AddValue("defEVYield", defEVYield);
info.AddValue("spatkEVYield", spatkEVYield);
info.AddValue("spdefEVYield", spdefEVYield);
info.AddValue("spdEVYield", spdEVYield);
info.AddValue("baseFriendship", baseFriendship);
info.AddValue("catchRate", catchRate);
info.AddValue("statusCondition", statusCondition);
}
在GameMaster脚本中(处理保存和加载):
private void SaveEnemyRoster(string path, object obj){
using (TextWriter writer = new StreamWriter(path)){
XmlSerializer xml = new XmlSerializer(typeof(List<BaseEnemy>));
xml.Serialize(writer, obj);
}
}
private List<BaseEnemy> LoadEnemyRoster(string path){
List<BaseEnemy> tempRoster = new List<BaseEnemy>();
using (TextReader reader = new StreamReader(path)){
XmlSerializer xml = new XmlSerializer(typeof(List<BaseEnemy>));
tempRoster = (List<BaseEnemy>)xml.Deserialize(reader);
}
return tempRoster;
}
答案 0 :(得分:0)
您的课程应该实现ISerializable
和序列化构造函数,以及方法GetObjectData()
。实现将如下所示;
public class BaseEnemy: MonoBehaviour, ISerializable
{
//...
protected BaseEnemey(SerializationInfo info, StreamingContext context)
{
//map all your properties here
this.isAlive = info.GetBoolean("isAlive");
//...
}
public void GetObjectData(SerializationInfo info, StreamingContext context)
{
info.AddValue("isAlive", isAlive);
//...
}
}
祝你好运,你似乎有一个很多的属性。 This也可以帮助你。
题外话;出于好奇,你在创造一个口袋妖怪游戏吗?
答案 1 :(得分:0)
在序列化期间,BinarySerializer会尝试完全(并自动)序列化您的对象,但由于这个原因而失败:基类MonoBehavior不可序列化。
为了达到你想要的效果,我建议为你的类实现ISerializable接口,这样你就可以更好地控制序列化对象的方式。
以下是通过此方法序列化对象的简单示例:ISerializable example