Noticias

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

[APORTE] Object Pool

Iniciado por Ilie, Enero 06, 2014, 06:57:20 AM

Tema anterior - Siguiente tema
Gracias, supongo que podrás arreglarlo de una forma más eficaz ya que sabes mejor como está montado todo el tema. Por si te sirve de ayuda:
 
La clase PoolManager tiene una variable estática llamada "started" que se comprueba en el método Init de la clase Pool para cargar los diferentes pool, aquí:

if(PoolManager.instance.po***teOnStart && !PoolManager.started){
while(items.Count<size)   AddItem();
}

La segunda vez que vas a la escena, la variable "started" sigue a true. Ponerla a false al principio del método Awake soluciona el que no se cargen los pools al inicio. Sin embargo, no he llegado a descubrir por qué luego no hace uso de estos items, al llamar a Spawn instanciaba otros nuevos en la raiz de la jerarquía. Eso me ha llevado a quitar el static a las colecciones de PoolItem, para asegurar que nada persiste entre escenas.
 
Un saludo.

solo para que me quede claro, tienes definidos los parent en elementos de la escena, entonces cuando cambias de escena esos elementos se destruyen, y al volver a la primera escena no te los identifica de nuevo, si es asi, si es un fallo de diseño. me lo apunto para solucionarlo manteniendo la compatibilidad


   Pain-T: A free FPS browser game




   http://www.paintemall.com




   




   Hilo en unity3d.com



Octubre 20, 2014, 12:34:43 AM #47 Ultima modificación: Octubre 20, 2014, 12:36:19 AM por Ilie
Fijado. (creo)
eso y un fallito que me he encontrado mientras buscaba


   Pain-T: A free FPS browser game




   http://www.paintemall.com




   




   Hilo en unity3d.com



Octubre 20, 2014, 01:16:39 PM #48 Ultima modificación: Octubre 20, 2014, 01:19:04 PM por kaito
He creado una Pila de Objetos utilizando un Dictionary, que genera  automáticamente Listados de GameObject por tipos (proyectiles, particulas, etc.... )
 
Solo necesitamos utilizar la función Spawn (y no destruir los objetos, solo desactivarlos).
 
Si le queréis echar un vistazo http://creacionvideojuegos.foroactivo.com/t97-pila-de-objetos-object-pool" rel="external nofollow">PILA de Objetos - Object Pool
 
Crear objetos por demanda, es decir, detectar si se encuentra algun objeto desactivado en la pila, y sino instancia uno nuevo.

Genial, un aporte muy bueno, gracias.

Octubre 22, 2014, 02:56:12 AM #50 Ultima modificación: Octubre 22, 2014, 03:00:35 AM por Asylum
buen aporte!!! este enlace explica un simple object pool muy sencillo para los que no tienen idea de que se trata y como hacerlo:
t=34" rel="external nofollow">
t=34

muy buen aporte solo tengo un problema , leí por ahí arriba a otro que le pasaba lo mismo pero no le disteis solución y llevo peleándome con el tema desde hace una hora, el spawn me va de maravilla  y el recicle en masa también pero me esta siendo imposible reciclar un único objeto básicamente porque el metodo "Recycle();" no existe.He creado un pool con el prefab "Rectangulo" si pongo el reciclepool me borra todos los rectangulos de la pantalla y puedo volver a ponerlos sin problemas, pero para reciclar un solo Rectangulo he intentado de todo, PoolItem.Recycle();  this.Recycle(); Rectangulo.Recycle(); y nada ¿como debería hacerlo?

Puedes pegarme el código


   Pain-T: A free FPS browser game




   http://www.paintemall.com




   




   Hilo en unity3d.com



Febrero 11, 2015, 03:10:47 PM #53 Ultima modificación: Febrero 11, 2015, 03:17:34 PM por dr4
claro, al final lo dejé asi,  hago que el rectángulo sea false cuando hago click porque el Recycle(); simplemente no existe, el problema que le veo a esto es que antes de recuperar los rectangulos que están como false crea un nuevo rectangulo y después empieza a coger los desactivados, así que cada vez que desactivo un rectángulo en lugar de simplemente ponerme el desactivado me pone un rectangulo nuevo primero.  como se supone que hago esto con Recycle? el objeto dentro del pool se llama "Rectangulo".
 
 
 
//destruye el rectangulo cuando el raton esta encima y el boton de borrar está activado
if (Input.GetMouseButtonDown (0) && boton == true && encima==true) {
 
            //al borrar enviamos una notificacion al generador de rectangulo sino no sabrá que hemos salido del rectangulo para poder crear mas
            NotificationCenter.DefaultCenter().PostNotification(this, "Borrado");
            
                RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
 
                if (hit.collider != null)
                {
//convierto un rectangulo en false a falta de no poder reciclarlo
                    if (hit.collider.gameObject == gameObject) {this.gameObject.SetActive(false);  }
                 
 
                }
            }

Febrero 11, 2015, 03:21:44 PM #54 Ultima modificación: Febrero 11, 2015, 03:25:03 PM por Ilie
seria algo asi.
asumo que ese codigo esta en un componente de Rectangulo pero fuera de PoolItem

if (Input.GetMouseButtonDown (0) && boton == true && encima==true) {
 
            //al borrar enviamos una notificacion al generador de rectangulo sino no sabrá que hemos salido del rectangulo para poder crear mas
    NotificationCenter.DefaultCenter().PostNotification(this, "Borrado");
           
    RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
    if (hit.collider != null)
    {
//convierto un rectangulo en false a falta de no poder reciclarlo
        if (hit.collider.gameObject == gameObject) {
//AQUI
        GetComponent<PoolItem>().Recycle();
        //this.gameObject.SetActive(false);  
    }
                 
 
                }
            }

EDITO: seria recomedable asignar el componente PoolItem a una variable ya que la idea es que esto se ejecute muchas veces y GetComponent es "bastante" caro


   Pain-T: A free FPS browser game




   http://www.paintemall.com




   




   Hilo en unity3d.com



así funciona si, pero estoy viendo que el comportamiento es exactamente el mismo que simplemente desactivándolos como estaba haciendo al principio no? de todas formas muchas gracias por tu esfuerzo, esto es realmente util

Febrero 11, 2015, 04:15:26 PM #56 Ultima modificación: Febrero 11, 2015, 04:16:43 PM por Ilie
Lo que hace PoolItem es desactivarlo y reiniciar particulas y sonidos por defecto, en cualquier caso puedes extender esta clase (hay un ejemplo por ahi) que creo recordar que modifica velocidades del rigidbody, en pocas palabras puedes preparar los objetos para ser respawneados como te de la gana
y del mismo modo puedes personalizar como iniciarlo usando una unica instruccion


   Pain-T: A free FPS browser game




   http://www.paintemall.com




   




   Hilo en unity3d.com



perfecto gracias, solo una duda, no sé mucho sobre el tema de carga, ¿Tener por ejemplo 30 objetos desactivados en un juego es realmente menos "peso" que haber creado esos 30 objetos y haberlos destruido? no sé hasta que punto tiene que arrastrar el juego con esos objetos que están ahí desactivados ¿O al estar desactivados es como si no estuvieran? me refiero a nivel de carga y optimización

el principal problema y por lo que se usan estas cosas es el recolector de basura, una vez que destruyes un objeto este es digerido por el recolector, en principio esta muy bien optimizado pero cuando empieza a sobrecargarse (memoria) se atasca y hace que el juego vaya a tirones, si vas a destruir pocos objetos por segundo lo mas posible es que no te haga falta, pero el tenerlos cargados tampoco consume demasiados recursos, evidentemente depende del objeto que poolees no es lo mismo almacenar una bala que un edificio entero.


   Pain-T: A free FPS browser game




   http://www.paintemall.com




   




   Hilo en unity3d.com



El cross road usa prácticamente lo mismo

Etiquetas: