Как я могу сохранить и загрузить gameObject, который создает пользователь? - PullRequest
0 голосов
/ 13 января 2019

Я реализовал все параметры, которые пользователь может выбрать для настройки 3D-объекта, а также добавил несколько кнопок графического интерфейса пользователя, чтобы улучшить мой старый код и повысить удобство использования. Но мне трудно понять, как сохранить и загрузить игровой объект.

Я читал о сериализации и видел, как некоторые люди упоминают PlayerPrefs, но у меня все еще возникают проблемы с пониманием, как использовать это с объектом.

 using System.Collections;
 using System.Collections.Generic;
 using UnityEngine;

 public class cubeControls : MonoBehaviour
 {
     // Constants for object rotation
     public float moveSpeed = 80.0F;
     public float turnSpeed = 100.0F;

     // Initial scale of the original cube
     public static Vector3 initscale = Vector3.one;

     // Start is called before the first frame update
     void Start()
     {
     }

     // Update is called once per frame
     void Update()
     {
         // Changing the position of the object

         // Moving the object right
         if (Input.GetKey(KeyCode.D))
         {
             transform.Translate(Vector3.right * moveSpeed * Time.deltaTime);
     }

         // Moving the object left
         if (Input.GetKey(KeyCode.A))
         {
             transform.Translate(Vector3.left * moveSpeed * Time.deltaTime);
     }

         // Changing the rotation of the object

         // Rotating the cube to the right
         if (Input.GetKey(KeyCode.RightArrow))
         {
             transform.Rotate(Vector3.up, turnSpeed * Time.deltaTime);
         }

         // Rotating the cube to the left
         if (Input.GetKey(KeyCode.LeftArrow))
         {
             transform.Rotate(Vector3.down, turnSpeed * Time.deltaTime);
         }

         // Saving the current rendered material
         Renderer rend = GetComponent<Renderer>();

         // Changing the scale of the object

         // Double the size of the cube
         if (Input.GetKeyDown(KeyCode.Alpha2))
         {
             transform.localScale += new Vector3(2F, 2F, 2F);
         }

         // Changing the color via key presses

         if (Input.GetKeyDown(KeyCode.R))
         {
             rend.material.SetColor("_Color", Color.red);
         }
     }

     // To add button elements to the visual interface
     void OnGUI() 
     {
         // Changing to cylinder
         if (GUI.Button(new Rect(50, 90, 100, 40), "Cylinder"))
         {
             GameObject newCylinder = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
             newCylinder.AddComponent<cubeControls>();
             Destroy(gameObject);
         }

         // Saving
         if (GUI.Button(new Rect(700, 330, 50, 30), "Save"))
         {
         }

         // Loading
         if (GUI.Button(new Rect(770, 330, 50, 30), "Load"))
         {
         }
     }
 }

1 Ответ

0 голосов
/ 14 января 2019

Вы не можете сохранить игровые объекты. Единственное, что вы сохраняете, это детали игрового объекта. Например, если у вас есть 3D-куб с некоторыми эффектами частиц, сначала вы сохраняете необходимые значения куба, такие как «Положение», «Вращение», «Масштаб», «Цвет» и другие необходимые элементы (значения эмиттера частиц, которые необходимо изменить). Даже при сериализации вы не сможете сохранить Vector3, поскольку это структура, и вам придется написать собственный сериализатор для векторов. Короче говоря, что вы сохраняете в значениях, необходимых для работы ваших игровых объектов, и других поведенческих характеристиках, которые требовали пользовательских вводов от пользователя / другой системы. Думайте об этом как о способе перестроить ваши объекты в состояние, в котором вы остановились, путем сохранения и загрузки состояний переменных, которые влияют на ваши объекты.

Сохранения единства бывают двух типов

1) Настройки игрока : Используя настройки игрока, вы сможете сохранять только одно значение за раз в поле. Обычно один из трех:

  • Поплавок
  • Int
  • Строка

Обычно вы сохраняете токены и другие небольшие значения, для которых не требуются большие файлы

2) Сериализованные игровые данные: здесь вы сохраняете большие наборы данных и классы, такие как PlayerInfo, пользовательские изменения сцены в сериализованных файлах.

Я верю, что вы ищете это второе. Поэтому вместо того, чтобы искать все примеры и запутываться, вы можете начать с сохранения / загрузки значений куба (возможно, позиции? Или всего, что вы изменяете во время выполнения) в файле. И постепенно вы можете перейти на сериализатор.

Вы можете проверить по этим ссылкам, чтобы помочь вам понять.

Ссылка

Сохранение / загрузка данных с использованием простого BinaryFormatter

XML-сериализатор


Этот фрагмент сохранения взят из простой двоичной ссылки формататора, которая сохраняет целочисленные списки некоторых типов и пользовательские оценки.

[System.Serializable]
public class Save
{
  public List<int> livingTargetPositions = new List<int>();
  public List<int> livingTargetsTypes = new List<int>();

  public int hits = 0;
  public int shots = 0;
}

private Save CreateSaveGameObject()
{
  Save save = new Save();
  int i = 0;
  foreach (GameObject targetGameObject in targets)
  {
    Target target = targetGameObject.GetComponent<Target>();
    if (target.activeRobot != null)
    {
      save.livingTargetPositions.Add(target.position);
      save.livingTargetsTypes.Add((int)target.activeRobot.GetComponent<Robot>().type);
      i++;
    }
  }

  save.hits = hits;
  save.shots = shots;

  return save;
}

public void SaveGame()
{
  // 1
  Save save = CreateSaveGameObject();

  // 2
  BinaryFormatter bf = new BinaryFormatter();
  FileStream file = File.Create(Application.persistentDataPath + "/gamesave.save");
  bf.Serialize(file, save);
  file.Close();

  // 3
  hits = 0;
  shots = 0;
  shotsText.text = "Shots: " + shots;
  hitsText.text = "Hits: " + hits;

  ClearRobots();
  ClearBullets();
  Debug.Log("Game Saved");
}
...