guardar lista y cargar en unity
– UnityAssets3Free
– 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