Hola a todos! Como siempre que tengo tiempo libre le dedico un poco a Unity, hoy estaba haciendo diferentes clases y funciones del proyecto en el que estoy (este mes ). Bien pues he creado una clase Mina con un simple OnCollisionEnter, el jugador vuela un poco por los aires, cae, rueda un par de segundos y se incorpora, no funciona mal, la cuestión ahora es que me estaba preguntando si se os ocurre alguna manera de utilizar el mismo objeto en varias posiciones, como siempre intento ser lo más óptimo y se me ocurrió que una vez se usaba una mina podría "reutilizarla", pero resulta que no sabría que mina va a explotar primero, la mina es simplemente un quad de los primitivos de Unity con un script, alguna sugerencia?
Estas hablando de PoolObject, obvio que se puede. Busca en el foro existe un usuario llamado llie que estubo armando un sistema de PoolObject que funciona bastante bien! Aun que si te pones a pensar es super simple! Suerte!
Como la velocidad con el tocino xDEl PoolObject sirve para reutilizar el mismo objeto en situaciones que hay que instanciar el mismo objeto (valgame la redundancia) un gran numero de veces y que este tiene un ciclo de vida muy corto. Por ejemplo en disparos, "particulas" en juegos del tipo voxeles, etc.
Explicado para "tontos", lo que hace el PoolObject no es otra cosa que cuando un objeto llega al final de su ciclo de vida, lo resetea a sus valores iniciales para aprovechar el mismo y no tener que instanciar otro objeto nuevo y de este modo ahorrar recursos.
@juanma_teso si lo que quieres es instanciar distintos objetos (minas) por una superficie, no te queda otra que instanciarlos sin mas ... no se me ocurre ninguna tecnica para optimizar este punto. Utilizar un prefab es lo maximo que puedes hacer me da la sensacion a mi.
@Arthure (//<___base_url___>/profile/26665-arthure/), Fíjate que con mas cuidado en lo que dice el usuario
se me ocurrió que una vez se usaba una mina podría "reutilizarla", pero resulta que no sabría que mina va a explotar primero[/quote]Claramente, esta situación necesita PoolObject.
ya he visto lo que dice el usuario, pero no me he limitado a una palabra (que encima la pone entre comillas) si no a lo que dice que quiere conseguir ... si defiendes que necesita claramente un PoolObject, bien por ti pero explicale el resultado que tendria y despues piensa si es lo mismo que el quiere.Con un PoolObject tendria X numeros de minas que estarian continuamente "destruyendose" y apareciendo; ese es el objetivo de un PoolObject, en ese proceso es donde se aprovecha esta tecnica porque lo hace ahorrando muchos recursos. Y dudo que sea ese el objetivo, porque no quedaria muy bonitoSi lo que quieres es estanciar X numero de minas pero que van a estar ahi esperando hasta que exploten pues es una tonteria utilizar un PoolObject porque no va a estar haciendo ningun servicio. Pero cada uno ...
Sin meterme en piscina/no piscina, @juanma_teso (//<___base_url___>/profile/26011-juanma_teso/) para saber cual va a explotar primero, deberías tener un "manager" de todas las minas que es el que las instancia (del modo que sea) y recoge todos las OnCollisionEnter. Como entiendo que las minas serán objetos "tuyos" no solamente un gameObject, lo lógico es tener el OnCollisionEnter en tu objeto mina y luego delegates también. En el manager de minas recoges todos los delegates y pasas como parámetro tu objeto mina en el delegate. En el momento que "explote" y se active el OnCollisionEnter el "manager" recibirá que mina ha explotado.
@Arthure (//<___base_url___>/profile/26665-arthure/) estas un poco errado en el concepto de
PoolObject.Te explico:
1 - PoolObject no solo sirve para X numero de objetos, si no que puedes tener un Buffer Dinámico para que este se ajuste a la tarea.
2 - La Principal ventaja de utilizar PoolObject es evitar que el recolector de basura se ejecute mientras jugamos, ocasionando Bajas de FPS u ocasionando el cierre de la aplicación.
3 - PoolObject puede ser utilizado en muchas situaciones, no solo donde se disparen 20 Objetos por segundo, Ejemplos: UI, Personajes .. Etc. Saludos -.
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35050" data-ipsquote-contentcommentid="126714">Sin meterme en piscina/no piscina,
@juanma_teso para saber cual va a explotar primero, deberías tener un "manager" de todas las minas que es el que las instancia (del modo que sea) y recoge todos las
GameObject o su InstaceID para identificar que objeto es el afectado.Contesto, por que justo estaba escribiendo esto, mientras me llego gente al Trabajo y no puede enviar la respuesta!
[quote author=francoe1 date=1454422876" data-ipsquote="" data-cite="francoe1" class="ipsQuote">
Título: Un objeto en varias posiciones.
Publicado por: francoe1 en Febrero 02, 2016, 03:55:46 PM
@Arhure Te cite por el siguiente comentario, que fue directamente dirigido a mi persona!
Como la velocidad con el tocino xD[/quote]Lo afirma tu respuesta en concreto.
Mi intención no es molestar, pero me molesta que comente innecesariamente tratando de dar como errada mi respuesta, quizás no es la mas acertada, pero podrías dar tu una respuesta mas relacionada a la intención del usuario sin necesidad de citar mis Respuesta o Sugerencia.Te pido disculpas, pero de verdad no creo saber mas que nadie, todos los días se aprende algo nuevo.
Pues si te das por aludido ... pero en ningun momento te nombre, ni cite ningun comentario tuyo, ni hice nada que provocara que te saliera una alerta. Si estas pendiente de lo que dicen, de lo que gustan tus comentarios o dejan de gustar, sinceramente es tu problema pero no hace falta que me nombres por eso.Y si quieres poner un comentario quejandote, lo pones sin hacer nada para que me salte alerta (citar mi nombre con @ o hacer quote de algun comentario mio) y veras que yo no me dare por aludido aunque sepa que te diriges a mi. Cuando doy un consejo, sea mejor o peor, lo hago por el gusto de intentar ayudar en lo que buenamente pueda desde mi escaso conocimiento y no para que me digan lo grande que soy ... y si recibo un dislike no me veras quejandome. Por lo tanto me gustaria disculparme, pero tampoco creo que haya ninguna razon.No obstante, aconsejo a juanma utilizar el PoolObject porque es lo que mejor se adapta a la situacion que describe ... con eso no se si ayudo al compañero que pedia consejo, pero ayudo a otro compañero con otro "problema", por lo tanto estoy igual de contento
Un día habrá que quedar todos para solventar estos problemas a la manera primitiva!!!!!O sea, un Doom en red!
Suerte que yo no llevo dos días en el foro y sé cómo nos lo tomamos. Para aclarar sobre la duda y sobre pool / no pool (que yo tampoco lo tengo claro) voy a poner exactamente lo que he hecho y lo que intento conseguir, por si no hubiera quedado claro.Lo que he hecho: un GameObject (quad de unity) con un script en el que implemento OnCollisionEnter y llamo una función del Jugador, simple.Lo que quiero conseguir: Otro Jugador es quien pone las minas, donde él quiera, no sabré dónde las pone ni cuantas, lo que sí sé es que una vez explote es mina no se volverá a usar, por lo que me sabe mal tener que instanciar 500 minas (exagerando, pero que se puede dar) si sólo se va a usar una al mismo tiempo.Eso sí, gracias a los tres por el tiempo dedicado
[quote author=iRobb" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35050" data-ipsquote-contentcommentid="126714">Sin meterme en piscina/no piscina,
@juanma_teso para saber cual va a explotar primero, deberías tener un "manager" de todas las minas que es el que las instancia (del modo que sea) y recoge todos las OnCollisionEnter. Como entiendo que las minas serán objetos "tuyos" no solamente un gameObject, lo lógico es tener el OnCollisionEnter en tu objeto mina y luego delegates también. En el manager de minas recoges todos los delegates y pasas como parámetro tu objeto mina en el delegate. En el momento que "explote" y se active el OnCollisionEnter el "manager" recibirá que mina ha explotado.[/quote]Esto lo tengo pensado, en plan un manager que me instancie los diferentes objetos que existan (torretas, minas, muros...) en las coordenadas que le pasen, pero lo de los eventos no lo he conseguido asimilar bien, y eso que
Título: Un objeto en varias posiciones.
Publicado por: Arthure en Febrero 02, 2016, 05:00:51 PM
@juanma_teso si cuando explote una mina no la vas a utilizar de nuevo ... retiro lo dicho, no te sirve para nada el PoolObject. Por otro lado, da igual que solo utilices un objeto al mismo tiempo; miralo como si fuera una escena donde hayan varios personajes con los que puedas hablar ... solo podras hacerlo con uno al mismo tiempo, pero todos estaran ahi.Pero por como lo describes, parece que estes intentando hacer algo semejante al juego "hundir la flota": un jugador pone las minas y tu no las ves, puede tratarse de adivinar donde las ha colocado (que seria clavado al juego que menciono) o que tuvieras que moverte sin tocarlas (que seria exactamente lo contrario al juego que menciono) pero en ambos casos existe un factor comun,
tu no ves las minas.
Eso tiene muy facil optimizacion ... no instanciar ningun objeto !public ControladorMinas : Monobehaviour {
public Vector3 [] minas;
public float radio;
public Vector3 Comprobar (int layer) {
foreach (Vector3 mina in this.minas)
if (Physics.OverlapSphere (mina, radio, layer).Length != 0) return mina;
return null;
}
}Con ese script ya tienes un sistema para manejar las minas sin necesidad de tener que instanciar ninguna. Lo unico que necesitaras es indicar las posiciones de las minas y el radio que tendran estas. Despues, desde cualquier script solo tendras que llamar a la funcion Comprobar () pasandole como parametro el layer del jugador y en el caso de que hayas tocado alguna mina, te devolvera la posicion donde se encuentra la mina ... y en caso de que no hayas tocado ninguna mina el resultado sera Null.
public ControladorJugador : Monobehaviour {
private ControladorMinas minas;
public GameObject prefabExplosion;
private void Start () {
this.minas = GameObject.Find ("gameobjectQueTengaControladorMinas").GetComponent<ControladorMinas> ();
}
private void Update () {
Vector3 explosion = this.minas.Comprobar (this.layer);
if (explosion != null) Instantiate (prefabExplosion, explosion, Quaternion.identity);
}
}Con este script, estaras comprobando en todo momento si has tocado alguna mina y en caso afirmativo entoces instanciara una explosion en la misma posicion donde estuviera esa mina.
Despues, evidentemente puedes optimizarlo por ejemplo, que en vez de comprobar en cada frame solo lo haga despues de moverse el jugador ... eso ya va segun tus necesidades.
P.D.1. Una de las mejores formas de optimizar el rendimiento, es no instanciar algo que no vayas a necesitar ... ahorraras mucho en consumo.
P.D.2. Si hubieras explicado mejor desde el principio, no se habria montado ... que siempre me veo envuelto en fregados jajajajaja
[quote author=juanma_teso" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35050" data-ipsquote-contentcommentid="126736">Suerte que yo no llevo dos días en el foro y sé cómo nos lo tomamos. Para aclarar sobre la duda y sobre pool / no pool (que yo tampoco lo tengo claro) voy a poner exactamente lo que he hecho y lo que intento conseguir, por si no hubiera quedado claro.Lo que he hecho: un GameObject (quad de unity) con un script en el que implemento OnCollisionEnter y llamo una función del Jugador, simple.Lo que quiero conseguir: Otro Jugador es quien pone las minas, donde él quiera, no sabré dónde las pone ni cuantas, lo que sí sé es que una vez explote es mina no se volverá a usar, por lo que me sabe mal tener que instanciar 500 minas (exagerando, pero que se puede dar) si sólo se va a usar una al mismo tiempo.Eso sí, gracias a los tres por el tiempo dedicado Esto lo tengo pensado, en plan un manager que me instancie los diferentes objetos que existan (torretas, minas, muros...) en las coordenadas que le pasen, pero lo de los eventos no lo he conseguido asimilar bien, y eso que
Título: Un objeto en varias posiciones.
Publicado por: ACarranza en Febrero 02, 2016, 05:27:28 PM
llegue tarde al party, companieros foreros, habran su propio tema para discutir terminos y conceptos y quien lava la ropa y quien hace comida...constestando a laprefunta original:yo lo que hacia para reutilizar los objetos usaba 2 metodos 1: una sola carga al principio:cargaba digamos 10 mariposas en una lista, esas mariposas se mueven en diferentes posiciones y desaparecen en diferentes tiempos, pero solo las cargaba y las mantenia inactivas con setActive(false), al prenderlas en la posicion que yo queria , tambien activaba una funcion reset para reiniciar todas las variables en al nueva posicion, al querer activar una nueva mariposa checaba en la lista que mariposa estaba desactivada y la volvia a resetear. cuando las 10 mariposas por alguna razon estuvieran activadas al mismo tiempo y quisiera activar una nueva, no se podia puesto ya estaba el limite. 2. carga dinamica controlada:cada vez que necesitaba una mariposa, la cargaba en la lista, y se activaba cuando desaparecia se desactivaba para reutilizarse mas tarde, entonces si en la lista al querer utilizar una nueva mariposa y hubiera alguna desactivada, se activaba y se reseteaba, cuando queria usar alguna y todas estaban activadas, creaba una nueva y la agregaba a la lista y mismo procedimiento, hasta alcanzar el limite que yo queria... en fin necesitariamos mas datos para saber como ayudarte realmente.plantea mejor tu logica de tu problema saludos
Eso se me ocurrió después @Arthure (//<___base_url___>/profile/26665-arthure/), tener sólo las posiciones de las minas, seguramente lo implemente así, según vea si me renta dejar pistas de dónde están las minas o no, el único problema es que no usaría los eventos OnCollision sino que estaría revisando la posición cada X y no me fío porque el movimiento es libre, no por casillas, de momento lo dejaré así para seguir avanzando.Oye que yo lo intenté @iRobb (//<___base_url___>/profile/27231-irobb/), pero si no me da, no me da
[quote author=juanma_teso date=1454448934" data-ipsquote="" data-cite="juanma_teso" class="ipsQuote">Eso se me ocurrió después
Sólo texto | Texto con Imágenes