Jump to content
UnitySpain

Antonio

Registrados
  • Content Count

    179
  • Joined

  • Last visited

  • Days Won

    5

Antonio last won the day on June 26

Antonio had the most liked content!

Community Reputation

175 Excellent

2 Followers

About Antonio

  • Rank
    Asiduo

Profile Information

  • Especialidad
    Coder

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Hola Rootet. Mirando el código, veo que hay un problema con tu actualización de la velocidad. En el Update, estás mirando si pulsas el botón del ratón, entonces actualizas la velocidad a "velocidad * 1.25f", pero también, una instrucción similar está siendo llamada en el siguiente frame y poseriores, en FixedUpdate, y esa está utilizando sólo "velocidad". No he probado tu código, pero creo, que esto puede llevarte al problema de que el cambio de velocidad no se llega a ejecutar realmente, que lo que ves al moverse, puede que sea el resultado del FixedUpdate. Tal y como lo veo yo (un poco por encimilla @_@) El personaje empieza quieto, el rigidbody no se mueve (ni en FixedUpdate ni en la llamada del ratón). Se pulsa el botón del ratón, el personaje sigue sin moverse en ese frame, como la variable corriendo era falsa, el personaje no se mueve todavía, pero la variable "corriendo" se activa. En el siguiente frame, la variable corriendo ya está activada, así que el velocity del FixedUpdate ya está en movimiento, pero el velocity del ratón ya no se activa, porque la función "GetMouseButtonDown" sólo da verdad en el frame (o ciclo) en que el botón pasa de no estar pulsado a estar pulsado, (que era el ciclo anterior por el que se activó la variable corriendo, pero ahora en este nuevo ciclo, el botón ya está pulsado y sigue pulsado, luego GetMouseButtonDown vuelve a ser falso). De modo que si el cambio de velocidad venía por esa línea, creo que no funcionará. Una manera rápida de arreglarlo es en vez de usar GetMouseButtonDown, utilizar simplemente GetMouseButton, su función es la misma, sólo que esta siempre se activa mientras el botón esté siendo pulsado, mientras que GetMouseButtonDown y GetMouseButtonUp, sólo se activan en los momentos de transición. (Son bastante útiles, pero quizás no en esta situación). Otra posibilidad, es cambiar el valor de la variable velocidad cuando haces la activación de la variable corriendo. Tutorial arriba, tutorial abajo, me parece que es buena idea intentar hacerlo por ti mismo, es una buena práctica para aprender a resolver y racionalizar los problemas. Ya habrá tiempo de pulirlo.
  2. Entonces, entiendo que toda la historia de los Assets Bundles está obsoleta, ahora este nuevo sistema de Addressables es en teoría el camino a seguir para distribuir un juego en múltiples paquetes de contenido. Bueno, ya sea uno u otro, estoy a cero, de modo que supongo que no me importará aprender este nuevo, aunque lamento que al buscar tutoriales sobre implementación de DLC sólo me remitan a los Assets Bundles. @_@ En fin, paciencia, el cambio habrá sido por una buena razón... XD
  3. Saludos Arganthamer Igual que has creado listas para guardar la posición y rotación, creo que puedes crear también listas para guardar y cargar esos datos particulares. (Una lista que guarde el tipo de bloque qué es y acudes a ella a la hora de cargarlo, si es un bloque de fuego, le guardo el valor 1, si es de aire le guardo el valor 2, y al cargar pues mires, es un valor 1, es un bloque de fuego, cargas el prefab y la textura correspondiente). Sobre como comprobar el tipo de bloque qué es, entiendo que la diferencia es un tipo de script particular, sí, la idea de poner los if - else if para comprobar cada tipo de script podría ser una forma que funcione, aunque a mi no me gusta mucho.... >_< También está el switch case, pero es que yo creo que esta situación se podría solventar mejor mediante la práctica del polimorfismo. El plan que propongo sería crear un script base para los bloques, que sea como el padre (¿"bloque.cs"?), y luego, los scripts hijos que tengan las particularidades de cada bloque. ("bloque_fuego.cs", "bloque_hielo.cs" etc...). El script padre, tendría todas esas variables y funciones que son recurrentes en todos los hijos, (también podría hacer uso de las funciones virtuales, pero bueno, mejor que no me vaya por los cerros de Úbeda ahora mismo). No sé, supón que todos los bloques tienen una vida, que llegada 0 el bloque se destruye, da igual si es fuego, hielo o lo que sea, todos tienen vida, pues ese dato iría al código padre. También creo que iría muy bien una lista Enum que sea la que diga que tipo de bloque será (los códigos hijos serán los encargados de inicializarla). Luego, los códigos hijos, heredarían el código padre, (por lo que todos tienen el valor vida, y todos tienen acceso a la variable tipo, luego al empezar el código fuego, entre sus primeras acciones es decirle a la padre, "ey, que yo soy de fuego") pero cada script, pues tiene además sus particularidades (los bloques de hielo tienen variables y funciones de deslizamiento... los bloques de fuego tienen variables del daño que provocan... etc...) Cuando creas un bloque, no pones el script padre, pones el script hijo que sea, pero por herencia, todos tienen ese script padre (e inicializan la variable tipo del padre), luego a la hora de guardar y cargar, no preguntas si tiene la clases hijos que pueden ser muchas, si no que preguntas directamente por la clase padre. En vez de preguntar ¿tiene el script "Bloque_Fuego"? , si , es de tipo bloque fuego no, ¿tiene el script "Bloque_Hielo"?, si, es del tipo bloque hielo no, ¿tiene el script "Bloque_Tierra"? si, es del tipo bloque tierra no, no es un bloque.... Pues preguntas ¿tiene el script Bloque? Sí - pues mira su variable tipo. No- pues no es un bloque. (Puedes crear dicha conexión padre-hijo llamando el script padre en la declaración del hijo. public class Bloque_Base : MonoBehaviour { enum TipoDeBloque {SinDefinir ,Hielo, Fuego, Tierra}; TipoDeBloque _tipo; //Esta variable se puede leer desde los tres scripts } public class Bloque_Hielo : Bloque_Base //Esta clase hereda la clase Bloque_Base, que a su vez, hereda también la clase MonoBehaviour de Unity { float Deslizamiento; //Esta variable sólo se puede leer desde este script } public class Bloque_Fuego : Bloque_Base //Esta clase hereda la clase Bloque_Base, que a su vez, hereda también la clase MonoBehaviour de Unity { float Dolor; //Esta variable sólo se puede leer desde este script }
  4. Saludos. Sobre la creación del botón, puedes hacerlo 3d o 2d. Si optas por el 2d, puedes crear el UI button y configurarlo para que ejecute la función al pulsarlo. https://docs.unity3d.com/ScriptReference/UI.Button-onClick.html Si optas por el 3d, puedes usar por algún raycast que detecte el botón con un collider. Sobre importar objs, hace faltan instrucciones para leer-escribir archivos, estos archivos se pueden abrir y leer con normalidad como cualquier otro archivo de texto. Un ejemplo de como se harían en Unity. Teoría de archivos: http://www.programacionenc.net/index.php?option=com_content&amp;view=article&amp;id=69:manejo-de-archivos-en-c&amp;catid=37:programacion-cc&amp;Itemid=55 Ejemplo en Unity: https://support.unity3d.com/hc/en-us/articles/115000341143-How-do-I-read-and-write-data-from-a-text-file- Lo 3º sería usar la información del archivo para ir recreando el mesh, no estoy muy seguro de como se crea el mesh en unity, cuando hice el importador de obj para OpenGL y Directx, allí tenía práctica y acceso a los buffers de datos que mandaba para renderizar. Pero en Unity no tengo eso así que de momento estoy en blanco. Aquí hay un ejemplo de creación de mesh en Unity https://unity3d.com/learn/tutorials/projects/procedural-cave-generation-tutorial/creating-meshes Parece que carga los vértices y las caras en un objeto Mesh (predefinido en Unity) pero veo que le faltan las UV (los valores vt del .obj) y los normales tampoco los coge del archivo (pero llama a una función RecalculateNormals que está dentro de la clase Mesh. Imagino que resolverá el asunto de los normales ahí dentro. O_ò
  5. Sip, el brillo es intencionado, el shader que usa el cuerpo es el standard (specular), ahí está usando una textura para el brillo specular, esta textura es casi negra pero tiene ruido, pero luego en el canal alfa está la textura del gloss, pero sobre todo los labios que están a más de 200. (Y luego está el mapa de normales que también tiene los labios exagerados adrede para que el brillo se manifieste con más normalidad por ahí, y no por la barbilla ni dentro de la boca). No es realista pero intentaba recrear una diferencia de material entre piel y labio. Tal vez el "arco de cupido" de los labios si está muy exagerado e intente levantarlo un poco. Malinterpreté lo del ambient oclusión, se me había venido a la cabeza el efecto de cámara no la textura en sí. El Fuse da una textura de una textura de ambient occlusion, es prácticamente blanca con algo de sombreado en el cuello, entre los dedos y bajos los brazos, además de oscurecer los orificios de la nariz y oídos (vamos, lo que le falta a la imagen de la izquierda), pero ya está, es muy básica, tengo que buscar como hacer AO textures que puedan mejorarlo, (a parte de crear las sombras para las ropa). El body mask, es una textura es una textura blanca y negra de baja resolución donde su canal alpha, se utiliza para indicar en qué partes se aplican los secondary maps, es decir los microbumps. Ahí la estoy usando para que los microbumps no se apliquen a los labios, ojos y pelo. El microbump que estoy usando ahora mismo se supone que es de piel, pero no lo he conseguido muy bien, el modelo tiene una textura normal de ruido que se repite por todo el cuerpo (en las zonas blancas del body mask) pero era una textura rápida y cutre que hice y a parte del detalle, esta no se ve mucho. Está ahi, se ve si se acerca la cámara y hay luces fuertes apuntando, pero en general es algo que se podría mejorar. (Es mucho más importante en las prendas, para reforzar un bordado o un material porosa).
  6. Gracias por comentar. Creo que el efecto del postprocesamiento "Color Grading" si ha dado buen resultado, retocando un poco para cambiar el color, añade más contraste y saturación a la piel pero sin quemarla mucho, y sin tener que cambiar el color de la textura, no esperaba tanta diferencia en la piel. El ambient occlusion no lo noto tanto en el personaje, (si alejo la cámara, si se ensombrece más el cuello y los sobacos, pero de una manera un poco descontrolada O_ò, normalmente un ambient occlusion leve lo suelo emplear más por el escenario, queda muy bien para dar variedad y crear sombras en las esquinas. La nariz la he reducido muy poco, cuando lo vista y lo vea con algún otro pj, ya podré hacer más comparaciones, de momento creo que todo el perfil puede que esté demasiado alargado, o tal vez no tanto. El asunto de las cejas, efectivamente las he separado también en una nueva capa, pero creo que el resultado no vale tanto la pena (o es que no lo he hecho muy bien), las cejas se ven oscuras por el postprocesamiento, y al estar en un nuevo materia, también están un poco más acentuadas (no comparten el brillo del material de la cara), pero la verdad es que no noto mucha variación entre las nuevas y las antiguas. Sin embargo, creo que el cambio más notable han sido los ojos. Les he hecho varias cosas: Le reduje el smoothness a las corneas para que el brillo sea más grande, creo que mejoró un poco y el brillo se veía dese más distancia (dependiendo de la iluminación claro) En Maya, le puse también una capa extra debajo de los párpados con un degradado de sombra, creo que eso es lo que le ha dado mucha más profundidad a los ojos. también le giré las pestañas un poco y se las alargué, creo que ayudan a perfilar el ojo y nuevamente, poder distinguirlo desde más distancia. En la textura de la cara no he cambiado el color de la piel (eso fue el postrpocesamiento) pero sí le he oscurecido un poco los párpados superiores. En eso si me he quedado más contento. :3 Supongo que si le pongo animaciones ahora también luciría mejor, pero de momento le tengo hecho un lio con el rigging de la boca y las mejillas (el riging de las comisuras siempre me ha parecido una de las partes más complicadas @_@). (Izq, con las textura del Mixamo fuse, Centr como estaba al empezar este tema, Det, la versión actual).
  7. Saludos. Abro tema porque quiero preguntar por indicaciones e ideas para mejorar el aspecto de un personaje. El modelo fue hecho con Adobe fuse, con algunos recortes y cambios en Maya LT, (aún tengo que quitarle los dientes y rehacerle unos sin tantos vértices) pero generalmente estoy satisfecho con la topología de la malla. (bueno, quizás le ensanche un poco el cuello) Las proporciones no son realistas, (estoy usando la de las 8 cabezas y media) pero a estas alturas, estoy también contento con ellas Lo que no termino de conseguir creo que es la textura, (y bueno, mi odisea con los peinados, pero esa es otra batalla a parte). Estoy trabajándolo y creo que no se ve tan mal, pero en muchísimos momentos también se le ve como con cara de palo. A veces creo que es el FOV de la cámara, pero otras tantas me parece que no consigo darle el toque a la textura para que se vea bien. No busco fotorealismo, simplemente creo que la cara de este personaje, no es memorable, le falta algo. Lo veo, soso, simple, amargado, (vale que también le tengo la cara muy vista O_ò) pero aunque le ponga shaders de post procesamiento para el bloom y los colores, todavía no se ve pulido. No sé, estaba pensando algunas cosas, (cambiar color de las sombras? ¿borrar el marcado de los pómulos o reforzar los pómulos? ¿quitar las cejas y ponerlas con transparencia en una capa encima?...) ¿Alguien tiene alguna sugerencia o idea de qué o como podría mejorar la cabeza?
  8. No lo sé, yo siempre lo uso para subirle un OBJ, que me haga un riggeado rápido aunque después tenga que arreglarlo en 3ds max, también lo uso para coger modelos del Adobe fuse, los archivos FBX que me descarga mixamo puedo importarlo y usarlo en Unity, aunque generalmente de poco me sirven, normalmente tiendo a llevar ese FBX de mixamo a 3ds max donde hago los ajustes que sean. Para los nombres, de los huesos, me cree un pequeño maxscript cutre para renombrarlos según mis necesidades, renombrar huesos no es difícil, pero con el script pues se ahorra tiempo y se hace las cosas más sencillas. Arrastrar sobre el escritorio de 3ds max para ejecutar (El 1º array, de REDSC porque primero lo hice para el Resident Evil Darkside Chronicles y luego simplemente lo reutilicé. Pero el 1º array es el de los huesos de origen, y el 2º array el de los huesos de destino, luego simplemente va buscando entre los objetos de 3ds max de la escena por los nombres del 1º array, si los encuentra, pues lo sustituye por su homónimo del 2º array). REDSCnames =#("b_0_1","mixamorig:Hips","mixamorig:Spine2","mixamorig:Spine1","mixamorig:Neck","mixamorig:Head","mixamorig:RightShoulder","b_22_51","mixamorig:RightArm","mixamorig:RightForeArm", "mixamorig:Spine", "mixamorig:LeftShoulder","b_52_53","mixamorig:LeftArm","mixamorig:LeftForeArm","ManoIzq","b_2_3","mixamorig:RightUpLeg","mixamorig:RightLeg","mixamorig:RightFoot","mixamorig:RightToeBase", "mixamorig:LeftUpLeg","mixamorig:LeftLeg","mixamorig:LeftFoot","mixamorig:LeftToeBase","mixamorig:RightHandThumb1","mixamorig:RightHandThumb2","mixamorig:RightHandThumb3","mixamorig:RightHandIndex1","mixamorig:RightHandIndex2","mixamorig:RightHandIndex3", "mixamorig:RightHandMiddle1","mixamorig:RightHandMiddle2", "mixamorig:RightHandMiddle3","mixamorig:RightHandRing1","mixamorig:RightHandRing2","mixamorig:RightHandRing3","mixamorig:RightHandPinky1","mixamorig:RightHandPinky2","mixamorig:RightHandPinky3","_39", "mixamorig:LeftHandMiddle1","mixamorig:LeftHandMiddle2", "mixamorig:LeftHandMiddle3","mixamorig:LeftHandRing1","mixamorig:LeftHandRing2","mixamorig:LeftHandRing3","mixamorig:LeftHandPinky1","mixamorig:LeftHandPinky2","mixamorig:LeftHandPinky3","_49", "mixamorig:LeftHandThumb1","mixamorig:LeftHandThumb2","mixamorig:LeftHandThumb3","mixamorig:LeftHandIndex1","mixamorig:LeftHandIndex2","mixamorig:LeftHandIndex3","mixamorig:RightHand","mixamorig:LeftHand") XNALaranames = #("root ground", "root hips","spine upper","spine middle","head neck lower","head neck upper","arm right shoulder 1","arm right shoulder fix","arm right shoulder 2","arm right elbow","spine lower", "arm left shoulder 1","arm left shoulder fix","arm left shoulder 2","arm left elbow","ManoIzqMod","pelvis","leg right thigh","leg right knee","leg right ankle","leg right toes", "leg left thigh","leg left knee","leg left ankle","leg left toes","arm right finger 0 a","arm right finger 0 b","arm right finger 0 c","arm right finger 1 a","arm right finger 1 b","arm right finger 1 c", "arm right finger 2 a","arm right finger 2 b", "arm right finger 2 c","arm right finger 3 a","arm right finger 3 b","arm right finger 3 c","arm right finger 4 a","arm right finger 4 b","arm right finger 4 c","_39", "arm left finger 2 a","arm left finger 2 b", "arm left finger 2 c","arm left finger 3 a","arm left finger 3 b","arm left finger 3 c","arm left finger 4 a","arm left finger 4 b","arm left finger 4 c","_49", "arm left finger 0 a","arm left finger 0 b","arm left finger 0 c","arm left finger 1 a","arm left finger 1 b","arm left finger 1 c", "arm right wrist","arm left wrist") index = 1 rollout WindowType "REDSC Name Replacer" ( edittext FndWht "Find what :" text:"" width:210 align:#center edittext RplcWth "Replace with :" text:"" width:210 align:#center button replacAllBttn "Replace All" width:78 align:#right tooltip:"" on replacAllBttn pressed do while index < 60 do ( FndWht.text = REDSCnames[index] RplcWth.text = XNALaranames[index] if FndWht.text!="" and FndWht.text!=RplcWth.text then ( mthCnt=#() for i = 1 to objects.count do ( qualif = matchPattern objects[i].name pattern: ("*"+FndWht.text+"*") ignoreCase:true if qualif == true then ( append mthCnt objects[i] ) ) print ("Find : "+FndWht.text+" Match "+(mthCnt.count as string)+" Object(s)") print ("Replace with : "+RplcWth.text) multiMth=#() for i = 1 to mthCnt.count do ( nmOld=mthCnt[i].name mthCnt[i].name=substituteString mthCnt[i].name FndWht.text RplcWth.text print (nmOld+" renamed to "+mthCnt[i].name) ) ) index += 1 ) ) WindowTitle = newRolloutFloater "Name Replacer" 400 150 addRollout WindowType WindowTitle Cuando uso animaciones de mixamo, otro problema que tengo es que los huesos de distintas animaciones son diferentes, aunque uso el Mecanim de Unity, muchas veces no puedo reutilizar el mismo avatar, las rotaciones son diferentes (causando joroba en los personajes o doblando los dedos de manera extraña). Creo que Mixamo es muy útil, pero para usarlo tengo que ajustar cosas, no me vale pasarlas directamente. Lo que estoy intentando ahora, es crear 1 personaje genérico, y tratar de crear los otros personajes a partir de ese modificaciones (en Maya LT) a ese pj, en vez de tener que pasar por todo el proceso otra vez (especialmente por el asunto del rigging facial @_@) espero a la larga poder ahorrar trabajo de esta manera.
  9. Si, la cosa se ve interesante, pero también vi que el tema era del 2017 y no sé si seguirá activo
  10. También puedes poner el montaje que haces con el cinemachine en una escena a parte, de modo que al cargar la escena se ejecute automáticamente la secuencia. Al terminar, puedes poner que se active un objeto con un código que cargue la siguiente nivel (el menu, el 1º nivel de juego etc) en la función Start. (Para que se ejecute al activar el game object, que puedes activarlo con las herramientas del cinemachine).
  11. No sé como son los códigos internos de unity, pero realmente no creo que vaya a haber alguna diferencia notable entre un tipo u otro. Sí seguramente hay posibles optimizaciones aquí o allá, pero con impacto tan mínimo que no creo que valga la pena rayarse en la diferencia de esas dos.
  12. Hola Mcloud. Es posible cambiar la opacidad, pero es algo que también depende un poco de qué shader está usando ese árbol. Por ejemplo, entre los shaders "Standard" de unity, hay 4 opciones. Sólido, el árbol no tendría opacidad (tampoco por los bordes, sería como una pegatina cuadrada). Los cambios en la transparencia no tendrían efecto alguno. Cutout, me parece que es el que está usando ese árbol, esta es la transparencia binaria, de "ó es opaco, o es inivisble", pero no hay degradado ni suavizado en los bordes, si vas cambiando la transparencia, seguramente el objeto pasará de ser visible a totalmente invisible en algún punto (depende de la textura). Fade es más la transparencia tradicional, creo que es la que buscas, efectivamente cambiar el valor alpha, irá mezclando la textura del árbol con lo que haya detrás (sería como la sombra del árbol). La última es Transparent que es muy similar a Fade pero "recuerda" la textura al completo para que otros efectos se sigan aplicando incluso en las zonas con transparencia, como los reflejos en un cristal. En todos ellos, se podría cambiar la transparencia en el "material", (cogido a través del componente renderer), aunque cambiar la transparencia no tiene el mismo efecto en cada shader. https://docs.unity3d.com/ScriptReference/Material-color.html ("color" es un vector4 que hace referencia al color del pixel [rojo, verde, azul, alpha] , pero con los valores normalizados, es decir que sólo van de 0.0f a 1.0f). float alphaStart = 0.0; float alphaEnd = 1.0; float duration = 1.0; Renderer rend; function Start() { rend = GetComponent<Renderer> (); } function Update() { float lerp = Mathf.PingPong(Time.time,duration)/duration; renderer.material.color.a = Mathf.Lerp(alphaStart,alphaEnd,lerp); }
  13. La co-rutina puede tener la llamada en Update pero debe estar controlada por alguna condición para que no se esté ejecutando en cada frame. La condición puede ser que no se vuelva a activar mientras la co-rutina este activa (depende claramente de lo que estés haciendo en la co-rutina, pero por ejemplo, si sabes que la co-rutina va a durar 2 segundos¿? pues puedes poner que no se vuelva a activar hasta que el tiempo sea Time.time+ 2.0f
  14. A lo mejor se puede usar una segunda textura? Si miras el código, verás que an propiedades, esta incluyendo unas variables, y con mucha segurida alguna de ellas será un textura, úsala de refencia para crear otra textura de máscara y luego, en las operaciones que busquen el rojo o el alpha, haz que use esa 2' textura en vez de la original.
  15. Saludos Mimic. No he visto el shader que mencionas, pero creo que eso del rojo y el alpha, se refiere a los canales en la textura. Si abres la textura en Photoshop, verás que hay una ventana con capas y canales, en esos canales están el rojo, verde y azul (RGB) y si creas uno más, este será el alpha que también se puede usar para las transparencias, aunque en este caso, sospecho que será lo que usan para saber qué parte de la palmera se mueve de una forma y que partes se mueven de otra.
×
×
  • Create New...