Jump to content
UnitySpain

Search the Community

Showing results for tags 'load'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Inicio
    • Proyectos
    • Offtopic
    • Unity Feeds
    • Website
  • Mesa de ayuda
    • Unity
    • Arte
    • Otras Especialidades
    • Builds & Dispositivos
  • Aportes de la Comunidad
    • Recursos
    • Eventos
    • Buenas Prácticas
  • Bolsa de trabajo & Colaboraciones
    • Ofertas y Demandas
  • Post Antiguos
    • General (Antiguo)

Blogs

  • byGui
  • El Blog de Pioj

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Especialidad

Found 10 results

  1. Hola a todos!!, he estado trabajando en un guardado automatico para un juego de estilo novela visual, he podido guardar las escenas automaticamente y ahora estoy intentando guardar el dialogo exacto en donde quedo el jugador antes de salir del juego, para eso tuve que comunicar variables entre script para decirle al playerprefs que cada ves que hiciera click el jugador para cambiar de dialogo guardara el dialogo y el dialogo esta en otra script, sin embargo cuando reproduzco el juego me sale el error : Object reference not set to an instance of an object nose como solucionarlo PD: el que dice dialogue es el string que saque del otro script dialoguemanager y el que contiene el dialogo del juego que quiero guardar MUCHAS GRACIAS POR LEER. public class savegame : MonoBehaviour { public DialogueManager manager; static public int level; // Use this for initialization public void OnGUI() { DialogueManager manager; string dialogo; manager = GameObject.Find("DialogueManager").GetComponent<DialogueManager>(); dialogo = manager.dialogue; if (Input.GetMouseButtonDown(0)) { PlayerPrefs.GetString("llave", dialogo); }
  2. estoy creando una novela visual y he creado un playerprefs para que guarde instantaneamente la escena donde estoy y luego poder cargarla undiendo el boton load en otra escena y funciona perfectamente!, el problema es que realice otros playerprefs para guardarr el dialogo la pose la posicion del personaje y lo configure para que cada vez que se haga click para pasar al siguiente dialogo se guarde todo lo anterior dicho y esto ayudara que cuando se unda el load no solo muestre la escena donde quedo el jugador sino el dialogo exacto en el que quedo, el problema es que por alguna razon no sirve!!, al undir el load solo me carga la escena y no el dialogo exacto donde quedo el personaje, no entiendo que estoy haciendo mal y agradeceria muchisimo su ayuda GRACIAS POR LEER pd = LA PARTE DEL SAVE Y LOAD COMIENZA DESDE EL void OnGUI () using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; using UnityEngine.SceneManagement; public class DialogueManager : MonoBehaviour { public DialogueParser parser; public GameObject textbox; public string dialogue, characterName; public int lineNum; int pose; public string position; string[] options; public bool playerTalking; List<Button> buttons = new List<Button>(); public Text dialogueBox; public Text nameBox; public GameObject choiceBox; static public int level; // Use this for initialization void Start() { dialogue = ""; characterName = ""; pose = 0; position = "L"; playerTalking = false; parser = GameObject.Find("DialogueParser").GetComponent<DialogueParser>(); lineNum = 0; } // Update is called once per frame void Update() { if (Input.GetMouseButtonDown(0) && playerTalking == false) { ShowDialogue(); lineNum++; } UpdateUI(); } public void ShowDialogue() { ResetImages(); ParseLine(); } void UpdateUI() { if (!playerTalking) { ClearButtons(); } dialogueBox.text = dialogue; nameBox.text = characterName; } void ClearButtons() { for (int i = 0; i < buttons.Count; i++) { print("Clearing buttons"); Button b = buttons[i]; buttons.Remove(b); Destroy(b.gameObject); } } public void ParseLine() { if (parser.GetName(lineNum) != "Player") { playerTalking = false; characterName = parser.GetName(lineNum); dialogue = parser.GetContent(lineNum); pose = parser.GetPose(lineNum); position = parser.GetPosition(lineNum); DisplayImages(); } else { playerTalking = true; characterName = ""; dialogue = ""; pose = 0; position = ""; options = parser.GetOptions(lineNum); CreateButtons(); } } void CreateButtons() { for (int i = 0; i < options.Length; i++) { GameObject button = (GameObject)Instantiate(choiceBox); Button b = button.GetComponent<Button>(); ChoiceButton cb = button.GetComponent<ChoiceButton>(); cb.SetText(options[i].Split(':')[0]); cb.option = options[i].Split(':')[1]; cb.box = this; b.transform.SetParent(this.transform); b.transform.localPosition = new Vector3(0, -25 + (i * 50)); b.transform.localScale = new Vector3(1, 1, 1); buttons.Add(b); } } void ResetImages() { if (characterName != "") { GameObject character = GameObject.Find(characterName); SpriteRenderer currSprite = character.GetComponent<SpriteRenderer>(); currSprite.sprite = null; } } void DisplayImages() { if (characterName != "") { GameObject character = GameObject.Find(characterName); SetSpritePositions(character); SpriteRenderer currSprite = character.GetComponent<SpriteRenderer>(); currSprite.sprite = character.GetComponent<Character>().characterPoses[pose]; } } void SetSpritePositions(GameObject spriteObj) { if (position == "L") { spriteObj.transform.position = new Vector3(-6, -2, 2); PlayerPrefs.GetFloat("x", transform.position.x); PlayerPrefs.GetFloat("y", transform.position.y); PlayerPrefs.GetFloat("z", transform.position.z); } else if (position == "R") { spriteObj.transform.position = new Vector3(6, -2, 2); PlayerPrefs.GetFloat("x", transform.position.x); PlayerPrefs.GetFloat("y", transform.position.y); PlayerPrefs.GetFloat("z", transform.position.z); } else if (position == "C") { spriteObj.transform.position = new Vector3(1, -2, 2); } else if (characterName == "") { spriteObj.transform.position = new Vector3(1, -2, 2); } spriteObj.transform.position = new Vector3(spriteObj.transform.position.x, spriteObj.transform.position.y, 0); } public void OnGUI() { if (SceneManager.GetActiveScene().name == "Scene1") { if (Input.GetMouseButtonDown(0)) { PlayerPrefs.SetString("dialogo", dialogue); PlayerPrefs.SetString("name", characterName); PlayerPrefs.SetString("position", position); PlayerPrefs.SetInt("pose", pose); PlayerPrefs.SetInt("line", lineNum); lineNum++; PlayerPrefs.Save(); Debug.Log("save"); } level = 1; PlayerPrefs.SetInt("level", level); PlayerPrefs.Save(); Debug.Log("guardado" + level); } if (SceneManager.GetActiveScene().name == "Scene3") { level = 3; PlayerPrefs.SetInt("level", level); PlayerPrefs.Save(); Debug.Log("guardado" + level); } if (SceneManager.GetActiveScene().name == "Scene2") { bool botton = GUI.Button(new Rect(200, 80, 80, 50), "cargar"); if (botton) { level = PlayerPrefs.GetInt("level"); if (level == 1) { SceneManager.LoadScene("Scene1"); transform.position = new Vector3(PlayerPrefs.GetFloat("x"), PlayerPrefs.GetFloat("y"), PlayerPrefs.GetFloat("z")); transform.position = new Vector3(transform.position.x + 1, transform.position.y, transform.position.z); dialogue = PlayerPrefs.GetString("dialogo"); characterName = PlayerPrefs.GetString("name"); position = PlayerPrefs.GetString("position"); pose = PlayerPrefs.GetInt("pose"); lineNum = PlayerPrefs.GetInt("line"); lineNum++; } } } } }
  3. Hola a todos!! he estado probando diferentes maneras de guardar mi juego automáticamente y porfin he logrado guardar la escena, sin embargo para que guarde, el script debe estar naturalmente en todas las escenas del juego sin embargo ese script contiene un boton que cree para que al darle click lleve a la escena guardada, sin embargo el boton me aparece en todas las escenas y solo quiero que salga en la escena del menu he probado con que si esta en las escenas que no quiero sea == a false, he probado la opcion gui disable y aun asi sigue apareciendo el boton en las escenas que no quiero, aqui esta el codigo : que puedo hacer para que el gui.button solo aparezca en la escena del menu del juego?? MUCHAS GRACIAS POR LEER static public int level; // Use this for initialization public void OnGUI() { bool botton = GUI.Button(new Rect(200, 80, 80, 50), "cargar"); if (SceneManager.GetActiveScene().name == "Scene1") { level = 1; PlayerPrefs.SetInt("level", level); PlayerPrefs.Save(); Debug.Log("guardado" + level); } if (SceneManager.GetActiveScene().name == "Scene3") { level = 3; PlayerPrefs.SetInt("level", level); PlayerPrefs.Save(); Debug.Log("guardado" + level); } if (botton) { level = PlayerPrefs.GetInt("level", 0); if(level == 1) { SceneManager.LoadScene("Scene1"); GUI.enabled = false; } else if(level == 3) { SceneManager.LoadScene("Scene3"); GUI.enabled = false; } } }
  4. hola a todos!, he estado averiguando sobre los playerprefs para guardar y cargar información, encontré que se clasifican en distintos tipos como enteros strings floats etc, en mi caso lo que necesito guardar es la progresión de una historia ya que es una novela visual, se me ocurrió que podría guardarse tipo si el jugador esta en una determinada escena entonces que guarde esa escena, sin embargo no se como configurar el código para que quede de esa forma, por otra parte el que guarde la escena no me garantiza que se haya guardado el texto y la imagen exacta por donde el jugador va, por otra parte para guardar un juego con playerprefs se necesita una llave y yo quisiera que se guardara automáticamente sin que el jugador tenga que undir nada, he visto que esto es posible en otras novelas visuales y quisiera saber como se puede configurar el código para lograr mi cometido como siempre muchas gracias por leer
  5. durante un tiempo he estado haciendo una novela visual para android, aunque ya he configurado lo que se refiere a la jugabillidad me queda el factor mas determinante de todo el proceso y es el de salvar y cargar, me he dado cuenta que las novelas visuales que suelo descargar de android no tienen botón de guardar y al cerrar y volver a abrir el juego se reanuda automáticamente en la ultima escena recorrida, quisiera saber como puedo elaborar este save load automático como puedo elaborar el script para que sea funcional en android o si este proceso es algo que viene implícito al descargar el android SDK y no hace falta hacer nada, mi otra pregunta es que yo configure los controles para que al hacer click con el boton izquierdo del mouse pase al siguiente dialogo, esto aplica para android? o al descargar el sdk tengo que configurar de nuevo los controles y si es así como tengo que hacerlo muchisimas gracias por su atención y por leer
  6. Enlace de descarga: https://app.box.com/s/384vkwhfosk9zgzpftphq3oi35yifhpb Para este sistema de Save/Load necesitamos crear un prefab de la entidad. El prefab se necesita para instanciar/crear un nuevo GameObject de la forma más sencilla. El sistema de guardado consta de una clase estática llamada GameData que almacena una sola instancia MonoBehaviour(script) de cada GameObject dentro de una ArrayList, y dispone de las funciones Save y Load: using UnityEngine; using System.Collections; using System.IO; using System.Runtime.Serialization.Formatters.Binary; public static class GameData { public static string file = "GameData.dat"; public static ArrayList Data = new ArrayList(); //Aqui se almacenaria todos los datos como objetos public static bool Save(){ FileStream fs = new FileStream(file, FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); ArrayList arrayList = new ArrayList(); foreach(object data in Data){ ISaveLoad script = (ISaveLoad) data; arrayList.Add(script.GetData()); } try { formatter.Serialize(fs, arrayList); } catch (System.Runtime.Serialization.SerializationException e) { UnityEngine.Debug.Log("Failed to serialize. Reason: " + e.Message); return false; } finally { fs.Close(); } arrayList.Clear(); arrayList = null; formatter = null; fs = null; return true; } public static bool Load(){ if(!File.Exists(file)) return false; FileStream fs = new FileStream(file, FileMode.Open); ArrayList arrayList; try { BinaryFormatter formatter = new BinaryFormatter(); arrayList = (ArrayList) formatter.Deserialize(fs); formatter = null; } catch (System.Runtime.Serialization.SerializationException e) { UnityEngine.Debug.Log("Failed to deserialize. Reason: " + e.Message); return false; } finally { fs.Close(); } Data.Clear(); //Instanciar GameObjects a escena foreach(object data in arrayList){ EntityData entityData = (EntityData)data; entityData.OnLoad(UnityEngine.Object.Instantiate<GameObject>(Resources.Load<GameObject>(entityData.ResourcesPath))); } arrayList.Clear(); arrayList = null; fs = null; return true; } } Uso la instancia de un script como referencia del GameObject, y no una clase serializada directamente, porque es constante durante todo el tiempo de juego. Tampoco utilizo el GameObject directamente como referencia, para que este sistema de guardado pueda ser utilizado por cualquier tipo de script(SOLO UN SCRIPT por GameObject podrá implementar el sistema de guardado). Este único script recoge los datos de los componentes y otros script del GameObject. Para poder guardar los datos del juego de forma generalizada, utilizo una clase base serializada llamada EntityData con el campo ResourcesPath y la funcion OnLoad: [System.Serializable] public class EntityData{ public string ResourcesPath; public virtual void OnLoad(GameObject gameObject){} } Y además, necesito una interfaz para poder extraer los datos de los GameObjects, con la funcion GetData(): interface ISaveLoad{ object GetData(); } UTILIZACION Como he dicho, antes de nada, es necesario crear un prefab de la entidad/GameObject que alojaremos en la carpeta Resources. A continuación, dentro de algún script del GameObject a guardar(solo un script del GameObject puede implementar este sistema): 1) Creamos una clase derivada de EntityData. Esta clase hereda ResourcesPath y la funcion OnLoad necesaria para la carga de la escena, y añadiremos los datos que queramos guardar del GameObject. Por ejemplo: [System.Serializable] public class Data : EntityData{ [HideInInspector] public float px,py,pz,rx,ry,rz,sx,sy,sz; public int vida = 100, experiencia = 0; public override void OnLoad (GameObject gameObject) { Transform transform = gameObject.GetComponent<Transform>(); transform.position = new Vector3(px,py,pz); transform.eulerAngles = new Vector3(rx,ry,rz); transform.localScale = new Vector3(sx,sy,sz); ScriptEntidad1 script = gameObject.GetComponent<ScriptEntidad1>(); //Transformamos el object en la clase de datos de la entidad script.datos = (ScriptEntidad1.Data) this; } } public Data datos; He creado una clase llamada Data, derivada de EntityData, donde almaceno los datos del Transform y dos campos de vida y experiencia. En la funcion OnLoad asigno estos valores a los componentes, es decir, al Transform y al Script al que he vinculado los datos, en este caso al script 'ScriptEntidad1'. 2) Añadimos el script a la lista de GameData desde la funcion Start() de Unity, y los eliminamos al destruir el GameObject desde la funcion OnDestroy() de Unity: void Start () { //Añadir GameObject a la lista GameData.Data.Add(this); } void OnDestroy(){ //Eliminar GameObject de la lista GameData.Data.Remove(this); } 3) Añardir la funcion GetData de la interfaz ISaveLoad: public class ScriptEntidad1 : MonoBehaviour, ISaveLoad { object ISaveLoad.GetData(){ //Actualizar Datos Transform Vector3 temp = this.transform.position; this.datos.px = temp.x; this.datos.py = temp.y; this.datos.pz = temp.z; temp = this.transform.eulerAngles; this.datos.rx = temp.x; this.datos.ry = temp.y; this.datos.rz = temp.z; temp = this.transform.localScale; this.datos.sx = temp.x; this.datos.sy = temp.y; this.datos.sz = temp.z; return this.datos; } } Si quereis ver el codigo completo del script: using UnityEngine; using System.Collections; public class ScriptEntidad1 : MonoBehaviour, ISaveLoad { [System.Serializable] public class Data : EntityData{ [HideInInspector] public float px,py,pz,rx,ry,rz,sx,sy,sz; public int vida = 100, experiencia = 0; public override void OnLoad (GameObject gameObject) { Transform transform = gameObject.GetComponent<Transform>(); transform.position = new Vector3(px,py,pz); transform.eulerAngles = new Vector3(rx,ry,rz); transform.localScale = new Vector3(sx,sy,sz); ScriptEntidad1 script = gameObject.GetComponent<ScriptEntidad1>(); //Transformamos el object en la clase de datos de la entidad script.datos = (ScriptEntidad1.Data) this; } } public Data datos; object ISaveLoad.GetData(){ //Actualizar Datos Transform Vector3 temp = this.transform.position; this.datos.px = temp.x; this.datos.py = temp.y; this.datos.pz = temp.z; temp = this.transform.eulerAngles; this.datos.rx = temp.x; this.datos.ry = temp.y; this.datos.rz = temp.z; temp = this.transform.localScale; this.datos.sx = temp.x; this.datos.sy = temp.y; this.datos.sz = temp.z; return this.datos; } void Start () { //Añadir GameObject a la lista GameData.Data.Add(this); } void OnDestroy(){ //Eliminar GameObject de la lista GameData.Data.Remove(this); } }
  7. Quisiera saber como cargar un nivel poco a poco, lo primero que pense fue en activar los gameobject uno por uno, para no sobrecargar la escena y cargarla de golpe y ize este script, pero que la tecnica no esta buena y quisiera saber otra opinion var useLine : boolean = true; var mesh : TextMesh; var gSkin : GUISkin; var progress : int; var list : GameObject[]; private var j = 0; private var length = 0; function Start () { DontDestroyOnLoad (this); length = list.length - 1; var timeR = (length) * 0.0005f; for(j = 0; j < list.length; j++){ list[j].SetActive(true); progress = (j*100/length); if(!useLine) mesh.text = progress.ToString() + "%"; yield WaitForSeconds (timeR); } } function Update () { if(progress >= 99){ if(mesh.gameObject) Destroy (mesh.gameObject); Destroy(gameObject); } } function OnGUI () { if(gSkin) GUI.skin = gSkin; if(useLine) GUI.Box(Rect(5, Screen.height - 100, (progress * (Screen.width - 20))/100, 20), ""); }
  8. Hola gente, Espero que todos estén bien. tengo un dilema que todos afrontaron, pero no se si todos buscan lo mismo. estoy rompiéndome la cabeza para crear un sistema de partidas (crear, guardar, cargar, eliminar). lo que quiero hacer: - crear una partida nueva (nombre, dificultad de juego, dinero, experiencia) eso va bien, ya que utilizo playerprefs. - cambiar de jugador ( en este caso un vehiculo ) al cual entro a un local (trigger) y me deriva a x escena. si estoy usando un "ford" y compro un Bmw, quisiera que el gameobject se reemplazara por el nuevo (y guardar el otro en una lista) asi mismo, poder modificar variables de objetos dentro de otro (alerones, faldones, llantas, etc) se me habia ocurrido utilizar una lista de objetos, marcados por int (aleron "nombre") = 2. entonces poder manejar ese gameobject mediante playerprefs. una vez que termine con las modificaciones del objeto, guardar la partida y cambiar de escena y mantener los datos y cambios de coches o objetos en la otra escena. intente utilizar DontDestroyOnLoad(), pero la verdad es que a veces, puede ocacionar problemas. alguien que tenga un poco de tiempo y se anime a orientarme un poco mas sobre este tema? * para el amargado que seguramente ponga, "existe el buscador" ya me pase por todas las paginas, pero lo unico que encontre, fue sobre puntuacion, vida y dinero, espero una ayuda o guia que me pueda ser util! saludos a todos!
  9. HOLA TENGO UN PROBLEMA QUIERO HACER UN MENU ANDROID QUE FUNCIONE CON GUI TEXTURES OSEA CUANDO TOQUE SINGLEPLAYER ME LLEVE A SINGLE PLAYER Y ASI DE CADA UNO XD ESQUE TENGO PROBLEMA CON ESTA SCRIPT PERO NO ME FUNCIONA CON TODOS SE LOS PONGO A CADA UNO Y ME LLEVA NADA MAS A SINGLE AQUI VA EL SCRIPT: QUIERO QUE A CADA OPCION ME LLEVE A SU RESPECTIVA ESCENA YA QUE NADA MAS ME CARGA UNA SI PONGO EL MISMO SCRIPT PERO CON DIFERENTE ESCENA
  10. Hola Mi pregunta es si alguien sabe como se puede guardar(serializar) las variables de los scripts y luego cargarlas, estoy tratando de guardarlas en binario utilizando el BinaryFormatter pero me da error al tratar de guardar un script ya que la clase "MonoBehaviour" no se puede serializar. Alguien puede ayudarme ?
×
×
  • Create New...