C# 如何在Unity中保存项目列表?
我不知道如何保存我拥有的物品的C# 如何在Unity中保存项目列表?,c#,list,unity3d,save,2d,C#,List,Unity3d,Save,2d,我不知道如何保存我拥有的物品的列表,以及库存脚本和数据库项目脚本。我想保存库存中的物品,但不知道如何保存。我试图创建一个类并生成一个Update()函数,但id不起作用。这给了我一个错误 库存无法反序列化 你能帮我保存物品吗 下面是包含保存/加载函数的播放器数据脚本 using UnityEngine; using System.Collections; using UnityEngine.UI; using System; using System.IO
列表
,以及库存脚本和数据库项目脚本。我想保存库存中的物品,但不知道如何保存。我试图创建一个类并生成一个Update()
函数,但id不起作用。这给了我一个错误
库存
无法反序列化
你能帮我保存物品吗
下面是包含保存/加载函数的播放器数据脚本
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Collections.Generic;
public class PlayerData : MonoBehaviour {
public int HP,MP,HPMAX,MPMAX,STR,DEF,EXP,LVL;
public Text HPtext,MPtext,STRtext,DEFtext,LVLtext,amountTxt;
public static PlayerData Pdata;
public GameObject player;
public int amount = 20;
public bool UseKey;
public bool poisened;
public float counter = 5;
//==============================================================
public List<Item> Inventory = new List<Item> ();
//==============================================================
public float x,y ;
inventoryTest inv;
void Awake()
{
if(Pdata == null)
{
DontDestroyOnLoad(gameObject);
Pdata = this;
}
else if(Pdata != this)
{
Destroy(gameObject);
}
}
void Start()
{
inv = GameObject.FindWithTag("Player").GetComponent<inventoryTest>();
HP = 20;
MP = 5;
HPMAX = 20;
MPMAX = 5;
STR = 8;
DEF = 8;
EXP = 0;
LVL = 1;
}
void Update()
{
//==========================================
Inventory = inv.Inventory;
//==========================================
amountTxt.text = ""+amount;
HPtext.text = ""+HP;
MPtext.text = ""+MP;
STRtext.text = ""+STR;
DEFtext.text = ""+DEF;
LVLtext.text = ""+LVL;
x = player.transform.position.x;
y = player.transform.position.y;
if(HP > HPMAX){
HP = HPMAX;
}
if(MP > MPMAX){
MP = MPMAX;
}
if(MP <= 0){
MP = 0;
}
if(HP <= 0){
HP = 0;
}
if(amount <= 0){
amount = 0;
}
if(amount >= 99){
amount = 99;
}
if(EXP == 100){
EXP = 0;
LVL++;
STR++;
DEF++;
HPMAX += 10;
MPMAX += 5;
}
if(LVL == 99){
LVL = 99;
}
}
void FixedUpdate(){
if(poisened){
counter -= Time.deltaTime;
if(counter < 0f){
HP -= 1;
counter = 5;
}
}
}
public void Save(){
BinaryFormatter BF = new BinaryFormatter();
FileStream file = File.Create(Application.persistentDataPath + "/S_F.dat" );
playerDataClass data = new playerDataClass();
data.HP = HPMAX;
data.MP = MPMAX;
data.STR = STR;
data.DEF = DEF;
data.EXP = EXP;
data.LVL = LVL;
data.y = y;
data.x = x;
//====================================
data.Inventory = Inventory;
//====================================
BF.Serialize(file,data);
file.Close();
}
public void Load(){
if(File.Exists(Application.persistentDataPath + "/S_F.dat")){
BinaryFormatter BF = new BinaryFormatter();
FileStream file = File.Open(Application.persistentDataPath + "/S_F.dat", FileMode.Open);
playerDataClass data = (playerDataClass) BF.Deserialize(file);
file.Close();
HPMAX = data.HPMAX;
MPMAX = data.MPMAX;
HP = data.HP;
MP = data.MP;
STR = data.STR;
DEF = data.DEF;
EXP = data.EXP;
LVL = data.LVL;
x = data.x;
y = data.y;
player.transform.position= new Vector2(x,y);
}
}
}
[Serializable]
public class playerDataClass
{
public int HPMAX,MPMAX,HP,MP,STR,DEF,EXP,LVL;
public float x,y ;
//=======================================================
public List<Item> Inventory = new List<Item> ();
//=======================================================
}
这是项数据库脚本
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class ItemDatabase : MonoBehaviour {
public List<Item> items = new List<Item>();
void Start()
{
items.Add (new Item (0, "Potion", 0, Item.ItemType.consumable,1));
items.Add (new Item (1, "Antidot", 0, Item.ItemType.consumable, 1));
items.Add (new Item (2, "Arrows", 0, Item.ItemType.ammo,10));
items.Add (new Item (3, "KEY", 0, Item.ItemType.consumable,1));
items.Add (new Item (4, "sword", 15, Item.ItemType.weapon,1));
items.Add (new Item (5, "bow", 50, Item.ItemType.weapon,1));
}
public Item fetchItem(int id)
{
for (int i = 0 ; i < items.Count;i++)
if(items[i].ItemId == id)
return items[i];
return null;
}
}
使用UnityEngine;
使用系统集合;
使用System.Collections.Generic;
使用UnityEngine.UI;
公共类ItemDatabase:MonoBehavior{
公共列表项=新列表();
void Start()
{
物品。添加(新物品(0,“药剂”,0,物品。物品类型。消耗品,1);
添加项目(新项目(1,“Antidot”,0,Item.ItemType.耗材,1));
物品。添加(新物品(2,“箭头”,0,物品。物品类型。弹药,10);
添加项(新项(3,“键”,0,项。项类型。消耗品,1));
增加(新物品(4,“剑”,15,物品。物品类型。武器,1);
增加(新物品(5,“弓”,50,物品。物品类型。武器,1);
}
公共项fetchItem(int-id)
{
对于(int i=0;i
您似乎缺少可序列化属性。
将其添加到您的Item类中,如所示->
[Serializable]
public class Item {
///Your code here
}
您似乎缺少可序列化属性。 将其添加到您的Item类中,如所示->
[Serializable]
public class Item {
///Your code here
}
项目类源代码在哪里?我编辑帖子这里是库存脚本(包括箭头导航菜单和控制UI)和项目脚本以及项目数据这里是项目类源代码?我编辑帖子这里是库存脚本(包括箭头导航菜单和控制UI)和项目脚本以及我已经添加的项目数据[system.serializable]添加到我的项目脚本中的项目类,因此您的意思是我应该添加[system.serializable]的[serializable]anstaid项目脚本或您的意思是我应该在playerData脚本中创建一个新的类项目,其中包含保存/加载系统?您的编辑显示,您的allready具有正确的属性。因此,一定还有其他错误。是“库存无法反序列化”确实是确切的错误吗?在您的示例中,我没有看到任何具有泛型类型的Inventory类。因此,您可以复制/粘贴确切的错误消息吗?我得到的错误是(Inventory不能反序列化)我尝试进行一些更改,但我没有再得到此错误,但我得到了另一个错误,而不是NULL引用(NullReferenceException:Object reference未设置为对象PlayerData.Load()的实例(位于Assets/scripts/gameplay/PlayerData.cs:141)PlayerControl.FixedUpdate()(位于Assets/scripts/gameplay/PlayerControl.cs:44))以下是模式化:[可序列化]公共类playerDataClass{public int HPMAX,MPMAX,HP,MP,STR,DEF,EXP,LVL;public float x,y;public List Inventory=new List();public Inventory test inv;void Update(){if(inv!=null){if(inv=GameObject.FindWithTag(“Player”).GetComponent();}如果(inv==null){inv=GameObject.FindWithTag(“Player”).GetComponent();}我已经添加了[system.serializable]添加到我的项目脚本中的项目类,因此您的意思是我应该添加[system.serializable]的[serializable]anstaid项目脚本或您的意思是我应该在playerData脚本中创建一个新的类项目,其中包含保存/加载系统?您的编辑显示,您的allready具有正确的属性。因此,一定还有其他错误。是“库存无法反序列化”确实是确切的错误吗?在您的示例中,我没有看到任何具有泛型类型的Inventory类。因此,您可以复制/粘贴确切的错误消息吗?我得到的错误是(Inventory不能反序列化)我尝试进行一些更改,但我没有再得到此错误,但我得到了另一个错误,而不是NULL引用(NullReferenceException:Object reference未设置为对象PlayerData.Load()的实例(位于Assets/scripts/gameplay/PlayerData.cs:141)PlayerControl.FixedUpdate()(位于Assets/scripts/gameplay/PlayerControl.cs:44))以下是模式化:[可序列化]公共类playerDataClass{public int HPMAX,MPMAX,HP,MP,STR,DEF,EXP,LVL;public float x,y;public List Inventory=new List();public Inventory test inv;void Update(){if(inv!=null){if(inv=GameObject.FindWithTag(“Player”).GetComponent();}else if(inv==null){inv=GameObject.FindWithTag(“Player”).GetComponent();}}
[Serializable]
public class Item {
///Your code here
}