Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >(Unity3D)保存/装载播放机库存

(Unity3D)保存/装载播放机库存
EN

Stack Overflow用户
提问于 2018-01-06 16:52:20
回答 1查看 1.7K关注 0票数 0

无论何时通过播放器脚本保存或加载,库存总是出现在双方的空白,我不知道问题在哪里。清单使用的系统与教程中使用的系统相同,后者工作良好,但在加载时库存始终是空白的。

播放器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void Save(){
    Debug.Log ("Saving data (player / inventory)");

    SaveLoadManager.SavePlayer (this); //works fine
    SaveLoadInventory.SaveInventory (inv); //where the issue is
}
public void Load(){
    Debug.Log ("Loading data (player / inventory)");

    float[] loadedStats = SaveLoadManager.LoadPlayer (); //works fine
    Item[] loadedItems = SaveLoadInventory.LoadInventory (); //comes up empty

    inv.items = loadedItems; //try to set the referenced Inventory script array of items equal to the loaded items

    //loadedStats[...] are set to player values and all works good
}

库存

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Inventory : MonoBehaviour {

public Image[] itemImages = new Image[numItemSlots];
public Text[] itemAmountsText = new Text[numItemSlots];
public int[] itemAmounts = new int[numItemSlots];
public Item[] items = new Item[numItemSlots];

public const int numItemSlots = 40;

public void AddItem(Item itemToAdd){
    for (int i = 0; i < items.Length; i++) {
        if(items [i] == itemToAdd){
            if (itemAmounts [i] <= 99) {
                itemAmounts [i]++;
            } else {
                items [i] = itemToAdd;
                itemImages [i].sprite = itemToAdd.itemImage;
                itemImages [i].enabled = true;
            }
            itemAmountsText [i].text = itemAmounts [i] + "";
            return;
        } else if (items [i] == null) {
            itemAmounts [i]++;
            itemAmountsText [i].text = itemAmounts [i] + "";
            items [i] = itemToAdd;
            itemImages [i].sprite = itemToAdd.itemImage;
            itemImages [i].enabled = true;
            return;
        }
    }
}

public void RemoveItem(Item itemToRemove){
    for (int i = 0; i < items.Length; i++) {
        if (items [i] == itemToRemove) {
            items [i] = null;
            itemImages [i].sprite = null;
            itemImages [i].enabled = false;
            return;
        }
    }
}

public void ClearAllItems(){
    for (int i = 0; i < items.Length; i++) {
        items [i] = null;
        itemImages [i].sprite = null;
        itemImages [i].enabled = false;
        return;
    }
}

[Serializable]
public class InventoryData {
    public Image[] itemImages = new Image[numItemSlots];
    public Text[] itemAmountsText = new Text[numItemSlots];
    public int[] itemAmounts = new int[numItemSlots];
    public Item[] items;

    public InventoryData(Inventory inv){
        items = new Item[numItemSlots];

        for (int i = 0; i < items.Length; i++) {
            inv.items[i] = items[i];
            inv.itemAmounts[i] = itemAmounts[i];
            inv.itemAmountsText[i] = itemAmountsText[i];
            inv.itemImages[i] = itemImages[i];
            }
        }
    }
}

