Buenas a todos a ver si podeis indicarme el camino porque ya no se por donde cogerlo.
Resulta que estoy haciendo un Login, Registro y demas con Mysql.
Todo el tema ed login y registro funciona bien, ahora mi problema viene cuando intento hacer un GameObject llamado GestionBD para que sea el mismo sin destruirse en las diferentes escenas de login registro y demas.
En la primera escena Login tengo dos campos, con dos variables publicas y asociados los inputField a las dos variables, pero en la escena siguiente Registro (a la que se accede mediante un boton) tengo otras variables publicas que tengo que poner en GEstionBD pero al cambiar de escena no se como hacerlo mediante codigo, una vez hecho ya podre hacerlo en todas las escenas.
No se si me explico, pero necesito meter el input field de la escena2(registro) desde la escena1(login) por ejemplo al cambiar de escena...
He probado todo aunque me quedado lo mas cercano por aqui (creo)
//Cambiamos de escena
SceneManager.LoadScene ("Registro");
txtUsuarioRegistro = GameObject.Find ("inputUsuario").GetComponent<InputField> ();
Cuando cambio la escena busco el gameObject, busco el componete pero nose como asociarlo.
Un saludo
Puede servirte el dontDestroyOnLoad ( https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html (https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html) ) para que un objeto no se destruya al pasar de escenas pero este siempre estara activo, si quieres que no se muestre en tu pantalla en algún momento solo desactiva el objeto en la escena deseada y listo.
Espero haber ayudado!
yo si solo necesito guardar el dato y no el label porque no lo voy a utilizar mas, en vez de ocultarlo, guardo los datos que voy a utilizar en un script con el dontdestroyonload, veo un poco absurdo pillar todo el label cuando solo te interesa el valor que a introducido el usuario
Gracias por contestar. Pero creo que no nos hemos entendido...
Yo uso en la escena una una script con el dontDestroyOnLoad, pero en ese script solo puedo acceder a los inpuField de la primera escena, a los de la escena que voy a pasar como puedo acceder? Cuando cambio de escena accedo, pero no sé cómo...
A ver si ahora me explicado mejor jajajaja
Yo separaría por un lado la interfaz y por otro los string para gestionar la base de datos, el objeto GestionBD tendrá una clase con la que gestionas el acceso, no? Como dicen arriba solo hacen falta los string, luego tendrías que hacer otra clase para que los input busquen el objeto y le pasen los string, de esta manera aunque cambies de escena los inputs seguirán buscando el objeto.
Exacto el script GestionBD se conecta a la base de datos y con Corutinas ingresa o comprueba el login. Lo que tengo que hacer es ingresar o acceder al componente InputField de la escena 2 desde el script que esta en la escena 1. Supongo que sera al cambiar de escena como no se destruye el script debido al dontDestroyOnLoad acceder al componente inputfield, pero como lo hago. Lo he intentado de 1000 formas pero me dice missing.
Como tu dices los input busquen al objeto y le pase los striung.
Voy a seguir probando...
Un saludo gracias
Vale he seguido prbando, he asociar el input field mediante getcomponent, si esta en la misma escena se agrega lo puedo eliminar etc, no hay problema. Pero como los input field de la escena de Registo ( que es la escena 2) estan en otra escena al cambiar de escena pierde o se quitan todos los componentes(inputfield) asociados en la primera escena.
Como puedo asociar, llamar acceder a los input de otra escena?
un saludo
Puedes hacer dos cosas, seguir como hasta ahora y tener una referencia de los inputfield en tu script de GestionBD, en este caso cuando cambies de escena tienes que hacer un getcomponent como ya has hecho, lo suyo sería utilizar el evento de cambio de escena;
https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager-sceneLoaded.html (https://docs.unity3d.com/ScriptReference/SceneManagement.SceneManager-sceneLoaded.html)
Es decir, creas una función en la que buscas los inputfield con un Find y haces el getcomponent y suscribes la función al evento, el problema es que tienes que controlar bien cuándo cancelar la suscripción porque supongo que no todas las escenas tienen los inputfield,
También puedes hacer lo que te dije antes (mejor ), crear un script en la que los inputfield sean quien encuentre el GestionBD y le pase lo que el usuario escriba, es más creo que podrías usar un singleton para esto ya que solo tendrás un GestionBD y siempre será el mismo con el DontDestroy. La ventaja de esta manera es que te olvidas de qué escena te encuentres, porque cuando estés en una escena en la que hay inputfields ya sabes que ellos se encargan de pasarle los datos a GestionBD.
Cita de: Jony date=1535142248Vale he seguido prbando, he asociar el input field mediante getcomponent, si esta en la misma escena se agrega lo puedo eliminar etc, no hay problema. Pero como los input field de la escena de Registo ( que es la escena 2) estan en otra escena al cambiar de escena pierde o se quitan todos los componentes(inputfield) asociados en la primera escena.
Como puedo asociar, llamar acceder a los input de otra escena?
un saludo
de verdad leíste mi respuesta?
Cita de: Jony date=1535142248Vale he seguido prbando, he asociar el input field mediante getcomponent, si esta en la misma escena se agrega lo puedo eliminar etc, no hay problema. Pero como los input field de la escena de Registo ( que es la escena 2) estan en otra escena al cambiar de escena pierde o se quitan todos los componentes(inputfield) asociados en la primera escena.
Como puedo asociar, llamar acceder a los input de otra escena?
un saludo
Como ya te han dicho en varias oportunidades, la solución más obvia sería crear un singleton con DontDestroyOnLoad (https://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html).
En la escena de login crear el script, asignas el valor de los campos/variables y lo guardas, luego en la siguiente escena haces referencia a ese objeto y tendrás acceso a esas variables (y todo lo que definas en ese script).
Saludos;
Deberias tener una estructura fija tipo singleton (sin ser monobehaviour) para almacenar todos los datos que quieras, y luego accedes a ellos desde cualquier escena/script. Y no te preocupas por nada mas, ni cambios de escena ni historias "complicadas".
el problema que tiene es que está empeñado en "transportar" un label de una escena a otra jajaja
jajajajaja. Si he leido todas las respuestas, he probado todas las respuestas y no lo he conseguido.
La teoria la se como debo de hacerla, ya tengo el singleton y todo eso pero al cambiar de escena no consigo hacerme con esos Input... llamarme cazurro pero es lo que hay. jajaja.
A ver si tengo un rato y lo vuelvo a intentar... jajajaja.
Cita de: Jony date=1535655746jajajajaja. Si he leido todas las respuestas, he probado todas las respuestas y no lo he conseguido.
La teoria la se como debo de hacerla, ya tengo el singleton y todo eso pero al cambiar de escena no consigo hacerme con esos Input... llamarme cazurro pero es lo que hay. jajaja.
A ver si tengo un rato y lo vuelvo a intentar... jajajaja.
CAZURRO.
Bueno vamos a ver si aclaramos el tema un poco, porque pufff, no sé que haces ya que realmente no es tan complejo.
Te pongo un poco el manager, en mi caso si heredo de MonoBehaviour. Lo importante aquí es el "public static" y el "DontDestroyonLoad"
public class GameManager : MonoBehaviour { //heredo porque uso campos asociados al script, contempla si te hace falta heredar o no de MonoBehaivour.
public static GameManager gManager;
public TMP_InputField campo_usuario, campo_clave; //yo uso TMP, tú usa lo que tengas.
public string usuario { get; set;} //variables que luego accederás desde otro script.
public string clave { get; set;}
void Awake(){
if (gManager == null){
gManager = this;
DontDestroyOnLoad(gameObject);
}else if (gManager != this){
Destroy(this.gameObject);
}
}
public void SaveConfig(){ //obviamente al hacer clic al botón de conectar, guardo los datos, o cuando quiera.
usuario = campo_usuario.text;
clave = campo_clave.text; //Esto dependerá de tu campo, debes acceder a su VALOR.
}
}
Por otro lado en la nueva escena harías lo siguiente, obviamente ya con la funcionalidad que quieras darle.
public class LoadUIBattle : MonoBehaviour {
GameManager gManager;
void Start () {
gManager = GameManager.gManager;
Debug.log(gManager.nombre);
Debug.log(gManager.clave);
}
}
Muchas gracias ya lo consegui, pero tengo una pequeña duda...
De esta forma que tu me has puesto tengo que crear otro objeto y añadirle un script con la clase LoadUIBattle, entonces para que me sirve no destruir el otro script? Yo pensaba que sin destruirlo no haria falta crear otro script, que desde ese mismo se podria hacer.
Que diferencia hay entonces entre destruirlo y no destruirlo si debes de crear otro script?
Seguramente se podria hacer todo con un script, no? O seria mejor hacerlo con dos por no liar tanto codigo...
Un saludo
A ver, el no destruirlo "lo tienes" pero ¿cómo y cunado lo usas?
Eso es el otro script, cuando lo tienes que usar, en algún momento quieres acceder esas variables creadas.
Lo que haces en el primer script es "crear una instancia estática del objeto" luego en el segundo accedes a ella.
Seguramente se podria hacer todo con un script, no? O seria mejor hacerlo con dos por no liar tanto codigo...
[/quote]
Si lo quieres hacer mal, si igual podrías. Si lo quieres hacer correctamente debes modulizar bien, es más en ese código que te pasé (que copie de algo que tengo antiguo en el curro) no debería heredar de MonoBehaviour, pero ya lo tenía así y era un ejemplo para que entendieras lo que hay que hacer.
Para lo que tú dices con poner ese script en un objeto ya te valdrá, porque si existe no se va a volver a crear, lo que es una muy mala práctica. Ya está en ti hacer lo que mejor te parezca.
Vale, muchas gracias tio.
Un saludo
es como pasear una estantería llena de libros cuando solo necesitas una página XD