En este momento estás viendo guardar lista y cargar en unity

 – Unity

guardar lista y cargar en unity – Unity

guardar lista y cargar en unity

– UnityAssets3Free

hola , por aqui josel luis y en esta ocasion os traigo
esta unity pregunta

entonces tengo esto
List<GameObject> character; Esto tiene datos para todos los personajes que quiero generar en mi juego al azar. En el juego inicial, solo tenemos un dado, es decir, un GameObject en esta lista. Y a medida que compro personajes de la tienda, se agregan a esta lista llamada «personajes». Todo esto está funcionando bien ahora. El problema es que cuando salgo del juego después de comprar los personajes y vuelvo a jugar, estas compras no se guardan. Quiero saber una manera de guardar y cargar esto list<GameObject> characters. yo intenté PlayerPrefs Pero no parece realizar el rescate de lists y esa es la única forma que conozco de ahorrar unity. Cualquier ayuda con el código. He visto que el delimitador de cadenas (si lo pronuncio correctamente) hará el trabajo. Pero no se que hacer y como alguien me puede ayudar. Gracias.

pregunta actualizada
Aquí está el código de script de mi tienda:

[System.Serializable] public class ShopItem
    
        public Sprite CharacterImage;
        public GameObject charactersModel;
        public int Price;
        public bool isPurchased = false;
    

    public List<ShopItem> ShopItemsList;

    [Header("Panel Holders")]
    [SerializeField] GameObject MainMenu;
    [SerializeField] GameObject SettingsHolder;
    [SerializeField] GameObject ShopPanel;

    [Space]
    [Header("Item Template & Display")]
    GameObject ItemTemplate;
    GameObject g;
    [SerializeField] Transform ShopScrollView;
    Button buyBtn;

    //String Delimiter for Characters is "/"
    public char mCharacterDemiliter="https://stackoverflow.com/";
    GameObject getGameManager;
    GameManager GameManagerRef;
    public string mPurchasedCharaters = string.Empty;
    public string[] mPurchasesCharacterList;

    private void Start()
    
        getGameManager = GameObject.Find("GameManager");
        GameManagerRef = getGameManager.GetComponent<GameManager>();
        ItemTemplate = ShopScrollView.GetChild(0).gameObject;

        var length = ShopItemsList.Count;
        for (int i = 0; i < length; i++)
        
            g = Instantiate(ItemTemplate, ShopScrollView);
            g.transform.GetChild(0).GetComponent<Image>().sprite = ShopItemsList[i].CharacterImage;
            g.transform.GetChild(1).GetComponentInChildren<TextMeshProUGUI>().text = ShopItemsList[i].Price.ToString();
            buyBtn = g.transform.GetChild(2).GetComponent<Button>();
            if (ShopItemsList[i].isPurchased)
            
                DisableBuyButton();
            
            buyBtn.AddEventListener(i, OnShopItemBtnClicked);
        
        Destroy(ItemTemplate);
    

    private void OnEnable()
    
        //GameManagerRef.isCharacterPurchased = PlayerPrefs.GetString("SaveCharacterPurchaseData");
        GameManagerRef.mPurchasedCharaters = PlayerPrefs.GetString("SavedCharacters");
        mPurchasesCharacterList = mPurchasedCharaters.Split(mCharacterDemiliter);

        foreach (var sub in mPurchasesCharacterList)
        
            ShopItemsList[].isPurchased = true;
            Debug.Log(int.Parse(sub));
            DisableBuyButton();
        
    

    public void DisableBuyButton()
    
        buyBtn.interactable = false;
        buyBtn.transform.GetChild(0).GetComponent<TextMeshProUGUI>().text = "PURCHASED";
        //Destroy(buyBtn);
    

    public void OpenShop()
    
        MainMenu.SetActive(false);
        SettingsHolder.SetActive(false);
        ShopPanel.SetActive(true);
    

    public void ReturnButton()
    
        MainMenu.SetActive(true);
        SettingsHolder.SetActive(true);
        ShopPanel.SetActive(false);
    

    int boolToInt(bool val)
    
        if (val)
            return 1;
        else
            return 0;
    

    

    void OnShopItemBtnClicked(int itemIndex)
    
        if (GameManagerRef.HasEnoughCoins(ShopItemsList[itemIndex].Price))
        
            //purchase Item
            GameManagerRef.UseCoins(ShopItemsList[itemIndex].Price);
            ShopItemsList[itemIndex].isPurchased = true;
            buyBtn = ShopScrollView.GetChild(itemIndex).GetChild(2).GetComponent<Button>();
            GameManagerRef.character.Add(ShopItemsList[itemIndex].charactersModel);
            DisableBuyButton();

            #region "Save the purchased character"
            
            GameManagerRef.mPurchasedCharaters = GameManagerRef.mPurchasedCharaters + GameManagerRef.mCharacterDemiliter + ShopItemsList[itemIndex].charactersModel.name;
            PlayerPrefs.SetString("SavedCharacters", GameManagerRef.mPurchasedCharaters);

            GameManagerRef.isCharacterPurchased = GameManagerRef.isCharacterPurchased + GameManagerRef.mCharacterDemiliter + ShopItemsList[itemIndex].isPurchased;
            PlayerPrefs.SetString("SaveCharacterPurchaseData", GameManagerRef.isCharacterPurchased);
            //PlayerPrefs.SetInt("SaveCharacterPurchaseData", boolToInt(ShopItemsList[itemIndex].isPurchased));
            
            #endregion
        
        else
        
            Debug.Log("You dont have sufficient amount");
        
    