SaveLoadInventory

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static class SaveLoadInventory {

    public static void SaveInventory(Inventory inv){

    BinaryFormatter bf = new BinaryFormatter();
    var createdir = Directory.CreateDirectory(Application.persistentDataPath + "/saves");
    String dir = Application.persistentDataPath + "/saves";
    Inventory.InventoryData data = new Inventory.InventoryData (inv);

    DirectoryInfo dir_i = new DirectoryInfo(dir);
    FileInfo[] info = dir_i.GetFiles("*.inv");
    foreach (FileInfo f in info) {
        Debug.Log (f);
    }

    FileStream stream = new FileStream (dir + "/player" + (info.Length + 1) + ".inv", FileMode.Create);

    bf.Serialize (stream, data);
    stream.Close ();

}

    public static Item[] LoadInventory(){
    String dir = Application.persistentDataPath + "/saves";

    DirectoryInfo dir_i = new DirectoryInfo(dir);
    FileInfo[] info = dir_i.GetFiles("*.inv");
    foreach (FileInfo f in info) {
        Debug.Log (f);
    }

    if (info.Length >= 1) {

        BinaryFormatter bf = new BinaryFormatter ();
        var createdir = Directory.CreateDirectory(Application.persistentDataPath + "/saves");
        FileStream stream = new FileStream (dir + "/player" + (info.Length) + ".inv", FileMode.Open);
        Inventory.InventoryData data = bf.Deserialize (stream) as Inventory.InventoryData;

        stream.Close ();
        return data.items;
    } else {
        return null;
    }
}

老实说,我会尝试一些组合的调试,并自己解决它,但这一切似乎太复杂,我的头脑,并一直担心它将永远无法工作。如果您有任何帮助或建议,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-06 19:17:18

但在装货时,库存总是空白的。

第一个问题是您希望在InventoryData类中序列化的变量类型。您不能直接序列化ImageText组件,因为它们是UnityEngine.Object类型。对于Image组件,保存Image组件正在使用的Sprite的路径。对于Text组件,保存保存文本本身的.text属性的值。

如果要序列化ImageText组件的多个属性,最好创建一个新的可序列化类/包装器,该类/包装器将保存您希望序列化的Image组件和Text组件的重要数据。

例如,假设您想序列化有关Text组件的信息,例如字体大小、实际文本和颜色,下面是一个简单的包装示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[Serializable]
public class TextWrapper
{
    public int fontSize;
    public string text;
    public Color color;

    public TextWrapper(Text text)
    {

        //Get Text Info
        fontSize = text.fontSize;
        this.text = text.text;
        color = text.color;
    }
}

要序列化的Text组件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public Text myText;

可以从TextWrapper组件创建新的Text实例来序列化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TextWrapper textWrapper = new TextWrapper(myText);

现在,您可以在您的问题中使用BinaryFormatter序列化它。您可以将TextWrapper变量放在InventoryData类中,这也应该序列化。

注意,TextWrapper必须放在自己的.cs文件中,否则BinaryFormatter可能会将其序列化/反序列化。如果使用..just仍有问题,请使用Json。请参阅this发布的更多信息。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48133382

复制
相关文章
SAP WM 有无保存WM Level历史库存的Table?
前日下班回家的路上,收到一个前客户内部顾问同行发过来的微信,问我在SAP系统里哪个表是用来存储WM Level历史库存的。
SAP虾客
2021/01/19
6700
SAP - WM - 有无保存WM Level历史库存的Table?
前日下班回家的路上,收到一个前客户内部顾问同行发过来的微信,问我在SAP系统里哪个表是用来存储WM Level历史库存的。
SAP虾客
2021/02/23
6220
最优装载问题
问题描述: 有一批集装箱要装上一艘载重量为c的轮船。其中集装箱i的重量为Wi。最优装载问题要求确定在装载体积不受限制的情况下,将尽可能多的集装箱装上轮船。 问题可以描述为: 式中,变量xi = 0
我没有三颗心脏
2018/04/26
1.3K0
最优装载问题
程序的装载方式
程序执行时所需要的指令和数据必须在内存中才能够运行。最简单的就是静态装入:将程序运行所需要的指令和数据全都装入内存中。当程序所需要内存大于物理内存时,无法满足静态装入的要求,这个时候就需要使用动态装入了,其思想是将程序运行时当前不用的模块放在磁盘,使用的模块放在内存。
恋喵大鲤鱼
2019/08/14
8170
unity3d:url下载头像保存在本地(微信头像)
立羽
2023/08/24
5030
MM库存类型、库存数量、库存金额取值逻辑
*&---------------------------------------------------------------------*
齐天大圣
2021/09/08
1.3K0
浅析类装载 顶
[Loaded com.guanjian.Parent from file:/E:/classload/out/production/classload/] [Loaded com.guanjian.Child from file:/E:/classload/out/production/classload/] Parent init 100
算法之名
2019/08/20
3780
嵌入在网站上Flash播放机(2)
然后在一个博客。这里有一个flash嵌入式播放器。这是公司内部使用的flash播放机,支持格更多款式,同时支持swf格视频播放的类型。
全栈程序员站长
2022/07/06
8810
理解类装载器
类装载器是 Java 中的一项创新,它使得 Java 虚拟机可以在执行的过程中再把一个 Java 类读入虚拟机,提高了程序的灵活性。在Java中,类的信息是被保存在方法区中的。在介绍类装载器之前,我们先了解一下 Java 中类的生命周期。Java 中一个类的生命周期可以划分为以下 6 个步骤:
BUG弄潮儿
2020/08/05
9600
理解类装载器
装载问题-回溯法
问题描述:   有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量是wi,且不能超。 算法思想:   最优装载方案: 将第一艘轮船尽可能的装满;  然后将剩余的装载第二艘船上 算法描述: template <class Type> class Loading { friend Type MaxLoading(Type [],Type,int); private: void Backtrack(int i); int n;
用户1154259
2018/01/17
1.3K0
10.2 调试事件获取DLL装载
理解了如何通过调试事件输出当前进程中寄存器信息,那么实现加载DLL模块也会变得很容易实现,加载DLL模块主要使用LOAD_DLL_DEBUG_EVENT这个通知事件,该事件可检测进程加载的模块信息,一旦有新模块被加载或装入那么则会触发一个通知事件,利用该方法并配合磁盘路径获取函数则可很容易的实现进程模块加载的监控。
微软技术分享
2023/10/05
1780
10.2 调试事件获取DLL装载
SAP MM 特殊库存之T库存
笔者所在的A项目里,销售业务广泛启用了POD功能。VL02N对交货单做了发货过账后物权并没有转移,而是将自有E库存转为一个叫做在途库存的特殊库存里。等到货物到了客户那里,客户确认实际收货数量后,才去系统上执行VLPOD事务,过账后,物权才会转移到客户方那里。
SAP虾客
2021/03/01
1.8K0
动态装载和使用类型
Reflection提供诸如Microsoft Visual Basic.NET和JScript语言编译器使用的底层结构来实施隐性后绑定。绑定是定位与某一特定类型相对应的声明的过程。当这个过程发生在运行的时候,而不是编译的时候,它被称为后绑定。Visual Basic.NET使你可以在你的代码中使用隐性后绑定;VisualBasic.NET编译器调用helper 方法,使用Reflection获得对象类型。传递给helper 方法的参数 使适当的方法可以在运行时被调用。这些参数是调用方法(对象)的实例,被调用方法的名字(字符串),及传递给被调用方法的参数。(一个对象数组)。
Java架构师必看
2021/03/22
6780
装载问题 ——回溯法(Java)
有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集 装箱i的重量为Wi,且
WHYBIGDATA
2023/01/31
7570
装载问题 ——回溯法(Java)
MM在途库存与中转库存
(Intra-Company Stock Transfer) 从同一公司中的工厂甲的库存地点A到工厂乙的库存地点B
用户5495712
2021/04/23
2.3K0
装载问题 ——分支限界法(Java)
有一批共n个集装箱要装上2艘载重量分别为C1和C2的轮船,其中集 装箱i的重量为Wi,且
WHYBIGDATA
2023/01/31
5430
装载问题 ——分支限界法(Java)
10.2 调试事件获取DLL装载
理解了如何通过调试事件输出当前进程中寄存器信息,那么实现加载DLL模块也会变得很容易实现,加载DLL模块主要使用LOAD_DLL_DEBUG_EVENT这个通知事件,该事件可检测进程加载的模块信息,一旦有新模块被加载或装入那么则会触发一个通知事件,利用该方法并配合磁盘路径获取函数则可很容易的实现进程模块加载的监控。
微软技术分享
2023/10/11
1640
10.2 调试事件获取DLL装载
S4 MM培训课程(15)-库存报表/库存设定/特殊库存
声明:本文仅代表原作者观点,仅用于SAP软件的应用与学习,不代表SAP公司。注:文中所示截图来源SAP软件,相应著作权归SAP所有。文中所指ERP即SAP软件。
齐天大圣
2021/06/17
5920
S4 MM培训课程(15)-库存报表/库存设定/特殊库存
Spring核心——注解自动装载 原
之前的文章介绍了Spring的IoC容器配置管理方面的详细内容,需要了解的可以从IoC容器的设计模式开始阅读。在介绍基于注解配置的配置之前我们再重复一下在之前提到的基本认识:
随风溜达的向日葵
2018/08/15
7130
点击加载更多

相似问题

当库存装载c# unity3d时的奇怪行为

12

储存和装载库存

22

在数据库中存储和保存播放机背包(库存)

14

如何处理多个列表和播放机库存

22

重新装载可承受的动态库存

64
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文