Jump to content
Sign in to follow this  
overbaal

Guardar el clon de un GameObject instanciado

Recommended Posts

Buenas gente,

Quiero guardar los cambios de un prefab que ya he instanciado previamente, lo meto en una variable pero al cerrar se pierde la informacion porque es el clon del prefab lo que cojo.

Me pregunto si hay alguna manera de clonar y guardar el gameobject modificado como un prefab variant o algo asi para no perder esos cambios via script.

 

public static StoragePanel _instance;
    public List<StorageSlot> storageInfoList = new List<StorageSlot>();

    private string jsonString;

    private void Awake()
    {
        if (_instance == null) _instance = this;
        else if (_instance != this) Destroy(gameObject);
    }

    private void Start()
    {
        for (int i = 0; i < this.transform.childCount; i++)
        {
            StorageSlot slotInfo = this.gameObject.transform.GetChild(i).GetComponent<StorageSlot>();
            storageInfoList.Add(slotInfo);
        }

        if (PlayerPrefs.HasKey("storageCharacters"))
        {
            LoadStorageCharacters();
        }
    }

    private void LoadStorageCharacters()
    {
        jsonString = PlayerPrefs.GetString("storageCharacters");
        StorageCharacters storageCharacters = JsonUtility.FromJson<StorageCharacters>(jsonString);
        this.storageInfoList = storageCharacters.storageInfoList;

        for (int i = 0; i < storageInfoList.Count; i++)
        {
            this.storageInfoList[i].character = storageCharacters.storageInfoList[i].character;
        }
    }

    public void SaveStorageCharacters()
    {
        StorageCharacters storageCharacters = new StorageCharacters();
        storageCharacters.storageInfoList = this.storageInfoList;
        jsonString = JsonUtility.ToJson(storageCharacters);
        PlayerPrefs.SetString("storageCharacters", jsonString);
    }

    private struct StorageCharacters
    {
        public List<StorageSlot> storageInfoList;
    }

aqui es donde guardo y cargo los datos de los gameobjects, pero claro nada se guarda y creo que es porque cojo el clon de un objecto prefabricado y al apagar el juego ese clon desaparece y deja de existir en laas variables.

Espero haberme explicado bien.

Un saludo y gracias por su tiempo.

Edited by overbaal

Share this post


Link to post
Share on other sites
7 minutes ago, francoe1 said:

@overbaal Quizás te estás planteando mal el modo de uso de datos persistentes.

¿Cuál es tu objetivo con todo esto?

Tengo un prefab de un personaje, ese personaje lo cambio, sus piezas, su skin , armaduras, pues quiero guardar esa configuracion como otro gameobject al cerrar el juego, como si tuviera un armario con varias configuraciones de personajes

 

Edited by overbaal

Share this post


Link to post
Share on other sites

Para ese caso tendrías que pensar una forma desacoplada de configurar el personaje. 

Eso quiere decir que deberás crear una estructura de datos donde guardar las diferentes configuraciones, luego cada vez que el juego inicie deberás cargar esa configuración.  Por esa razón la forma de personalizar el personaje debe ser desacoplada y evitar las dependencias.

Un ejemplo seria. 

public CharacterCustomization Customization;

private void Save()
{
  CharacterCustomizationData data = new CharacterCustomizationData (Customization);
  data.Save();
}

private void Load()
{
  CharacterCustomizationData data = CharacterCustomizationData.Load();
  Customization.SetHair(data.Hair);
  //o
  Customization.SetData(data);
}

La clase CharacterCustomization debería contener una función para cada parámetro configurable.

Share this post


Link to post
Share on other sites
4 minutes ago, francoe1 said:

Para ese caso tendrías que pensar una forma desacoplada de configurar el personaje. 

Eso quiere decir que deberás crear una estructura de datos donde guardar las diferentes configuraciones, luego cada vez que el juego inicie deberás cargar esa configuración.  Por esa razón la forma de personalizar el personaje debe ser desacoplada y evitar las dependencias.

Un ejemplo seria. 


public CharacterCustomization Customization;

private void Save()
{
  CharacterCustomizationData data = new CharacterCustomizationData (Customization);
  data.Save();
}

private void Load()
{
  CharacterCustomizationData data = CharacterCustomizationData.Load();
  Customization.SetHair(data.Hair);
  //o
  Customization.SetData(data);
}

La clase CharacterCustomization debería contener una función para cada parámetro configurable.

Y para cargar la configuracion deberia recorrer el prefab instanciado e ir aplicando los cambios? en plan con un bucle?

Share this post


Link to post
Share on other sites

Ese aspecto está muy conectados a tu implementación. 

En el caso de la personalización de personajes por lo general no sé instancia los objetos, sino que se activan o desactivan, esto te permite tener tipos de objetos agrupados con mismas características.

Por ejemplo - si tienes 10 cascos diferentes, deberías tener todos ya colocados en el personaje y desactivados. Luego desde el componente Customization activas el seleccionado.

Share this post


Link to post
Share on other sites
10 minutes ago, francoe1 said:

Ese aspecto está muy conectados a tu implementación. 

En el caso de la personalización de personajes por lo general no sé instancia los objetos, sino que se activan o desactivan, esto te permite tener tipos de objetos agrupados con mismas características.

Por ejemplo - si tienes 10 cascos diferentes, deberías tener todos ya colocados en el personaje y desactivados. Luego desde el componente Customization activas el seleccionado.

Voy a intentar como me has dicho y haber que tal se da, ya tengo en mente mas o menos como armar todo este jaleo, ya ire diciendo que tal va la cosa.

Yo pensaba que esto era mucho mas simple como guardar el estado de un gameobject tal cual, pero veo que tiene mas miga de lo que pensaba jaja

  • Like 1

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...