Aquí, guardar el modelo de personaje y volver a cargarlo funciona bien usando las preferencias del jugador. Logré hacerlo funcionar, pero el problema es que cuando compro algo, cambia a comprado. genial hasta entonces, a menos que salga del juego y vuelva a entrar. Tu ticket de comprado a comprado de nuevo. Traté de guardar cadenas o ni siquiera sé si es la forma correcta. Ayuda por favor @ dgates82.

para mi referencia GameManager Script también porque sigo usándolos simultáneamente

    public static GameManager Instance;
    //Stores Coin Value throughout the game
    /*[HideInInspector]*/ public int coin = 0;

    //Retreive / Load Coin Value thats saved
    int savedCoin;

    //Get the LevelManager of that specific scene
    [HideInInspector] public GameObject LevelManagerRef;
    /*[HideInInspector]*/ public GameObject shopRef;
    /*[HideInInspector]*/ public Shop storeShopScript;
    
    public List<GameObject> character = new List<GameObject>();
    
    [Space]
    [Header("Save and load store Character Data")]
    public string mPurchasedCharaters = string.Empty;
    public string isCharacterPurchased = string.Empty;

    public string[] mPurchasesCharacterList;
    public string[] characterPurchasedList;

    public char mCharacterDemiliter="https://stackoverflow.com/";

    void Awake()
    
        //Loads the coin save Data
        LoadCoinSaveData();

        #region "Singleton Code"
        //Checks to see if there is another gameManager instance and deletes that
        if (Instance == null)
        
            Instance = this;
            DontDestroyOnLoad(this); //Singleton
            return;
        
        Destroy(this.gameObject);
        #endregion

    

    private void Start()
    
        shopRef = FindInActiveObjectByName("ShopMenu");
        storeShopScript = shopRef.GetComponent<Shop>();
        PopulateCharacters();
        //makePurchased();
    

    #region "Populate SavedCharacters"
    public void PopulateCharacters()
    
        mPurchasedCharaters = PlayerPrefs.GetString("SavedCharacters");
        
        if(mPurchasedCharaters == string.Empty)
        
            mPurchasedCharaters = "Man";
            PlayerPrefs.SetString("SavedCharacters", mPurchasedCharaters);
        
        mPurchasesCharacterList = mPurchasedCharaters.Split(mCharacterDemiliter);

        foreach (var sub in mPurchasesCharacterList)
        
            GameObject loadedCharacter =  Resources.Load(sub) as GameObject;
            character.Add(loadedCharacter);
        
    

    //public void makePurchased()
    //
    //    isCharacterPurchased = PlayerPrefs.GetString("SaveCharacterPurchaseData");

    //    characterPurchasedList = isCharacterPurchased.Split(mCharacterDemiliter);

    //    foreach (string characterSaved in characterPurchasedList)
    //    
    //        for (int i = 0; i <= storeShopScript.ShopItemsList.Count; i++)
    //        
    //            if ()
    //            
    //                storeShopScript.ShopItemsList[i].isPurchased = Convert.ToBoolean(bool.Parse(characterSaved));       
    //            
    //        
    //    
    //
    #endregion
   
    private void LoadCoinSaveData()
    
        savedCoin = PlayerPrefs.GetInt("SavedCoinValue");
        coin = savedCoin;
    

    //Reduce the coin value depending upon the amount
    public void UseCoins(int amount)
    
        coin -= amount;
      
    
    //Use coins if enough coins are there?
    public bool HasEnoughCoins(int amount)
    
        return (coin >= amount);
    

    GameObject FindInActiveObjectByName(string name)
    
        Transform[] objs = Resources.FindObjectsOfTypeAll<Transform>() as Transform[];
        for (int i = 0; i < objs.Length; i++)
        
            if (objs[i].hideFlags == HideFlags.None)
            
                if (objs[i].name == name)
                
                    return objs[i].gameObject;
                
            
        
        return null;
    
}

1 respuesta 1

Como se menciona en los comentarios, no puede serializar GameObjects ni nada que herede de MonoBehaviour.

Entonces, debemos comenzar creando una clase que podamos serializar para almacenar algunos datos relevantes y marcarla con un atributo «Serializable».

[Serializable]
public class CharacterData // Do not inherit from MonoBehaviour here

    public int Id;
    public string Name;
    public int HitPoints;
    public int AttackDamage;

Y los objetos del juego de tu personaje usarán estos datos

public Character : MonoBehaviour

    public CharacterData Data;
    private int hitPoints;

    // Retrieve data from CharacterData for local use
    void Awake()
    
        hitPoints = Data.HitPoints;
    


Así que vamos a crear otra clase serializable para almacenar todos nuestros diversos datos guardados, llamada muy creativamente… SaveData, que tiene una lista de CharacterData como campo.

[Serializable]
public class SaveData // Do not inherit from MonoBehaviour here

    public List<CharacterData> Characters;

Ahora puede serializar y deserializar su SaveData y almacenarlo donde quiera

public class SaveManager : MonoBehavior

    public void Save(SaveData data)
    
        // Serialize to json
        var jsonData = JsonUtility.ToJson(data);

        // Now save the json locally, to GPGS, etc. as you choose
    

    public void Load()
    
        // Retrieve json data from storage of your choice
        var jsonData = somehow get from storage
        
        // Then deserialize it back to an object
        var saveData = JsonUtility.FromJson<SaveData>(jsonData);

        // And then apply it to your characters
        // For example, maybe you instantiate your prefabs and then add the character data
        foreach (var characterData in saveData.Characters)
        
            var spawnPoint = // need a spawn point
            var characterPrefab = // need a prefab to assign
            var character = Instantiate(characterPrefab, spawnPoint);
            // Assign the saved character data to the new game object
            character.CharacterData = characterData;
        
    


nota: si aun no se resuelve tu pregunta por favor dejar un comentario y pronto lo podremos de nuevo , muchas gracias

por hoy,hasta la proxima

Deja una respuesta