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
Cita de: Ilie date=1398979213Perdona que se me pasaba
para usaro con unityscript creo que es suficiente con guardar los scripts dentro de las carpetas "Standard Assets" o "Plugins" y asi se compilaran antes y seran accesibles por cualquier script que este fuera de dichas carpetas esten en el lenguaje que esten.
Ya xD me he acordado despues, y una dudilla más que me ha surgido, si quiero eliminar el object creado por el pool en la escena sigo utilizando OnDestroy() ¿Verdad? ¿Para que sirve el Recycle? ¿Puedo utilizar este ultimo?

si quieres ELIMINARLO si, si quieres reciclarlo, es decir "guardarlo" para emplearlo en otra ocasion (que al final es de lo que se trata todo esto) empea recycle si lo que necesitas el liberar memoria, si, empea destroy, tenia intencion de preparar algo para regular la memoria empleada por el sistema pero sinceramente, no dispongo de tiempo para todo  y lo miramos xD


   Pain-T: A free FPS browser game




   http://www.paintemall.com




   




   Hilo en unity3d.com



Cita de: Ilie date=1398980028si quieres ELIMINARLO si, si quieres reciclarlo, es decir "guardarlo" para emplearlo en otra ocasion (que al final es de lo que se trata todo esto) empea recycle si lo que necesitas el liberar memoria, si, empea destroy, tenia intencion de preparar algo para regular la memoria empleada por el sistema pero sinceramente, no dispongo de tiempo para todo  y lo miramos xD
Oks muchisimas gracias!

Bueno primer problemilla, resulta que estoy intentando implementar el pool en mi proyectillo en 2d(para ver como funca el rendimiento en android), y He puesto a la hora de instanciar un game object esto: PoolManager.Spawn(Gameobject, posicion, rotacion) y me va perfecto. La cosa es a la hora de reciclar, que he puesto PoolItem.Recycle(this.gameobject); y no me funca me da este error:
 
 An instance of type 'PoolItem' is required to access non static member 'Recycle'.
 
He implementado mal el pool? gracias de antemano!

 

Mayo 02, 2014, 03:29:32 PM #34 Ultima modificación: Mayo 02, 2014, 03:30:45 PM por Ilie
no, Recicle() no es estatica, reciclas cada instancia en concreto.
es decir si tienes un objeto del tipo PoolItem miObjetoDelPool
 
haces miObjetoDelPool.Recycle();
 
estaticas solo tienes las de
PoolManager.RecyclePool("NombrePool");
PoolManager.RecycleAll();ç
 
que estan todas en la clase PoolManager


   Pain-T: A free FPS browser game




   http://www.paintemall.com




   




   Hilo en unity3d.com



Mayo 02, 2014, 03:30:37 PM #35 Ultima modificación: Mayo 02, 2014, 03:31:05 PM por thexicotet94
ostia... que fallo me mato ahora mismo Dx, muchisimas gracias @Ilie!!
 
P.D: Y yo mirando el código del PoolItem xD

Una pregunta más (espero que se la ultima D:), si yo utilizo para poolear PoolManager.Spawn(GameObject,posicion,rotacion) en vez de meter el objeto en el cuadro pools, puedo utilizar el Recycle() en el objeto creado? por que me da error
 
me dice que Recycle no es un miembro del game object


