在Unity中保存并加载整个场景

问题描述 投票:-1回答:2

好的,所以我一直在苦苦挣扎,搜索了一段时间,看到了很多不同的帖子,但是我没有找到问题的答案。

我的问题:我在Unity中有一个场景,其中没有任何内容,所有内容都是在游戏开始时按程序随机创建的,当然,我希望玩家能够保存自己的进度。我已经找到了在Unity中保存进度的方法,但是所有事情都是为要保存的每个类或对象编写脚本,但是在我看来,这些方法效率低下,因为在我的游戏中,随机生成的房屋和建筑物(相对容易保存),但也可以在这些建筑物内放置物体等。同样,稍后我计划添加字符,这些字符也需要保存(例如它们在哪里,它们所持的东西等等)。正如我提到的那样,为每个对象编写一个保存和加载脚本对我来说似乎效率很低,因为我已经习惯了Java的序列化功能,因为我只是将包含所有数据的Main Object写入文件中,因此我在寻找一些简单的方法这样做的方法。一种可能的方法是保存整个场景状态,然后在加载时仅加载场景,而不是从头开始生成它。

我的问题:有没有一种方法可以保存整个场景以及所有对象和有关它们的信息,然后进行加载?

谢谢您!

unity3d serialization save load
2个回答
0
投票

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

https://assetstore.unity.com/packages/tools/utilities/autosaver-don-t-waste-time-anymore-54247


0
投票

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

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

考虑将您的思维方式从“我想加载一个会产生随机游戏玩法的场景”切换到“我想加载一个根据文件进行自我配置的场景”。这是一个抽象层,可以更好地控制加载场景时发生的情况。

我建议创建一个存储您的重要信息的JSON配置文件,这样可能会:

{ "house_locations": [ { "position": "(0, 0, 0)", "objects": [] }, { "position": "(10, 10, 10)", "objects": [] } ], "characters": [ { "position": "(0, 0, 0)", "inventory": [ { "item_name": "knife" }, { "item_name": "shovel" } ] } ] }

这只是一个简单的示例,因为您必须添加要代表游戏的重要数据。

接下来,当您想开始游戏时,要做的只是以下其中一项操作:

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

    public class WorldBuilder : MonoBehaviour { // This is the actual contents of the world, represented as a JSON string. private string _json = ""; public void BuildWorld(string configFilePath) { _json = LoadConfiguration(configFilePath); BuildWorld(_json); } public void GenerateWorld() { _json = GenerateConfiguration(); BuildWorld(_json); } public void SaveWorld(string targetFilePath) { // Save the contents of _json out to a file so that it can be loaded // up again later. } private string LoadConfiguration(string configFilePath) { // Load the actual file and return the file contents, which is a JSON string. } private void BuildWorld(string json) { // Actually build the world using the supplied JSON. } private string GenerateConfiguration() { // Return a randomly generated configuration file. } }

    此方法将保存场景内容并生成场景内容的问题分开了,使代码易于编写和维护。    
  • © www.soinside.com 2019 - 2024. All rights reserved.