Noticias

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

RPG cloth system

Iniciado por leocub58, Agosto 02, 2017, 01:31:52 AM

Tema anterior - Siguiente tema
Agosto 02, 2017, 01:31:52 AM Ultima modificación: Agosto 02, 2017, 01:32:04 AM por leocub58
Buenas, estoy pensando en hacer un sistema de ropa para un minijuego que estoy haciendo, el sistema lo intento copiar de los RPG típicos, una casilla donde pones la ropa y listo. La pregunta no es cómo hacerlo, sino ¿cual es la mejor manera de hacerlo?
 
Mi primera idea fue activando/desactivando unas mallas que estén riggeadas encima del personaje.
 
La segunda que se me ocurrió fue instanciando la malla.
 
La tercera y última es que la malla esté por separada y recortada unida a cada uno de los rigs del esqueleto, para al moverse que se muevan estos cachitos de la armadura o ropa.(Descartada por lo horrendo que queda).
 
 
 
Ahora, el problema que encontré con la primera idea es que tengo que tener todas las mallas de todas las ropas que ponga encima del personaje desactivadas, no se hasta que punto esto consume recursos y si es una buena idea.
 
El problema que tengo en el segundo caso es que hace un parpadeo cuando se instancia para colocarse a la animación, a demás de tener que destruir los objetos cuando te pones otras prendas. 
 


No sé si me expliqué bien, en caso afirmativo espero que sepáis aconsejarme correctamente, un saludo.

los gameobject q desactivas no consumen procesamiento pero si memoria, y todo lo q cargas en escena toma un poco de tiempo
 
en lo posible es mejor reutilizar objetos q destruirlos, lo q se llama object pooling
 
entonces si no son muuuchas prendas es mejor desactivarlas

Ja estaba por decir eso mismo, un claro ejemplo de object pooling, yo me quedo con la opcion 1, aunque nunca invenstigue como funciona un sistema de este tipo, un buen juego para echarle el ojo seria fallout4.

Agosto 02, 2017, 10:11:33 AM #3 Ultima modificación: Agosto 02, 2017, 10:12:24 AM por Arthure
Hola @leocub58,
 
Yo optaria por la 2ª opcion con los ojos cerrados sin dudarlo ... mas que nada porque tener instanciados los objetos de la ropa e ir activando / desactivando segun vayas equipando en el inventario me parece super cutre, la cosa menos elegante que te puedas echar a la cara. Es como el tipico tutorial de principiante que se veia hace años sobre hacer un shooter y el tema armas estaba realizado con el mismo metodo (solo tenias que fijarte que el que hablaba era un niño de 10 años).
 
El object pooling es un metodo que, como dicen @lightbug, va genial y mejora mucho el rendimiento de un juego pero como con todo, su efectividad se nota si se utiliza para lo que esta diseñado ... nadie dudaria que un bazooka tiene una efectividad excelente como arma mortifera pero no por eso es buena idea utilizarlo para matar moscas
 
Por ejemplo si se trataran de projectiles (que vas a instanciar quizas 10 cada segundo) te mejorara el rendimiento mucho, pero si vas a instanciar una armadura cada cuanto ? Cada 5 o 10 minutos o tal vez un par de veces en toda la partida el object pooling no te va a hacer nada en absoluto, todo lo contrario.
 
Por eso yo optaria por la 2ª opcion ... y pensaria soluciones para evitar los problemas o inconvenientes que te puedan surgir derivados de la eleccion. Una manera sencilla, por ejemplo, es que el canvas del inventario oculte al personaje cuando este abierto (cosa de diseño, esto sucedera el 100% de los casos si se trata de un proyecto para dispositivo movil) y no se realicen las operaciones en el momento de poner una prenda de ropa en su casilla correspondiente sino en el momento de cerrar el inventario. La idea seria la siguiente por pasos :
 


  •    Abro el inventario, el canvas esta diseñado para que oculte al personaje.


  •    Hago los cambios que desee, equipando / desequipando los objetos.


  •    En el momento de aceptar los cambios, antes de cerrar el inventario, destruyo o instancio los objetos segun convenga para que el personaje se corresponda con la informacion del inventario.


  •    Oculto el inventario.


Con eso te evitas tener que instanciar / destruir objetos muchas veces y ademas, como el personaje estara oculto por el inventario no se vera ningun parpadeo en el momento de instanciarse.

Cita de: Arthure date=1501661493Hola @leocub58,
   
   
      Yo optaria por la 2ª opcion con los ojos cerrados sin dudarlo ... mas que nada porque tener instanciados los objetos de la ropa e ir activando / desactivando segun vayas equipando en el inventario me parece super cutre, la cosa menos elegante que te puedas echar a la cara. Es como el tipico tutorial de principiante que se veia hace años sobre hacer un shooter y el tema armas estaba realizado con el mismo metodo (solo tenias que fijarte que el que hablaba era un niño de 10 años).
   
   
      El object pooling es un metodo que, como dicen @lightbug, va genial y mejora mucho el rendimiento de un juego pero como con todo, su efectividad se nota si se utiliza para lo que esta diseñado ... nadie dudaria que un bazooka tiene una efectividad excelente como arma mortifera pero no por eso es buena idea utilizarlo para matar moscas
   
      Por ejemplo si se trataran de projectiles (que vas a instanciar quizas 10 cada segundo) te mejorara el rendimiento mucho, pero si vas a instanciar una armadura cada cuanto ? Cada 5 o 10 minutos o tal vez un par de veces en toda la partida el object pooling no te va a hacer nada en absoluto, todo lo contrario.
   
   
      Por eso yo optaria por la 2ª opcion ... y pensaria soluciones para evitar los problemas o inconvenientes que te puedan surgir derivados de la eleccion. Una manera sencilla, por ejemplo, es que el canvas del inventario oculte al personaje cuando este abierto (cosa de diseño, esto sucedera el 100% de los casos si se trata de un proyecto para dispositivo movil) y no se realicen las operaciones en el momento de poner una prenda de ropa en su casilla correspondiente sino en el momento de cerrar el inventario. La idea seria la siguiente por pasos :
   
   


  •          Abro el inventario, el canvas esta diseñado para que oculte al personaje.
          

  •       

  •          Hago los cambios que desee, equipando / desequipando los objetos.
          

  •       

  •          En el momento de aceptar los cambios, antes de cerrar el inventario, destruyo o instancio los objetos segun convenga para que el personaje se corresponda con la informacion del inventario.
          

  •       

  •          Oculto el inventario.
          

  •    

      Con eso te evitas tener que instanciar / destruir objetos muchas veces y ademas, como el personaje estara oculto por el inventario no se vera ningun parpadeo en el momento de instanciarse.
   


Totalmente de acuerdo, es una cutrez, me pondré con la 2º opción. Gracias por la idea de ocultar el personaje mientras se cambia la ropa, no lo  había pensado.

Si las armaduras no tienen colisión, por que no cargar la malla a MeshRenderer, y los materiales correspondientes, eso desde mi punto de vista seria lo mejor.

Cita de: francoe1 date=1501682350Si las armaduras no tienen colisión, por que no cargar la malla a MeshRenderer, y los materiales correspondientes, eso desde mi punto de vista seria lo mejor.
   


¿Es viable eso? Si no te he entendido mal, hacer una mesh con los rigs y en esta poner la ropa/armadura cambiando el mesh renderer. Pero ¿ésta cogería los rigs?

Cita de: francoe1 date=1501682350Si las armaduras no tienen colisión, por que no cargar la malla a MeshRenderer, y los materiales correspondientes, eso desde mi punto de vista seria lo mejor.
   


Eso esta genial, pero me parece que todas las mallas que tienen un skin tienen un skinned mesh renderer, y una de las variables de ese componente son los bones: https://docs.unity3d.com/ScriptReference/SkinnedMeshRenderer.html asi que en teoria si usas los mismos bones (lo cual es lo correcto) deberia funcionar sin problemas. Es mejor que andar instanciado, lo unico que haces es cargar el recurso (mesh data) con Resources.Load supongo.
 
 

