Unity3d 统一保存和加载整个场景

Unity3d 统一保存和加载整个场景,unity3d,serialization,save,load,Unity3d,Serialization,Save,Load,好吧,我已经努力搜索了一段时间,看到了很多不同的帖子,但我没有找到我问题的答案 我的问题是: 我有一个统一的场景,里面什么都没有,一切都是在游戏开始时按程序随机创建的,当然我希望玩家能够保存他的进度。我找到了在Unity中保存进度的方法,但一切都是关于为我想要保存的每个类或对象编写脚本,但在我看来这些方法效率低下,因为在我的游戏中,有随机生成的房屋和建筑物(这相对容易保存),但也可以在这些建筑物内放置对象等等。稍后我还计划添加字符,这些字符也需要保存(比如它们在哪里,它们持有什么等等)。正如我所

好吧,我已经努力搜索了一段时间,看到了很多不同的帖子,但我没有找到我问题的答案

我的问题是: 我有一个统一的场景,里面什么都没有,一切都是在游戏开始时按程序随机创建的,当然我希望玩家能够保存他的进度。我找到了在Unity中保存进度的方法,但一切都是关于为我想要保存的每个类或对象编写脚本,但在我看来这些方法效率低下,因为在我的游戏中,有随机生成的房屋和建筑物(这相对容易保存),但也可以在这些建筑物内放置对象等等。稍后我还计划添加字符,这些字符也需要保存(比如它们在哪里,它们持有什么等等)。正如我所提到的,为每个对象编写保存和加载脚本对我来说似乎效率很低,因为我已经习惯了Java的serializtaion,我只是将包含所有数据的主对象写入一个文件,所以我正在寻找一些更简单的方法。可能是一种保存整个场景状态的方法,然后在加载时只加载场景,而不是从头开始生成场景

我的问题: 有没有办法保存整个场景中的所有对象及其相关信息,然后加载


提前谢谢你

我不知道如何构建场景或原则。 但有一个插件可以在播放模式下保存场景,您可以根据您的项目进行配置


没有内置方法可以在运行时“保存场景”,然后在以后重新加载。在Unity构建中,场景以不可编辑的格式存储,这意味着无论何时加载场景,它都将以与构建时相同的格式加载。这是一件好事,因为你不想在部署的游戏中编辑你的构建内容

现在,这并不意味着场景不能包含不同配置自身的逻辑。事实上,听起来你就是这么做的。相反,目标是将内容存储到保存文件中

考虑将您的心态从“我想加载一个生成随机游戏性的场景”转换为“我想加载一个基于文件进行自我配置的场景”。这是一个抽象层,可以更好地控制加载场景时发生的事情

我建议创建一个JSON配置文件来存储您的重要信息,如下所示:

{
“房屋位置”:[
{
“位置”:“(0,0,0)”,
“对象”:[]
},
{
“位置”:“(10,10,10)”,
“对象”:[]
}
],
“字符”:[
{
“位置”:“(0,0,0)”,
“库存”:[
{
“项目名称”:“刀”
},
{
“项目名称”:“电铲”
}
]
}
]
}
这只是一个简单的例子,因为您必须添加表示游戏的重要数据

接下来,当你想开始游戏时,你所要做的就是做以下事情之一:

  • 你开始新游戏了吗?=>生成一个随机配置文件,然后使用该文件填充场景
  • 您正在加载已保存的游戏吗?=>使用保存的配置文件填充场景
  • 您需要某种
    WorldBuilder
    脚本来处理此问题。在场景中,可以有如下内容:

    公共类WorldBuilder:MonoBehavior
    {
    //这是世界的实际内容,用JSON字符串表示。
    私有字符串_json=“”;
    公共void BuildWorld(字符串configFilePath)
    {
    _json=LoadConfiguration(configFilePath);
    BuildWorld(json);
    }
    公共void GenerateWorld()
    {
    _json=GenerateConfiguration();
    BuildWorld(json);
    }
    public void SaveWorld(字符串targetFilePath)
    {
    //将_json的内容保存到一个文件中,以便加载它
    //过一会儿再起床。
    }
    私有字符串加载配置(字符串配置文件路径)
    {
    //加载实际文件并返回文件内容,即JSON字符串。
    }
    私有void BuildWorld(字符串json)
    {
    //实际使用提供的JSON构建世界。
    }
    私有字符串GenerateConfiguration()
    {
    //返回随机生成的配置文件。
    }
    }
    

    这种方法将保存场景内容和生成场景内容的问题分离开来,使代码更易于编写和维护。

    好吧,这不是我要寻找的,我要寻找的是一种保存播放器进度的方法,而不是我在编辑栏中所做的更改,这正是我不想做的:P,但我想我没有别的选择了choice@Coreggon你不想采用这种方法的原因是什么?因为我有很多对象,我不想为每个要保存的对象编写代码