Jump to content

Leaderboard


Popular Content

Showing content with the highest reputation since 12/20/2020 in Posts

  1. 3 points
    tienes que buscar un poco antes de preguntar, probar si puedes hacerlo mínimo 2 días y sino preguntas, tu pregunta esta en el manual lee un poco. URL: https://docs.unity3d.com/ScriptReference/Rigidbody-isKinematic.html Controla si la física afecta al cuerpo rígido. Si isKinematic está activado, las fuerzas, colisiones o articulaciones ya no afectarán al cuerpo rígido. El cuerpo rígido estará bajo control total de animación o control de script cambiando transform.position. Los cuerpos cinemáticos también afectan el movimiento de otros cuerpos rígidos a través de colisiones o articulaciones. Eg. puede conectar un cuerpo rígido cinemático a un cuerpo rígido normal con una articulación y el cuerpo rígido se restringirá con el movimiento del cuerpo cinemático. Los rigidbodies cinemáticos también son particularmente útiles para hacer personajes que normalmente son impulsados por una animación, pero en ciertos eventos se pueden convertir rápidamente en un ragdoll estableciendo isKinematic a false. using UnityEngine; using System.Collections; public class ExampleClass : MonoBehaviour { public Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } // Let the rigidbody take control and detect collisions. void EnableRagdoll() { rb.isKinematic = false; rb.detectCollisions = true; } // Let animation control the rigidbody and ignore collisions. void DisableRagdoll() { rb.isKinematic = true; rb.detectCollisions = false; } } este es un ejemplo básico solo para la colisión y estado muerto del enemigo, si quieres chocar al enemigo y que las físicas interactúe con el enemigo muerto tienes que hacer un Ragdoll del enemigo para desactivar la animación del enemigo y que cuando tenga 0 de vida se caiga y lo puedas mover cuando colisionas con el. public void Ejemplo(float amount) { if (health < 5) //este valor depende de cuanto daño le haces al enemigo., lo que dice es si vida es menor a 5 pasa a estado de muerte. { muerte(); } } void muerte() { Destroy(GetComponent<NavMeshAgent>()); // aca se desactiva la inteligencia Artificial. anim.enabled = false; //aca desactiva la animacion quedando solo el Ragdoll. } sino sabes que es un Ragdoll acá te dejo un link :"" https://www.youtube.com/watch?v=DInV-jHm9rk&t=1s¨
  2. 3 points
    necesito ayuda! no se si esto funcionara foreach (User _user in UnitySpainUserList) { _user.addMessage("felices fiestas"); }
  3. 2 points
    Curioso que muestres la imagen que aparece en el manual, donde realmente está la solución: https://docs.unity3d.com/Packages/com.unity.ugui@1.0/manual/script-SelectableNavigation.html La opción Visualize está activa. Unity Learn para el UI Navigation: https://learn.unity.com/tutorial/ui-navigation#
  4. 2 points
    Creo que no te responden porqué la pregunta es demasiado genérica y sin pistas más detalladas de lo que estás haciendo. Tal vez poniendo ejemplos del código y explicando qué haces puedas conseguir respuestas.
  5. 1 point
    Hola, comunidad! buenas tardes. Quiero compartir con ustedes un proyecto en el que trabaje prácticamente 5 meses continuos y a su vez, realizarles una pregunta para qué puedan guiarme y elegir sabiamente. El juego se llama "Club del fierro" se encuentra disponible en playstore, actualmente 27k lo han descargado (es lo que me marca la ficha) comparto algunas imágenes: El juego se trata de picadas(como le decimos aquí en argentina), o mejor como arrancones, piques, drag etc. en el mismo, uno puede modificar los autos (piezas, colores, partes, mecánica básica y avanzada por puntos, altura etc.), correr contra bots, o en una tabla global online para ver quien tiene el mejor tiempo a nivel mundial... ¡Volviendo al juego, estoy por integrar partidas online con Photon! Próximamente saldrá la versión online, que tantos usuarios están esperando (administro un grupo en fb llamado "club del fierro (comunidad del juego oficial), el cual tiene 7.3 usuarios y aproximadamente 600 a 900 usuarios activos por día) ¡Aclaro que al juego le invertí 0 publicidad paga! se corrió la noticia de boca en boca y aún siguen instalando, descargando y uniéndose a la comunidad! Link del juego por si quieren probarlo: https://play.google.com/store/apps/details?id=com.club.f1&hl=es_AR&gl=US por si quieren ver algunos videos, algunos usuarios ya han creado cuentas en YouTube para enseñar el juego: esta es la que siempre recomiendo: me siento muy contento porque el juego se esta jugando mucho! te llena de energías ver tu proyecto terminado y siendo usado por muchos usuarios!
  6. 1 point
    Lo resolví bakeando todo de nuevo despues de un par de veces, nose que pasaría.
  7. 1 point
    Ah ostras! No te había entendido, gracias @francoe1 y @lightbug, desde luego no tengo tanto conocimiento o no lo había enfocado así, le doy una vuelta 👍
  8. 1 point
    Es probable que puedas "engañar" al sistema creando events por código. https://docs.unity3d.com/Packages/com.unity.inputsystem@1.0/manual/Events.html El ejemplo de la página (necesitas usar el namespace InputSystem.LowLevel) // Send event to update leftStick on the gamepad. InputSystem.QueueDeltaStateEvent(Gamepad.current.leftStick, new Vector2(0.123f, 0.234f) ); Quizás puedas reemplazar esto por Mouse.current, recuerdo que lo hice en su momento. De argumento le pasas la posición actual. No se si sea la mejor solución, es probable que si necesitas actualizar frame a frame UI no sea lo más efectivo, no lo se.
  9. 1 point
    no, ese no es el problema, el problema es que el raycaster deja de disparar cuando dejas de mover el ratón y dispara al moverlo de nuevo, entonces si dejo el ratón sin mover y al rato pasa una unidad que tiene El Evento IPointerEnter, no salta el evento ya que no se hace el raycast cuando esta el mouse parado parece.
  10. 1 point
    Buenas! Este es mi proyecto... Se trata de una experiencia audiovisual interactiva inmersiva mas que de un videojuego al uso. Es una aventura un tanto surrealista donde nuestro protagonista no sabe muy bien si lo que sucede es real, o un sueño y va adentrándose en un mundo cada vez mas extraño desentrañando poco a poco el misterio que mismo encierra. Quien haya jugado los dos anteriores Aporía hechos con Entidad 3D va a encontrar que este juego no pretende ser una continuación ni precuela de aquellos.... Este será mas bien como un reboot, manteniendo el espíritu jugable y el universo similar, pero yendo a terrenos un poco mas artísticos e inmersivos. Les dejo el primer avance:
  11. 1 point
    Beach Race Android Es de mi placer presentarles Beach Race, un endless runner donde debes evitar chocar ante algunos conductores que posiblemente se encuentren bajo los efectos de algún tipo de alcohol. Si es de agrado favor de dejar una Review. Que lo disfruten mucho. Gracias y mucha suerte en sus proyectos gente
  12. 1 point
    Me recuerda al Spy Hunter. Felicidades por publicar el proyecto.
  13. 1 point
  14. 1 point
    Tenes que usar "root motion", nada mejor que la documentación de Unity Unreal para explicar esto (mirá los videos de abajo): https://docs.unrealengine.com/en-US/AnimatingObjects/SkeletalMeshAnimation/RootMotion/index.html No es tan fácil, tenés que usar un hueso raíz (de ahí el root) que será el padre de los demas huesos (los deformables, no los de ayuda como pueden ser los IK) y además deberá contener la información del desplazamiento lineal/angular, es decir, tendrás que animar este hueso de tal manera de que represente el movimiento/rotación de tu personaje. En unity root motion se usa de dos maneras: Dándole a "Apply root motion" en el Animator. El Animator mueve a tu transform/rigidbody automaticamente. Extrayendo los datos del desplazamiento y re-aplicandolos (si fuera necesario) usando OnAnimatorMove. El animator, en este caso, te marca "handled by script". Aclaro: Root motion no es algo que debas hacer, como dijo @Igor probablemente con animaciones in-place sea más que suficiente (y procesar el desplazamiento/rotación dentro de un script). No se qué es realmente lo que intentas hacer.
  15. 1 point
    ya hemos enviado un sicario hacia tu casa
  16. 1 point
    el personaje, en la animacion, deveria estar siempre en el centro, sin moverse. y luego moverlo lo que corresponda en unity
  17. 1 point
    De entrada no deberías usar versiones tan nuevas como la 2020.1 si no quieres problemas de compatibilidad. He leído el texto tuyo de errores y aparece esto: > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade > Failed to read key mastereal from store "C:\Users\IUser\Desktop\Android Game\user.keystore": Cannot recover key O la referencia al fichero de claves de la keystore no es correcta, o la clave correspondiente al proyecto no está en esa keystore.
  18. 1 point
    Que bueno leer a alguien de E3d por aquí! Que usuario tenías en el foro? Gracias por el apoyo! El video dice poco y nada, pero pronto mostraré unos avances nuevos que van a dejar un poco mas claro por donde va el juego... Va a ser mas similar al Aporía 1 que al 2... mas laberitos (sin paredes ni techo, en su mayoría) mas plataformas y mucha exploración libre. El componente puzzle en el que se basa la jugabilidad de Aporía 2 con todo aquel rollo de los portales aquí va a ser mucho menor y va a estár implementado de manera diferente. Un abrazo!
  19. 1 point
    Hola gente como les va? Espero que muy bien... mi consulta es porque yo tengo un .mp4 que es el sonido de mis partículas, en este caso fuego, y quería saber como hacer para que se escuche al momento de que el fuego aparezca. Gracias saludos.
  20. 1 point
    Si el collider no está asociado a un sprite renderer (en el caso de 2d) no se ajustará a tamaño. Tendrás que hacerlo a mano con el size.
  21. 1 point
    @francoe1 él sapeee 🧙‍♂️🙌
  22. 1 point
    Pon todo el código que referencie ese gameobject o ves desactivando otros gameobjects hasta que no ocurra y descubras cual lo hace. Por lógica tiene que haber algo que lo desactive.
  23. 1 point
    Viendo el archivo de error.txt creo que pueden ser dos cosas: 1. No está actualizada la versión de .NET en Windows 2. No instalaste el JDK y NDK de Android a través de Unity Hub y no corresponde con la versión. Nada de Android Studio, tiene que ser a través del Hub.
  24. 1 point
    por lo que leído hay muchas razones por la que puede salir ese error. 1- unity no tiene los permisos necesarios de ejecución para el UnityLinker.exe, la solución seria ejecutar unity como administrador. 2- pude que sea un error en ASCII del nombramiento del juego como las escenas si coloco en algún momento ej : Exaple_1 eliminar el "_ " podría solucionarlo. 3- versión vieja del Net Framework actualice su versión eso debería corregirlo. 4- Asegúrese de que el nivel de compatibilidad de Api está establecido en .net 4.x. hay muchas mas razones pero creo que estas son las mas probables.
  25. 1 point
    😀 Por fin, las dos primeras partes de «Manos en la Sombra»: publicadas Todavía me faltan corregir cuatro partes más. Pero poco a poco.
  26. 1 point
    Chequea el modificador decimate (creo que significa diezmar):
  27. 1 point
    Ni idea de la Windows Store. Pero vamos, si te dice que no puede ser mayor de x bytes, pues nada, a ajustarlo en tamaño. No le veo complicación.
  28. 1 point
    Jajajjaja felices fiestas!!
  29. 1 point
  30. 1 point
    igualmente pásenla bien les deseo lo mejor a todos 🎅💖🥂
  31. 1 point
    hola, por que no pruebas a ir poco a poco primero que tu personaje reciba daño y después le vas añadiendo lo que veas que necesitas la animación etc... También prueba a hacer algún Debug.Log(); por si acaso no entra en algún OnCollision no te detecta algo y probar que se ejecute todo correctamente.
  32. 1 point
    tubproblema podria ser por muchas razones. y como no has explicado el funcionamiento de esas colisiones no podemos ayudarte. como derectas si hay colision con el arma? es con "triggers" (onTriggerEnter)? usas raycast? o usas onCollisionEnter? has ajustado las colisiones en propiedades/physics? usas diferentes capas? el player usa rigidBody? etc...
  33. 1 point
    float angulo = ((transform.localEulerAngles.y - 360) / -1); if ((angulo > 359) || (angulo >=0 && angulo < 90)) { anim.SetTrigger("arriba"); } if (angulo >= 90 && angulo < 180) { anim.SetTrigger("derecha"); } if (angulo >= 180 && angulo < 270) { anim.SetTrigger("abajo"); } if (angulo >= 270 && angulo < 360) { anim.SetTrigger("izquierda"); } Lo conseguí de esta manera, cuando giro el padre, el sprite se elije su lado correspondiente. Ahora viene la parte más difícil, y si resulta que también quiero mover la cámara, y que el sprite también se encare respecto a la cámara? Osea que tenga en cuenta la rotación del padre y además la rotación de la cámara.
  34. 1 point
    Desactivar la opción de recibir sombras me sirvió. Gracias!
  35. 1 point
  36. 1 point
    Muchos lo sabréis y otros no, pero hay una lista de recursos bastante tocha hecha en zeef.com de recursos para el desarrollador de videojuegos. Espero que os sea de utilidad! https://game-development.zeef.com/daniel.cuadrado.gonzalez
  37. 1 point
    Voy a reunir pequeños tips de Unity que se pueden resumir en pocas frases. Esta lista se irá agrandando poco a poco en el futuro. Podéis añadir los vuestros si queréis. La idea es TIP + imagen representativa. Puede usar el atributo MenuItem para agregar menús contextuales que pueden llamar a funciones estáticas. Además, si desea crear teclas de acceso rápido, puede agregar caracteres especiales ("%" para ctrl, "#" para shift, "&" para alt) Recuerde guardar las cadenas repetidas en una variable constante. Verifique que su sistema de partículas tenga un culling automático. Si no tiene,revise las razones o use CullingGroup Puede usar el atributo ContextMenu para probar su código en la ventana del editor No olvide optimizar sus Animators con el modo de selección. Esto deshabilita la animación cuando no son visibles.
  38. 1 point
    En esta entrada vamos a aprender a crear nuestro primer shader Vertex/Fragment en Unity. Iremos paso a paso hasta terminar creando nuestra propia bandera con ondulación: Requisitos Para crear este proyecto podemos usar cualquier versión de Unity 2018/2019/2020 siempre y cuando a la hora de crear el proyecto usemos la plantilla de 3D (Built-in Render Pipeline) Antes de pasar al código, creo que es necesario que definamos qué es un shader y las partes que lo componen. ¿Que es un Shader? Un shader es un contenedor de instrucciones que se envían a la GPU para mostrar los elementos que tenemos en pantalla. Al igual que el script de un personaje contiene las instrucciones para que este se mueva o gire, el shader contiene información sobre el color o los vértices de un objeto. Al igual que para escribir comportamientos Unity usa C#, para escribir shaders Unity usa su lenguaje llamado Shaderlab. A su vez Shaderlab permite escribir fragmentos de código en CG (C for Graphics) que es donde realmente estará el código del shader en sí. El lenguaje CG fue desarrollado por Nvidia y Microsoft y es compatible tanto con OpenGL como con DirectX. Veremos más adelante en profundidad las partes que componen Shaderlab y CG. Tipos de Shaders En Unity tenemos dos opciones a la hora de crear un shader. Surface shaders: podemos definirlo como una "plantilla" creada por Unity para facilitarnos gran parte del trabajo aunque dando menos control sobre el resultado final. Vertex/Fragment shaders: el código que existe bajo la capa de Surface anterior. Tiene mayor complejidad pero ofrece mayor control sobre el resultado. En esta entrada nos centraremos en estos últimos, ya que el paso a Surface (o a ShaderGraph) es mucho más productiva si conocemos los conceptos del Vertex/Fragment. Fases del Pipeline Para conseguir mostrar un objeto de juego (3D) por pantalla (2D) se requiere de un proceso con varias fases. Ese proceso es llamado Rendering Pipeline. Para que sea más sencillo de entender, voy a resumir los pasos para centrarnos en los que nos interesa ahora. Básicamente tenemos dos funciones que podemos modificar: Vertex: En esta función podemos modificar datos relativos al mesh, principalmente la posición de los vértices, de ahí su nombre. Consta de una entrada de datos (como la posición de los vértices mencionada o las uvs) y produce una salida que será el input de la función fragment. Fragment: En esta función obtenemos los datos recibidos después de convertir las coordenadas del objeto en coordenadas de pantalla. Por ello todas las modificaciones aquí son a nivel de coordenadas de pantalla. Por ejemplo el color, su transparencia etc. Esta explicación es muy superficial y muy rápida, puedes encontrar más información aquí: https://en.wikipedia.org/wiki/Graphics_pipeline Una vez explicado esto, vamos a pasar a la parte práctica. Abrimos por fin Unity y creamos el proyecto con la plantilla de 3D que comentamos (Built-in Render Pipeline). Partes de un Shader en Unity Para empezar vamos a crear una nueva escena. La abrimos y creamos un nuevo Shader Unlit: Le ponemos de nombre FlagEffect por ejemplo y creamos un Material que lo use. Ahora crearemos un cubo en la escena y le colocamos las siguiente posición, rotación y escala: Creamos ahora un Plano, le arrastramos nuestro material y lo colocamos en: Si todo ha ido bien deberás tener algo así. Puedes ajustarlo tú a tu gusto (aunque ten cuidado al girarlo ya que podrías no tener el resultado esperado al final) Una vez creada nuestra bandera, vamos a abrir el shader FlagEffect. Vamos a borrar todo el contenido y vamos a ir conociendo sus partes poco a poco. Esta sería la estructura del shader con la que deberías empezar: Shader: La carpeta donde se registrará nuestro shader. Properties: Son las variables que podemos crear y ver a través del inspector del material. Cuando en un inspector ves una cajita para la textura, un botón para el color o un campo con un valor numérico aquí es donde se deben crear. La sintaxis es la siguiente: NombreVar ("TextoInspector",TipoVariable) = ValorPorDefecto Aquí podemos ver las diferentes propiedades que podemos crear en Unity: https://docs.unity3d.com/Manual/SL-Properties.html SubShader: El contenido del shader estará aquí dentro. Pass: Cada llamada de pintado que haremos. Cada una tendrá sus funciones Vertex y Fragment. Por defecto solo tendremos y necesitaremos una. Aquí es donde estará el código, acotado entre la pauta de inicio y de fin de CG que vemos en la imagen. Fallback: no es obligatorio aunque es recomendable. Si nuestro shader no es compatible con la plataforma en la que corra, se llamará a otro shader para evitar que se vea rosa. Pero para nuestras pruebas recomiendo borrar la línea. De esta forma si tenemos algún problema con nuestro shader podremos verlo directamente (de otra forma puede que llame al Fallback y no lo veamos rosa). Una vez tenemos la plantilla básica, vamos a añadir las funciones de Vertex y Fragment y los input/output necesarios. Vamos a empezar creando estos últimos. Como vimos anteriormente vamos a necesitar una entrada a la función Vertex y una salida de ella. También necesitamos una salida de la función fragment. Para esto usaremos struct de C (que se declaran igual que en C#). Ahora vamos a necesitar las funciones Vertex y Fragment. La primera tendrá como parámetro su input y devolverá el output. La Fragment tendrá como parámetro el output del vertex. Hasta aquí simplemente tenemos las funciones creadas con sus correspondientes inputs/ouputs configurados (aunque vacíos). Si vamos a Unity veremos nuestro material rosa y eso es debido a que el shader cree que nuestras funciones son diferentes a las Vertex/Fragment. Tenemos que decirle mediante un #pragma que la función de vertex se llama vert en nuestro código y que la función fragment se llama frag. Puedes ponerle otro nombre a las funciones sin problema, siempre que en esta conexión lo pongas bien: De esta forma ya no tendremos problemas con nuestro shader, salvo por el pequeño problema de que no se ve nada. Inputs y Outputs En este apartado vamos a rellenar nuestros structs de datos con la información que necesitamos en nuestras funciones de vert y frag. Dependiendo del shader que estemos creando vamos a necesitar más o menos datos dentro de los inputs. Por ejemplo si solamente queremos cambiar el color del objeto a rojo, no necesitamos datos de UV. Podemos ver todos los datos que podemos usar en cada función aquí: https://docs.unity3d.com/Manual/SL-VertexProgramInputs.html En nuestro caso vamos a necesitar para las ondulaciones de la bandera, la posición de los vértices y las coordenadas de uv del modelo. Para ello vamos a crear estas dos variables dentro de vertexInput y de vertexOutput. Lo que aparece después de los dos puntos es la semántica y es necesario para conectar los datos. En el artículo anterior de Unity explica esto más detenidamente* * Te darás cuenta de que Unity en el output usa SV_Position, que simplemente es un valor de sistema que lo hace más compatible con los sistemas actuales, para facilitar el entendimiento lo he obviado y he usado el POSITION Llegados a este punto voy a explicar rápidamente los tipos de variables que podemos usar dentro de CG. Como ves he usado fixed2 y fixed4. El número al final hace referencia a vectores de 2 y 4 datos. Sería algo similar a un Vector2 o un Vector4. El tipo fixed es el tipo de menos coste y de menor precisión. Estarás acostumbrado a ver float o int. Estos también pueden ser usados de la misma forma que fixed. Aquí puedes ver los tipos de datos: https://docs.unity3d.com/Manual/SL-DataTypesAndPrecision.html También puedes crear matrices siguiendo la misma lógica, la sintaxis sería “float4x4”,siendo los valores del final las filas y las columnas. Una vez tenemos el vertex con los datos, vamos a pasar al fragment. Este simplemente necesitará un valor, el color final del pixel. En este caso usaremos SV_Target que es el que Unity recomienda por defecto. Como he dicho tienes más información acerca de la semántica en los enlaces anteriores. Como normalmente el fragment solo tiene un valor de devolución, puedes optimizar y borrar el struct de output cambiando el frag de la siguiente manera. El resultado es el mismo que el anterior pero en menos pasos. Ahora vamos a rellenar nuestra función de vertex. Pero antes vamos a necesitar incluir funciones que Unity nos ofrece para facilitarnos el trabajo. Como hemos dicho antes, vamos a convertir la posicion 3D del objeto en posición de pantalla. Para esto vamos a usar una función de Unity llamada UnityObjectToClipPos. Esta función recibe la posición de los vértices y devuelve las posiciones en espacio de pantalla para después usarlas en la función fragment. Para poder usarla vamos a incluir esta línea debajo de los #pragma. El #include sigue la misma lógica que los using en C#, de esta forma podemos hacer uso de funciones que Unity tiene preparadas (como la que hemos comentado antes). Ahora en la función vertex vamos a igualar el output que devolveremos a lo que la función UnityObjectToClipPos nos devuelva. De esta forma convertiremos los vértices para el fragment. También vamos a igualar de momento las uv del input y del output, aunque las usaremos justo ahora. Procedemos ahora a mover por fin los vértices. Para esto vamos a necesitar conocer por un lado la variable interna _Time que posee Unity, similar a Time.deltaTime. Esta es un Vector4 con diferentes tipos de tiempo en cada una. Aquí podemos ver más información de esa y de otras variables internas de Unity: Por otro lado vamos a hacer uso de la función seno de CG para las ondulaciones. Creamos una nueva función en nuestro shader, de nombre flag que devuelva un fixed4. Además tendrá como parámetros la vertexPosition y las uv. Tened en cuenta que el shader compila de arriba hacia abajo, asique si escribís vuestra función al final y la usáis antes, dará error. Siempre tenéis que crear vuestras funciones antes de usarlas (a diferencia de C# por ejemplo). ahora dentro vamos a ir sumando a la vertexPosition el seno de _Time.y (el tiempo por defecto).Lo igualamos en la función vert al o.vertex quedando así: Estamos simplemente moviendo los vértices del input y asignándoles al output. Posteriormente convertimos con el UnityObjectToClipPos y seteamos las uv del input al output. Si probamos el efecto, vemos el movimiento pero no es lo que queremos. Esto es debido a que el seno en Time es constante por lo que siempre se mueve de forma uniforme. Vamos a añadir el valor de uv.x (valor de 0 a 1) y restarle el Time para conseguir el efecto que queremos. De esta forma funciona, pero vamos a necesitar ajustarlo. Para esto vamos a crear tres propiedades de tipo Range. Esto es similar al atributo Range de Unity para los valores numéricos en C#. Te permite mostrar un float en el inspector del material y moverlo con un slider entre dos valores. Ahora podrás ver las tres variables en el editor. Pero para poder usarlas tenemos que declararlas en CG con el mismo nombre que tengan en la propiedad (_Speed,_Frecuency, _Amplitude). Usaremos el tipo fixed. Estas variables las vamos a usar de la siguiente forma: Speed: va a multiplicar al _Time.y para acelerar y reducir la velocidad. Frecuency: va a multiplicar a la resta entre uv.x y la multiplicación del Time y la speed. Justo antes de hacer el seno. Amplitude: multiplica al valor una vez el seno se ha calculado. Estos son los tres cálculos básicos a la hora de modificar la ondulación. Grábalos en tu mente (o apuntalo mejor) porque los usarás muchas más veces en tu vida. Si todo ha ido bien, podrás ajustar los valores como quieras para mejorar la ondulación. Aquí puedes ver mi configuración: Solo nos quedan dos pasos para terminar. El primero es hacer que la bandera se pegue al poste y no ondule. Esto es muy fácil de conseguir teniendo las referencias de uv.x que, como dijimos van de 0 a 1. Solo tenemos que multiplicar el seno que tenemos por la uv.x. De esta forma anclamos la bandera, consiguiendo que la ondulación vaya de mayor a menor fuerza desde el poste (gracias al valor entre 0 y 1 de uv.x) Lo otro que nos queda es añadirle color. Aquí voy a poner dos opciones, la primera es la básica, añadir un color sin más. Si estás cansado y no quieres continuar es la opción que te recomiendo. Podrás volver otro día para ver la segunda opción. En la segunda opción usaré un lerp para darle a la bandera 3 colores diferentes en función de la Y de su UV. Añadir color básico Simplemente tendrás que añadir una propiedad _Color y una variable de CG para conectarla (al igual que la _Speed y los demás valores anteriores). En este caso el color tiene cuatro valores, así que usaremos fixed4. Y en la función frag devolvemos el color a pelo. Añadir color avanzado Si venimos del básico vamos a borrar la propiedad de color (o cambiarle el nombre) y crear otras tres diferentes. Estas se llamarán ColorTop, ColorMiddle, ColorBotton (o el nombre que tu quieras). Estos tres colores serán las tres franjas que tendrá la bandera. Ahora creamos una función nueva encima de frag con el nombre getPixelColor que devolverá un fixed4. Esta función analizará la posición de la uv en Y (la necesita como parámetro) y haciendo uso de la función lerp y step nos devuelve un color u otro. ¿Qué hacen realmente cada una de estas funciones? Puede ser complicado de leer tal y como está, pero solo necesitas saber lo que hace para entenderlo. La función lerp interpola entre dos valores con un valor t. Cuando t es 0 devuelve el primer valor y cuando es 1 devuelve el segundo valor, devolviendo valores intermedios. En nuestro caso no queremos valores intermedios, queremos una interpolación directa dado un valor de referencia. El valor de referencia será ⅓ ya que tenemos 3 franjas. La función step tiene dos parámetros, si el primero es mayor que el segundo, devuelve 1, si es menor devuelve 0. Esto unido al lerp hace que en valores superiores a 0.33 pero inferiores a 0.66 se coloree del color del centro. Y de igual forma en valores superiores e inferiores. Con esto hemos llegado al final de la entrada. Si tienes cualquier duda con esto déjamela en los comentarios. PD: Si queréis que la bandera se muestre en ambas caras, tendréis que cambiar un valor del Cull. Esto es fácil de hacer pero da para otra entrada junto a otros añadidos como el Blend el ZTest o el ZWrite. De momento para que te quede perfecto, solamente tendrás que añadir junto antes del Pass (o dentro del Pass antes de CGPROGRAM) la siguiente linea: Con Cull en Off no ocultará ninguna cara. Nos vemos en la próxima entrada.
  39. 1 point
    Puedes asegurarte de que una variable no es nula añadiendo ‘?’ antes de acceder a ella. Puedes crear strings con variables dentro añadiendo ‘$’ delante y las variables entre corchetes. Puedes sacar un material de un shader concreto creándolo con el shader seleccionado. Puedes cambiar la respuesta de Unity cuando realizas cambios en un script mientras estás en Play. Sólo tienes que ir a Edit/Preferences/General Puedes cambiar la configuración del orden de transparencia desde Project Settings/Graphics. Muy útil para juegos 2D donde quieras controlar el orden de pintado en función de su Y.
×
×
  • Create New...