Cita de: lightbug date=1501709283Eso esta genial, pero me parece que todas las mallas que tienen un skin tienen un skinned mesh renderer, y una de las variables de ese componente son los bones: https://docs.unity3d.com/ScriptReference/SkinnedMeshRenderer.html asi que en teoria si usas los mismos bones (lo cual es lo correcto) deberia funcionar sin problemas. Es mejor que andar instanciado, lo unico que haces es cargar el recurso (mesh data) con Resources.Load supongo.
   
   
       
   


Claro, deberias de poner todos los ítems dentro de la carpeta Resources, luego, como dices Resources.Load(); cargas la malla y los materiales. Lo hice en varios proyectos, es algo bastante utilizado, y va con uno de los conceptos de diseño, "NO MEZCLAR LÓGICA CON GRÁFICA"... 
 
Pero no siempre es compatible con todos lo proyectos, pero evita bajo todo concepto la activación o instanciación de modelos.

creo q todo lo q pones en resources se carga al iniciar el juego, entonces toma mas tiempo para q inicie si tienes muchas cosas, q ademas van a quedarse en memoria

Cita de: Braltor date=1501713982creo q todo lo q pones en resources se carga al iniciar el juego, entonces toma mas tiempo para q inicie si tienes muchas cosas, q ademas van a quedarse en memoria
   


Todos los resources se serializan en un solo gran archivo serializado, mientras mas incluyas es logico que mas grande va a ser (por eso lo ideal es poner solo los que usas siempre), pero si tuviera que instanciar prefabs enteros los datos a serializar serian mas grandes, estaria un poco peor hablando de memoria, y en performance estaria instanciando objetos directamente vs solo modificando un componente agregando el mesh.

Esta muy bien este post, tengo que investigar mas, siempre habia usado el metodo numero 1, todas las mallas (ropas) estaban ya en el personaje, solo que desactivadas, porque como tenian que tener los mismos bones... Y entonces activaba/desactivaba la ropa que correspondiera
 
Sabia que era una cutrez, muy mal hecho, siempre me parecia que asi no se hacia pero hay tantas cosas que investigar en esto de la programacion que simplemente lo posponia diciendo "bueno, lo dejo asi provisionalmente", pero LIGHTBUG me ha mostrado el camino, ahora estoy con un proyecto que no necesita esa funcionalidad, pero para el proximo proyecto que utilize "ropas" me lo investigare bien para hacerlo como es correcto

Lo de braltor es un punto a resolver..
 
https://unity3d.com/es/learn/tutorials/temas/best-practices/resources-folder
 
Se podría utilizar una carpeta relativa a la aplicación que contenga la malla y textura serializada, hasta se podría serializar todo en un solo archivo, osea, Casa.msh > contiene la malla mas los materiales... es cuestión de imaginación, lo mejor seria no cargar en memoria todo, sino más bien, cargar lo necesario, y luego liberar los recursos al terminar de utilizarlo.
 
 
 
Utilizar este Plugins.. tambien puede ser una alternativa, aunque volveríamos al problema iniciar.

Cita de: Igor date=1501763999pero LIGHTBUG me ha mostrado el camino
   


Ahhhhhhhhhhh (poner musica de iluminacion espiritual) , jaja naa el camino aca lo mostró @francoe1 con eso del mesh. Yo la verdad nunca tuve que resolver este tipo de problemas porque nunca use este tipo de cosas, quizas cuando lance mi Action/Classic Horror Puzzle RPG vuelva a este post.

Jejeje, tendre mas cuidado al mencionar a lightbug, que se le sube a la cabeza y me da que va a acabar formando una nueva secta/religion, los lightbugianos, jejeje
 
En mis miles de inicios de proyectos si que habia tenido que vermelas alguna vez con lo de las ropas y lo habia solucionado "precariamente" (todas las mallas de ropas estaban ya en el "player"), la proxima vez que lo necesite releeré este post e investigare un poco mas,
 
Gracias a la comunidad a veces descubres cosas que no podrias descubrir de otra manera porque igual nisiquiera se te habia ocurrido esa posibilidad, entonces, como vas a buscar informacion si nisiquiera sabes lo que buscar?
 
Pues eso, gracias :)

Etiquetas: