Сохраните и загрузите всю сцену в Unity - PullRequest
0 голосов
/ 14 апреля 2020

Хорошо, так что я долго боролся и искал, видел много разных постов, но я не нашел ответа на свой вопрос.

Моя проблема: у меня есть сцена в Unity, в которой ничего нет, все создается процедурно и случайным образом в начале игры, и, конечно, я хочу, чтобы игрок мог сохранять свои успехи. Я нашел способы сохранения прогресса в Unity, но все было связано с написанием сценария для каждого класса или объекта, который я хочу сохранить, но они кажутся мне неэффективными, поскольку в моей игре есть случайно сгенерированные дома и здания (которые могут быть относительно легко спасти), но могут быть и объекты, размещенные внутри этих зданий и так далее. Также позже я планирую добавить персонажей, которые также должны быть сохранены (например, где они находятся, что они держат и тому подобное). И, как я уже упоминал, написание сценария сохранения и загрузки для каждого объекта кажется мне неэффективным, поскольку я привык к сериализации Java, где я просто записываю свой основной объект, содержащий все данные, в файл, поэтому я ищу несколько более простых способов сделать это. Возможно, способ сохранить все состояние сцены и затем при загрузке просто загрузить сцену, а не генерировать ее с нуля.

Мой вопрос: есть ли способ сохранить всю сцену со всеми объектами и информацией о них, а затем загрузить это?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Нет встроенного метода, с помощью которого вы можете «сохранить сцену» во время выполнения, а затем перезагрузить ее позже. В сборке Unity сцены хранятся в нередактируемом формате, что означает, что при загрузке сцены она загружается в том же формате, в котором была построена. Это хорошо , потому что вы не хотите редактировать содержимое вашей сборки в развернутой игре.

Это не означает, что сцена не может содержать logi c чтобы настроить себя по-другому. На самом деле, это звучит так, как будто ты это делаешь. Вместо этого цель состоит в том, чтобы сохранить содержимое в файле сохранения.

Попробуйте переключить свой менталитет с «Я хочу загрузить сцену, которая генерирует случайный игровой процесс» на «Я хочу загрузить сцену, которая настраивается на основе файл." Это уровень абстракции, который дает больший контроль над тем, что происходит при загрузке вашей сцены.

Я бы предложил создать файл конфигурации 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. Вы начинаете новую игру? => Создайте случайный файл конфигурации, а затем используйте его для заполнения своей сцены.
  2. Загружаете ли вы сохраненную игру? => Используйте сохраненный файл конфигурации для заполнения вашей сцены.

Вам понадобится какой-то сценарий 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.
  }
}

Этот подход разделяет проблему сохранения содержимого сцены и генерации содержимого сцены, делая код проще для написания и обслуживания.

0 голосов
/ 14 апреля 2020

Я не знаю, как построить сцену, сохраняя принципы или принципы. Но есть плагин, который сохраняет сцену в режиме воспроизведения, вы можете настроить его в соответствии с вашим проектом.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...