public static PoolItem Spawn(GameObject prefab, Vector3 position,Quaternion rotation){//...

Spawn te devueve un objeto del tipo PoolItem tu estas llamando a .Recycle() en el gameObject (supongo que en prefab)
lo que tienes que hacer es:
 
c#

PoolItem miObjeto=PoolManager.Spawn(prefab,pos,rot);
//...
miObjeto.Recycle();

Us

var miObjeto:PoolItem =PoolManager.Spawn(prefab,pos,rot);
//...
miObjeto.Recycle();


   Pain-T: A free FPS browser game




   http://www.paintemall.com




   




   Hilo en unity3d.com



Cita de: Ilie date=1399038134

public static PoolItem Spawn(GameObject prefab, Vector3 position,Quaternion rotation){//...

Spawn te devueve un objeto del tipo PoolItem tu estas llamando a .Recycle() en el gameObject (supongo que en prefab)
lo que tienes que hacer es:
 
c#

PoolItem miObjeto=PoolManager.Spawn(prefab,pos,rot);
//...
miObjeto.Recycle();

Us

var miObjeto:PoolItem =PoolManager.Spawn(prefab,pos,rot);
//...
miObjeto.Recycle();

Muchas gracias @Ilie!, si te pasas por calpe te invito a una caña minimo xDDDD, a ver si mañana lo pruebo que hoy he venido reventado del curro

Mayo 03, 2014, 01:49:44 PM #39 Ultima modificación: Mayo 03, 2014, 01:50:00 PM por thexicotet94
@Ilie pues lo he estado probando y no me funca, te cuento: Resulta que yo he hecho un script para que 3 tipos de meteoritos me salgan en 1 posicion aleatoria, entonces, donde en mi script ponia Instantiate, ahora he puesto el Spawn(). Ejemplo parecido a mi script:
 
if(numeroalea>0.3)
{
//Instatiate..lalalaa
PoolManager.Spawn(meteorito1, posicionarriba.position,rotacion.rotation)
}
 
//Es un fragmento parecido a mi script, es que ahora estoy fuera de casa y no tengo a mano el script si quieres luego te lo paso.
 
bien, la cosa es que me instancia un prefab meteorito que tiene un script en el cual hay un Destroy(). Para destruirlo puse: Destroy(this.gameobject). Y me funcionaba perfectamente. La cosa es que ahora, pongo this.gameobject.Recycle(), y no me funciona por que no lo ve como PoolItem D:

Mayo 03, 2014, 01:51:36 PM #40 Ultima modificación: Mayo 03, 2014, 01:53:17 PM por Ilie
pegame algo de codigo...
 
Recycle no es miembro en GameObject, esta en PoolItem


   Pain-T: A free FPS browser game




   http://www.paintemall.com




   




   Hilo en unity3d.com



Mayo 03, 2014, 05:13:38 PM #41 Ultima modificación: Mayo 03, 2014, 05:17:55 PM por Ilie
Pues nada, he subido alguna mejora/cambio mas,
 
ahora los pools siempre pueden ser dinamicos (se ha retirado la opcion de no permitirlos)
para instanciar usando directamente prefabs, el sistema se configura solo,  no es necesario tener añadido un Manager a la escena, si no existe se crea y configura con unas opciones bastante "todo terreno", evidentemente lo ideal es hacerlo a mano en funcion de las necesidades, pero "si se da el caso" ahi queda.
 
sobrecargas nuevas para ReParent en caso de que resize sea true reescala localmente el objeto al emparentaro.
 
Descarga donde siempre
https://github.com/euriarte/Unity-Simple-Pool" rel="external nofollow">https://github.com/euriarte/Unity-Simple-Pool


   Pain-T: A free FPS browser game




   http://www.paintemall.com




   




   Hilo en unity3d.com



Buah, no habia visto la nueva actualización! Ya la estoy probando, pero el pool este es magnífico @Ilie mi más sentida enhorabuena y muchas gracias!

Sé que el hilo tiene mucho tiempo pero creo que, ya que está con chincheta, es importante comentarlo por si a alguien le pasa lo mismo.
 
Lo primero decir que el componente es genial, sobre todo porque funciona bien hasta con los sistemas de partículas. Dicho esto, hay un bug importante en él, se puede reproducir de la siguiente forma:
 
Creas un pool en una escena y activas la casilla "Po***te On Start", ejecutas la escena y todo funciona bien. Pero si, sin parar la ejecución, cargas otra escena y luego vuelves a la escena del pool, este ya no funciona como debería, los pools no se cargan al iniciar y, aunque llamando a Spawn los objetos aparecen, estos ya no tienen el Parent por defecto.
 
Esto es debido a que se usan variables estáticas para los pools y para los flags de control, y estas siempre persisten entre escenas, independientemente de si se llama a DontDestroyOnLoad o no.
 
Le he hecho un ajuste al componente, he eliminado todas las variables estáticas y he convertido en singleton la clase PoolManager, para que se siga pudiendo acceder a ella desde cuelaquier parte, de esta forma se ha solucionado el problema.
 
Un saludo.

ok gracias, cuando pueda le echo un ojo. asi de primeras ( y de memoria) no entiendo muy bien a que puede se debido ya que entiendo que no deberia pasar, de todos modos lo miro y te voy comentando
 
Un saludo.


   Pain-T: A free FPS browser game




   http://www.paintemall.com




   




   Hilo en unity3d.com



Etiquetas: