Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Unity中保存项目列表?_C#_List_Unity3d_Save_2d - Fatal编程技术网

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
  }