Noticias

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

problemillas con DontDestroyOnLoad

Iniciado por Kvashir, Abril 29, 2017, 08:00:03 PM

Tema anterior - Siguiente tema
Abril 29, 2017, 08:00:03 PM Ultima modificación: Abril 29, 2017, 08:43:05 PM por pioj
necesito un objeto que pase de una escena a otra (programo en C#) y lo normal en unity es usar el método 
 
"DontDestroyOnLoad" , eh visto miles de tutoriales para ver si encuentro la solución a mi problema, ya que parece que  nadie mas le esta pasando ( excepto a un giri que tambien le ocurre). 
 
el problema es que al usar el método dontdestroyonload, el objeto que contiene ese método lo que hace es crearse una escena y quedarse el solo en ella, no puedo consultar infomración de ese objeto porque esta en otra escena diferente (se que se puede buscando por la escena y indicandole que objeto buscas) pero yo quiero que este en la misma escena. 
 
adjunto capturas (la escena dontdestoyonload se crea nada mas al darle al play en unity, aunque no este pasando a la siguiente escena)
 
(es un ejemplo con un proyecto nuevo sin nada para descartar posibles errores pero sigue funcionando igual) 
 
el codigo es el de siempre, como es una prueba solo tengo esto en el objeto que quiero que no se borre:
 

using UnityEngine;
using System.Collections;
public class musicaInfinita : MonoBehaviour
{
    void Awake()
    {
        DontDestroyOnLoad(this);
    }
}
 
Y tengo esto en el boton para pasar a la escena
 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Button : MonoBehaviour {
    public void click()
    {
        SceneManager.LoadScene("Login");
    }
}

 

 

Hola, primero decirte que DDOL toma de argumento un Object, es decir que puede ser un componente, un gameObject, etc. Lo que le estas pasando de argumento con el "this" es una referencia al componente "musicainfinita", si queres que el gameObject sobreviva pone "gameObject" de argumento, aunque si te anduvo ya está, supongo.
 
Yo los objetos que sobreviven de escena a escena (generalemte son managers) los tengo previamente hechos singleton, instancias unicas estaticas que puedo llamar desde cualquier lado. Tengo pocos logicamente, dos o tres como mucho. No se si eso es el resultado final que queres, la verdad nunca me preocupe en buscar objetos de otras escenas, siiempre pense que el Find funcionaba perfectamente aun en multiples escenas, tendre que investigar un poco.

perdón, ya lo solucioné, lo que no sabía como borrar el post (se puede?) 
 
aunque tenga this o tenga gameObject funciona exactamente igual. 
 
el problema era que no quería usar 
 
GameObject.Find("nombredeobjeto").GetComponent<nombre del script>();
 
sinó cojer el objeto directamente con una variable pública y así ahorrarme buscar el objeto ya que consume muchísimo mas cuanto mas objetos tengas en la escena actual
 
 
 
De todas formas, muchísimas gracias por contestar, veo que eres uno de los mas veteranos y activos del grupo :) 
 
estaras cansado de ayudar a ignorantes como yo jajaj

Cita de: Kvashir date=1493502211el problema era que no quería usar 
   
   
      GameObject.Find("nombredeobjeto").GetComponent<nombre del script>();
   


Bueno esa es la idea del singleton, los usas en esos objetos que sabes que son unicos y que cada dos segundos los vas a referenciar y claro no queres que te quede todo el chorizo de codigo, accederias algo asi si, por ejemplo Player fuera un singleton:
 

Player.instance
Vs
GameObject.Find("Player").GetComponent<Player>();

 
 
 
Cita de: Kvashir date=1493502211veo que eres uno de los mas veteranos y activos del grupo :) 
   
   
      estaras cansado de ayudar a ignorantes como yo jajaj
   


Jajaj veterano ni en la vida ni en el foro, hace 6 meses maso que estoy ajaj. La mayoria de las veces la ayuda resulta bidireccional porque la idea es investigar antes, por ende aprender del tema en cuestion.
 
saludos

eh echo algo muchísimo mas complicado que esto y tenía que buscar entre mas de 600 objetos y el
 
GameObject.Find("nombredeobjeto").GetComponent<nombre del script>();
 
era excesivamente lento, al final usé un Dictionary en C# (TreeMap en java) que añadía los objetos a la vez que los instanciaba, para tener todos los objetos bien accesibles y la diferencia de tiempo fue brutal.
 
por eso me estaba frustrando con esta tonteria de DontDestroyOnLoad jajaja

hola como puedo hacer que unos objetos sigan en cada escena al personaje son por ejemplo la barra de vida y eso por no estar creándolas en cada escena supongo que con eso de  DontDestroyOnLoad se puede pero no lo entiendo muy bien trabajo con js no se si hay se puede hacer....
 
gracias un saludo

Etiquetas: