好的,所以我一直在苦苦挣扎,搜索了一段时间,看到了很多不同的帖子,但是我没有找到问题的答案。
我的问题:我在Unity中有一个场景,其中没有任何内容,所有内容都是在游戏开始时按程序随机创建的,当然,我希望玩家能够保存自己的进度。我已经找到了在Unity中保存进度的方法,但是所有事情都是为要保存的每个类或对象编写脚本,但是在我看来,这些方法效率低下,因为在我的游戏中,随机生成的房屋和建筑物(相对容易保存),但也可以在这些建筑物内放置物体等。同样,稍后我计划添加字符,这些字符也需要保存(例如它们在哪里,它们所持的东西等等)。正如我提到的那样,为每个对象编写一个保存和加载脚本对我来说似乎效率很低,因为我已经习惯了Java的序列化功能,因为我只是将包含所有数据的Main Object写入文件中,因此我在寻找一些简单的方法这样做的方法。一种可能的方法是保存整个场景状态,然后在加载时仅加载场景,而不是从头开始生成它。
我的问题:有没有一种方法可以保存整个场景以及所有对象和有关它们的信息,然后进行加载?
谢谢您!
我不知道如何构建场景保存模式或原理。但是有一个插件可以将场景保存为播放模式,您可以根据自己的项目进行配置。
https://assetstore.unity.com/packages/tools/utilities/autosaver-don-t-waste-time-anymore-54247
没有内置的方法可以在运行时“保存场景”,然后在以后重新加载它。在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"
}
]
}
]
}
这只是一个简单的示例,因为您必须添加要代表游戏的重要数据。接下来,当您想开始游戏时,要做的只是以下其中一项操作:
您正在开始新游戏吗? =>生成一个随机配置文件,然后使用该文件来填充您的场景。
- 您正在加载已保存的游戏吗? =>使用保存的配置文件填充场景。
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.
}
}
此方法将保存场景内容并生成场景内容的问题分开了,使代码易于编写和维护。