Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Temas recientes

Posible bug de unity?

Iniciado por Anskari, Febrero 10, 2019, 09:23:25 AM

Tema anterior - Siguiente tema
Buenas,
 
llevo horas peleandome con una List, pues en el Start le decias print list.Count y me devolvia 10, pero al usar un public void botonTal le ponia print list.Count y me devolvia 0.
 
Bien, pues al final he descubierto que me estaba haciendo cosas raras, porque yo antes tenia ese Script en otra carpeta, y al moverla a la carpeta Scripts, aparentemente el boton seguia usando el void botonTal, seguia los cambios que yo le hacia, como por ejemplo si ponias print("hola") funcionaba, pero no estaba "conectado" con la parte del start y la lista existia pero seguia vacia, ya que esta la lleno al Start....en fin una cosa muy rara que como yo soy un novato no he llegado a comprender, pero me ha parecido interesante compartirlo con vosotros por si fuera un posible bug de unity. 
 
La solucion ha sido tan simple como volver a configurar el boton de 0. Pero dios, he perdido horas por culpa de esto.
 
Gracias.

Bonita historia, realmente emocionante, pero para poder decirte si es o no un bug deberías de:
 


  1.    Subir el código problematico en su version completa (no las líneas que te parecen que están mal).


  2.    Dar un contexto de como tenés todo configurado, inspector, jerarquia, la escena en gral, depende el caso, dar un pantallazo general de la situación (igual de importante que el código)


  3.    Especificar una lista completa de lo que esperás que haga, así te podemos decir si es fallo tuyo o un posible bug de Unity ... Spoiler: en el 99% de los casos es fallo del programador.


Además, lo que comentás está bastante enredado, hablas de script "conectado al start", que el botón "usa" el void, en general no importa donde se ubique el script (monobehaviour o clase C# generica, sí importa clases de Editor). Sería bueno que subas lo que te puse arriba así todos nos quitamos la duda de lo que pasó, y además te sirve para futuros problemas similares.
 
 
 
Saludos

Febrero 11, 2019, 06:34:19 AM #2 Ultima modificación: Febrero 12, 2019, 07:21:13 PM por pioj
Gracias por tu respuesta.
 
Analizando mis pasos encontre como consegui que fallara. Tiene sentido que deje de funcionar, pero esto me paso por querer empezar de 0 un proyecto, aprovechando las UI que ya tenia echas, pero mejorando los scripts.
 
Voy a hacer un simulacro de lo que hice,para que entendais.
 
 
 
Crear un nuevo script en la carpeta assets. Este:
 

using UnityEngine;
public class test : MonoBehaviour
{
    string stringTest;
    void Start()
    {
    }
 
    public void testBoton()
    {
        print(stringTest);
    }
}

 
Colocar el script en un gameobject llamado scripts. Asignar el testBoton a un boton de la escena y provar. El resultado es NULL. Bien.
 
Anadir la siguiente linia al start:
 



   
      void Start()
          {
              stringTest = "hola";
          }
   

[/quote]
 
Compilar y provar resultado. Ahora sera hola.
 
Ahora colocar el gameobject dentro de otro gameobject.
 
Provar y el resultado es NULL. Por mucho que cambies el start, el resultado siempre va a ser NULL.
 
Bueno pue es esto lo que me paso.  Gracias por todo.
 

 

Cita de: Anskari date=1549863259Colocar el script en un gameobject llamado scripts. Asignar el testBoton a un boton de la escena y provar. El resultado es NULL. Bien.
   


Hasta aca va bien, el null porque nadie (a no ser miembros o métodos privados de la instancia de la clase ) tiene acceso ni a asignado a la string, las strings por default son nulas (si no están inicializadas)
 
Cita de: Anskari date=1549863259Ahora colocar el gameobject dentro de otro gameobject.
   
   
      Provar y el resultado es NULL. Por mucho que cambies el start, el resultado siempre va a ser NULL.
   


Eso no se puede generalizar diciendo "Por mucho que cambies el start, el resultado siempre va a ser NULL". Justamente acá estás saliendo del código y dependes de la escena (estado de la jerarquía). En tu caso daría null probablemente porque el objeto no estaba activado, entonces Start nunca corría:
 


  •    OnEnable: corre cada vez que se activa el gameObject


  •    Awake : corre 1 vez, esté el gameObject activado o no


  •    Start corre 1 vez, cuando se activa el gameObject (1 OnEnable de una tirada)


Si el gameObject está activado al darle play el orden es : OnEnable -> Awake -> Start ... Probablemente en tu caso corra solamente Awake (probá cambiar Start por Awake y fijate que pasa)
 
La cosa es que el monobehaviour no llegaba a inicializarla, entonces te daba null. Por eso te decía arriba que el contexto es tan o más importante que el fallo que tengas, un simple gameObject desactivado (o quizás su padre/abbuelo/bisabuelo ,etc) puede hacer la diferencia entre resolver algo en 20 segundos o 2 días.
 
Cuando decís asignar el botón te referís a llamar al método public desde un botón UI no?
 
 
 
Saludos
 
 
 
 

Etiquetas: