Jump to content

Leaderboard


Popular Content

Showing content with the highest reputation since 07/05/2019 in Posts

  1. 7 points
    Hola gente les dejo un link a mi curso de youtube, totalmente gratuito y disponible para la comunidad. Esta totalmente actualizado al 2020 y hecho por mi, soy programador con titulo universitario y 10 años de experiencia en unity! El curso esta dividido en niveles de dificultad, Comenzando para gente que nunca toco unity y terminando con contenido muy avanzado como creacion de framework propios para multiplayer, entre otras cosas. Para que los usuarios mas avanzados puedan saltearse las partes que no les sirve y explorar mas fácilmente el contendio. Son mas de 200 videos, con muchisimas horas de grabacion que complete con la intención de subir a udemy. Al terminarlo cambie de parecer y ahora lo estoy subiendo de forma gratuita a youtube. Se sube 1 video cada dia de forma atomatica, y ya estan todos los videos seteados para subirse a youtube de forma automatica a este ritmo. Link: https://www.youtube.com/channel/UCl3p_fKnx2-GIUWVbiDAcMg Sin mas, espero verlos por mi canal y que les sirva el curso. Un saludo!!
  2. 6 points
    Estoy leyendo el libro "Unity Game Optimization" que está en Packt y la tercera edición es de noviembre de 2019. He hecho un resumen de los apartados dedicados a scripting que me parecen muy buenos. Algunos los conoceréis, otros no y otros es posible que no supiérais porqué utilizar una manera u otra. En todos los casos el concepto de optimización ve sus frutos cuando es un desarrollo de cierto tamaño. Desde mi punto de vista, si empiezas con buenos hábitos, luego no tendrás los mismos problemas de rendimiento que el resto de desarrolladores. La optimización se debe realizar desde el día 1. Paso a relatar. Optimización 1 Eliminar las callbacks vacías de Start() y Update() al crear un script si no son necesarias. El tenerlas afectará a la inicialización de la scene y al instanciar prefabs. La de OnGUI() es especialmente problemática ya que puede llamarse más de una vez por frame. En la de Update() se realiza un Native-Managed Bridge, o sea, hay que enlazar el modo managed de C# con el del código nativo dependiente de plataforma. En general no dejar nunca una callback vacía. Optimización 2 Cómo obtener los componentes de un GameObject. Hay tres maneras de hacerlo, aunque a la práctica se utilizan dos de ellas. Los datos hablan por si mismos para 30.000 objetos. // 6413 ms test = (TestComponent)GetComponent("TestComponent"); // 89 ms test = GetComponent<TestComponent>(); // 95 ms test = (TestComponent)GetComponent(typeof(TestComponent)); El mejor es del uso del template o tipo genérico. Como en C++ ;) Optimización 3 Cachear los GetComponent, preferiblemente en el Awake. Esto es realmente crítico si se realiza en el Update. Al final obtendremos un mejor rendimiento a cambio de un coste de memoria mínimo (entre 32 ó 64 bytes por item dependiendo de la plataforma). Optimización 4 El uso de funciones dentro de Update. Si las acciones no requieren se llamadas en cada frame es mucho mejor convertirlo a un InvokeRepeating que puede llamarse en el Start y cancelarse en el OnDestroy: private void Start() { InvokeRepeating("ProcessAI", 0f, _aiProcessDelay); } Optimización 5 La comparación de objetos null. La llamada directa de "gameobject == null" genera una conversión Native-Managed Bridge con la consiguiente sobrecarga. Es mucho mejor utilizar el ReferenceEquals que no utiliza la conversión. Por eso se incluyó en Unity: if (!System.Object.ReferenceEquals(gameObject, null)) { // No es null } Optimización 6 La comprobación con Tag directa genera memoria adicional y hará actuar al GC posteriormente. Utilizar el CompareTag no utiliza memoria ya que evita el Native-Managed Bridge completamente y tarda la mitad de tiempo: // Asignación de memoria y GC. Tarda el doble de tiempo if (gameObject.tag == "Player") { // realizar acción } // Evita el Native-Managed Bridge totalmente. No asigna memoria adicional if (gameObject.CompareTag ("Player")) { // realizar acción } Optimización 7 Dictionary vs List. Las List son mejores para iteraciones. Los Dictionary son mejores para búsquedas aleatorias. El Dictionary es peor para las iteraciones debido a que debe realizar una comparación hash para cada uno de los elementos. De todos modos tener los dos tipos en algunas situaciones no es mala idea. Optimización 8 La Transform. Cuando instanciamos un nuevo GameObject con GameObject.Instantiate(), uno de sus argumentos es el componente de la Transform del parent que queremos asignar, que por defecto es null y colocará el GameObject en el root. Todas las Transforms que está a nivel root necesitar crear un buffer de memoria para poder almacenar los children que tienen más aquellos que vendrán después. Esto no ocurre con las Transforms que son child. Pero si una Transform en root le cambiamos el parent una vez creada y la reasignamos, se procederá a descartar el buffer de memoria que iniciamos en el Instantiate. Para evitar esto es mejor proveer del parent en la función. Otro apartado interesante es que, hay una propiedad en la Transform llamada hierarchyCapacity. Si somos capaces de estimar el número de Transform child de este objeto root, podremos reducir el número de asignaciones de memoria. Optimización 9 World Position, World Rotation, World Scale. Cuánto más profundo esté en la jerarquía un objeto mayores cálculos son necesarios para determinar el resultado final de su estado. Esto significa que es mucho más eficiente utilizar los elementos de Local que de World. Optimización 10 Cambios en la Transform. Si es posible, agrupar todos los cambios en una Transform y no realizarlos hasta el final de todos los cálculos y en FixedUpdate. Esto evitará movimientos extraños o teleportaciones de los objetos debido a que Unity lanza eventos internos cada vez que una Transform es modificada. private bool _positionChanged; private Vector3 _newPosition; public void SetPosition(Vector3 position) { _newPosition = position; _positionChanged = true; } private void FixedUpdate() { if (_positionChanged) { transform.position = _newPosition; _positionChanged = false; } } Optimización 11 SendMessage y Find. El método SendMessage() y la familia de métodos GameObject.Find() so especialmente costosos y deben evitarse en su totalidad. El método SendMessage() es como 2,000 veces más lento que una simple llamada a una función, y el coste de Find() se escala pobremente según la complejidad de la scene aumente ya que tiene que iterar por todos los GameObject de la misma. Optimización 12 No solamente Occlusion Culling/Frustum Culling. Para los objetos que solamente tienen renderizado es factible utilizarlas únicamente. Otros objetos que utilicen cálculos internos de manera constante continuarán consumiendo a pesar del Culling. Una buena solución a este problema es utilizar las callbacks OnBecameVisible() y OnBecameInvisible(). Como los nombres dicen, estas callbacks son invocadas cuando un objeto renderizado se ha vuelto visible a una cámara o invisible respecto a todas las cámaras de la scene. Además, cuando hay múltiples cámara en la scene (por ejemplo en un juego multiplayer) las callbacks son solamente invocadas cuando es visible para una cámara o invisible para todas ellas de igual modo. Esto significa que las callback serán llamadas en el momento preciso que se necesitan. Si nadie puede ver el objeto se llamará a OnBecameInvisible(), si como mínimo un player puede verlo se llamará a OnBecameVisible(). Optimización 13 Distance vs sqrMagnitude. El cálculo de raíces cuadradas para las CPU implica bastante proceso comparado con otras instrucciones. Cuando tengamos que utilizar un cálculo de distancia, y si no requerimos de una precisión extrema, es mejor utilizar sqrMagnitude y valor a comparar por su potencia de 2. // Utilizar la raíz cuadrada en Distance() float distance = (transform.position – other.transform.position).Distance(); if (distance < targetDistance) { // dentro de distancia } // No realiza el proceso anterior float distanceSqrd = (transform.position – other.transform.position).sqrMagnitude; if (distanceSqrd < (targetDistance * targetDistance)) { // dentro de distancia } Optimización 14 Datos de Prefab a un Scriptable Object. Si tenemos muchos diferentes tipos de Prefabs que contienen datos que pueden compartirse entre ellos, como fuerza, velocidad, puntos, etc. entonces todos estos datos serán serializados en cada Prefab que luego se instancie. Una mejor solución es serializar estos datos en un ScriptableObject. Esto reduce la cantidad de datos a serializar en el Prefab, el tiempo de deserialización y el tamaño del Prefab en sí mismo reduciendo el tiempo de acciones que serán repetitivas. Optimización 15 Update(). Una mejor solución al problema del Update() es no utilizar nunca, o mejor dicho, una sola vez. Cuando Unity llama al callback Update(), o cualquiera relacionado, cruza la ya comentada frontera del Native-Managed Bridge que es una tarea costosa en términos relativos. En otras palabras, el coste de procesamiento de 1.000 Update() independiente será mucho más costoso que la ejecución de un Update() con 1.000 funciones. Para poder minimizar este problema es mejor agrupar todos los Update() en un solo Update() global que luego llame a las diferentes funciones que requieran la acción.
  3. 6 points
    Introducción En esta ocasión vamos a crear una Carta con un efecto 3D similar a la que vemos en el gif anterior. Para ello vamos a partir de un proyecto donde tenemos preparados los assets necesarios. Este proyecto podemos descargarlo desde aquí: URL: https://drive.google.com/open?id=19J6lgCA-DH28lMu9dmntk1K5l3lPE66f Una vez descargado vamos a abrirlo desde el Unity Hub. Este proyecto está creado con la versión 2019.2.9f1 asique podría ser incompatible con versiones anteriores. Una vez abierto vamos a tener una escena llamada “Sample Scene” y una serie de carpetas con los modelos,sprites,prefabs… necesarios. Además contamos con los paquetes TextMeshPro y PostProcessing que usaremos a lo largo del tutorial. Puedes acceder en todo momento a los paquetes usados a través del Package Manager. Preparando el proyecto En primer lugar vamos a abrir la escena “Sample Scene” y vamos a arrastrar en ella el prefab “Hornet” dentro a la ventana de Hierarchy. Verás que aparece en rosa, eso es debido a que no tenemos aún ajustado el Render Pipeline. Vamos a empezar por ahí. Vamos a crear una carpeta Settings donde colocaremos aquellos ajustes globales del proyecto. Siéntete libre de elegir otro nombre, yo siempre soy malisimo poniéndolos. Una vez creada vamos crear una configuración pulsando click derecho y Create/Rendering/LightweightRenderPipeline/PipelineAsets. Elige el nombre que quieras y seleccionalo para verlo en la ventana de Inspector. Aquí tenemos los ajustes del Render Pipeline. La configuración es muy intuitiva y prácticamente todo hace lo que indica. En nuestro caso solamente vamos a activar el HDR y el antialiasing. Lo demás no lo tocaremos, aunque esto va de experimentar, así que “rómpelo” a tu gusto. Una vez creado vamos a añadirlo a nuestro proyecto, para ello vamos a irnos a ProjectSettings/Graphics y lo colocamos en el hueco de Scriptable Render Pipeline Settings. Hecho esto si volvemos a la escena podemos ver que el color rosa ha desaparecido. Aunque ahora se verán blanco. No te preocupes que ese será nuestro siguiente paso. También verás que hay una luz añadida dentro del prefab de Hornet. Está configurada por mi pero llegado el punto puedes quitarla o cambiarla como quieras. Creación de Shaders Vamos a darle color a nuestros objetos ahora. Como has podido ver todos los objetos están en blanco. Eso es porque nuestros shaders y materiales están por defecto. Para nuestro objetivo vamos a necesitar crear un shader con la herramienta Shader Graph. Esta ya viene por defecto en todos los proyectos que usen el Scriptable Render Pipeline nuevo. Para ello vamos a crear una nueva carpeta llamada Shaders y vamos a crear un nuevo Shader PBR (Create/Shader/PBR Graph). Puedes ponerle el nombre que quieras, en mi caso lo he llamado Standard_SG (ya he dicho que soy muy malo poniendo nombres). Vamos a seleccionarlo y abrirlo. No es el objetivo de este taller aprender a usar ShaderGraph, asique no voy a pararme en explicar el contenido, aunque como veréis es muy fácil e intuitivo lo que haremos. Crearemos las siguientes variables: Conectaremos al Albedo un Sampler de una textura y la multiplicaremos por un color. Cómo veis el shader es lo más simple posible. Haremos lo mismo en el canal de Emission para poder ajustar la emisión de algunos objetos posteriormente. Pulsamos en Save arriba a la izquierda y cerramos. Ya tenemos nuestro shader creado pero tenemos un problema que veremos a continuación. Stencil Buffers Para obtener el efecto que buscamos tenemos que conocer el concepto de Stencil Buffer. Con ellos podemos principalmente renderizar unas partes de un objeto y descartar otras. Aquí podemos obtener más información: https://docs.unity3d.com/Manual/SL-Stencil.html https://www.ronja-tutorials.com/2018/08/18/stencil-buffers.html El objetivo es mantener “invisible” un objeto y que cuando este se encuentre en la “visión” de otro objeto, se muestre. Vamos a necesitar por dos shaders: Uno que leerá del stencil buffer y se dibujará solo donde el búfer tenga un valor específico, en cualquier otro lugar se descartará. Por otro, un shader que permanerá siempre invisible y que solamente mostrará aquellos valores específicos que coincidan con el stencil buffer. Para el primer solo necesitamos añadir unas líneas, pero actualmente no es posible hacerlo a través del ShaderGraph. Por lo que vamos a realizar una transcripción del Shader Graph al código. Para esto vamos crear un nuevo Shader Unlit pero esta vez no será de ShaderGraph. Le ponemos de nombre Standard_StencilRead por ejemplo y lo abrimos. Mientras se abre vamos a volver al Shader Graph y vamos a realizar la copia del código del shader. Para ello nos vamos al PBR Master Node y con el botón derecho seleccionamos Copy Shader. Una vez copiado vamos a pegarlo en nuestro reciente nuevo shader unlit creado, sobreescribiendo todo lo que este tuviese. También deberás cambiar la primera línea y ponerle tu la dirección y el nombre que elegimos antes. En mi caso lo he guardado en MyShaders con el nombre Standard_StencilRead. Ahora tenemos el mismo shader de Shader Graph pero en código para poder modificarlo. Vamos a necesitar añadir una nueva propiedad que será el valor específico del stencil. Simplemente dentro de properties al final, debajo del Color añadimos lo siguiente: [IntRange] _Stencil ("Stencil Value", Range(0,255))= 0 Quedando de la siguiente manera: Por último vamos a necesitar añadir los ajustes del Stencil debajo de los Tags antes de los diferentes pases. Esto hará que sólo cuando tengamos el valor de referencia, el objeto se muestre. Podemos obtener más información sobre la sintaxis y el contenido en los enlaces que anteriores. Ya podemos guardar el shader y volver a Unity. Tenemos preparado nuestro primer Shader. Para el segundo simplemente creamos otro shader unlit de nombre StencilWrite por ejemplo. Este estará siempre invisible y servirá para mostrar los objetos que compartan valor de referencia. Abrimos el shader y lo modificamos de la siguiente forma: En properties añadimos el valor de Stencil como con el anterior y eliminamos cualquier otra propiedad (normalmente textura) ya que este shader queremos que se muestre totalmente invisible. Añadimos el Stencil y le decimos que esté siempre comparando y si en algún momento el valor de referencia es el mismo, lo reemplace. Ahora le decimos al buffer de profundidad que no se escriba (por ser un objeto que será invisible) y cambiamos el modo de Blend. Podemos obtener más y mejor información de esto aquí: https://docs.unity3d.com/Manual/SL-Blend.html También eliminamos todos los añadidos de Fogs por defecto de Unity y aquellas referencias a texturas que no nos interesan. Por último hacemos que la función frag devuelva siempre 0, ya que como hemos comentado esto se muestra siempre como invisible. Con esto tenemos todo listo para pasar al montaje de la carta. PD: Asegurate también de que lo tienes en la misma ruta que el anterior. Esto no es necesario, pero te facilitará encontrarlo más adelante. En mi caso al igual que antes, esta en la ruta MyShaders. Montaje de la carta Para empezar vamos a cambiar por fin el blanco de nuestra escena, para ello vamos a irnos a Materials/Hornet y seleccionando todo vamos a elegir nuestro Shader (en este caso el Standard_StencilRead) Ahora tendremos que arrastrar las texturas requeridas (Main Texture y Emission Texture) si procede y establecer el MainColor en blanco (tened cuidado que el alfa no este a 0) y el EmissionColor en negro. En el caso que no tengamos texturas (como en el caso del personaje Hornet) simplemente cambiale el MainColor a tu gusto. Puedes hacerlo similar al original o ponerle tu propia versión. Así quedaría el del grass_material por ejemplo: O el dress_material, que no tendría textura: Sigue estas pautas en los demás materiales. El stencil value lo cambiaremos más adelante, de momento necesitamos ver en pantalla todo y no solo cuando este a través de nuestro “marco”.. Una vez terminado debería de quedarte algo similar a esto: Ahora vamos a crear un nuevo objeto en la escena llamado Card y lo ponemos en la posición 0,0,0. Ahora buscamos el Sprite “cover” dentro de Sprites y lo arrastramos dentro de Card. Le damos el tamaño a nuestro gusto. Este será el envoltorio de la carta. Ahora vamos a crear un Quad dentro de Card. Le ponemos de nombre StencilMask y lo colocamos en la posición 0,0,0 también. Este será nuestro marco a través del que se verá nuestra Hornet. Para poder ajustarlo vamos a tener que configurar ya el valor de referencia del stencil así como crear un nuevo material StencilWrite para nuestro quad recién creado. Vamos a empezar por esto último, crearemos un nuevo material con el shader StencilWrite. Lo colocamos dentro de Materials para tenerlo ordenado. A este material le vamos a poner en el valor de Stencil el valor 2 por ejemplo. Es simplemente un valor referencia, mientras tanto el receptor como el emisor tengan el mismo, funcionará. Una vez configurado vamos a arrastrarlo al StencilMask (o cambiamos el material dentro de MeshRenderer) para colocarselo. Veréis que se ha vuelto invisible, eso es que funciona como debería. Por último vamos a irnos a los materiales StencilRead que configuramos anteriormente y vamos a ponerles el mismo valor de referencia al Stencil. Seleccionamos todos o uno a uno y en Stencil Value le colocamos 2. Ahora debería de volverse todo invisible en la escena quedando solo la carta en negro. Vamos a desactivar de momento la carta llamada “cover” (o el nombre que tu le hayas puesto) de la ventana de Hierarchy. No se ve nada pero no es un error. Ahora mismo todos los shaders tienen el mismo Render Queue por lo que nuestro efecto no está funcionando. Más información de esto aquí: https://docs.unity3d.com/Manual/SL-SubShaderTags.html Sabiendo esto solamente tendremos que asegurarnos que nuestro StencilWrite se renderice antes. Vamos a nuestro material y le restamos 1 al RenderQueue. Con esto ya deberiamos tener visible nuestro modelo únicamente cuando estemos viendolo a través de nuestro quad. Ahora volvemos a activar el cover para ajustar la carta y el hueco como queramos. Al activarlo verás que tapa la visión a través del quad. No te preocupes, simplemente ve a los ajustes del SpriteRenderer del cover y cambia el MaskInteraction a Visible Outside Mask. Ahora ajustamos el Quad hasta tener el tamaño que deseemos. Una vez confirmado podemos probar a girar en la escena alrededor de la carta para comprobar el efecto. Para organizar mejor la escena vamos a colocar el objeto Hornet dentro de Card y vamos a crear un prefab para tenerlo guardado. Gracias a los Nested Prefab ya podemos hacer prefabs dentro de prefabs, asique nos viene genial. Ahora solo nos falta añadirle algo de texto. Vamos a usar TextMeshPro para esto. Pulsamos botón derecho y creamos un nuevo texto en 3D. Vamos a empezar por el nombre de la carta, por lo que le ponemos de nombre al text “Name” por ejemplo. Vamos a escribir el texto del nombre en el apartado Text y vamos mover y escalar el objeto colocándolo donde más nos guste. En mi caso he decidido ponerlo arriba. Vereis que no se ve cuando lo colocamos en la zona de la carta. Eso es por el orden de renderizado que tienen. Vamos a abrir los ajustes extra del texto (extra settings) y vamos a subirle el orden in layer a 1. Con esto conseguimos verlo, pero existe un problema, que el texto aparece también por detrás. Esto lo solucionaremos más adelante ya que tendremos que añadir un script simple para que active el culling. Llegados a este punto me he dado cuenta de que la carta está colocada del revés y el nombre por la parte trasera se ve invertido. En nuestro caso podemos solucionarlo rápido ya por delante la carta no se ve afectada. Simplemente nos vamos al objeto “cover” y marcamos Flip X. De esta forma la parte de atrás estará perfecta. En el caso de que tuvieras una imagen diferente deberías tener cuidado ya que la carta es la misma tanto en la partal como en la dorsal. Todo se dará la vuelta. Si quieres tener un control más exacto, deberás tener una carta delantera y otra trasera, cada una con su ajustes (y quizás optimizada para no pintar dos cada cara). Vamos a guardar el avance, aplicamos el prefab y guardamos escena. Deberíamos tener algo similar en estos momentos: Vamos a crear ahora otro texto para colocarlo en la parte de debajo. Duplicamos el objeto Name con Control+D y cambiamos el nombre a Description. Movemos el objeto a nuestro gusto, en mi caso lo coloque en la parte de abajo, centrado. Puedes tocar los ajustes del TextMesh que son maravillosos, sobre todo si has trabajado con el deprecado Text. Si queremos podemos cambiar la fuente. Para ello simplemente tendrás que descargarla de internet (o obtenerla de otra forma) y meterla dentro de Unity. Una vez dentro no es simplemente arrastrarla. Para poder usarla en TextMesh necesitarás crear un atlas de la fuente. Pero es fácil de hacer, simplemente abre la ventana Font Asset Creator desde WIndows/TextMeshPro. Selecciona la fuente y pulsa Generate Font Atlas (si quieres cambiar algún otro ajuste puedes hacerlo, pero ten cuidado. Más información sobre esto aquí: http://digitalnativestudios.com/textmeshpro/docs/font/ ) Una vez generada simplemente guárdala donde quieras y luego colócala en el texto dentro de Main Settings: Una vez tengamos la descripción vamos a guardar el prefab y a colocar los Post Procesos. Para ello Vamos a ir a la cámara y vamos a asegurarnos que tiene añadido un Post Process Layer. Esto es imprescindible para poder continuar. También vamos a activar a antialiasing FXAA y vamos a crear un nuevo layer PostProcessing para posteriormente usarlo en el Volume. Ahora vamos a crear un nuevo objeto en la escena. Le vamos a añadir el componente Post Process Volume. Vamos a marcar IsGlobal porque solo tendremos este para toda la escena y vamos a seleccionar un profile. En nuestro caso no tenemos ninguno creado, asique le daremos a New. Ahora simplemente asegurate de que este objeto está en el Layer PostProcessing De otra forma no funcionará y no podremos ver ningún cambio. Una vez configurado podremos ir añadiendo efectos ya creados por Unity o crear los nuestros propios. En este caso vamos a usar dos creados, el Bloom y el Color Grading. Pulsamos en Add Effect y seleccionamos uno y después el otro. Aquí puedes sacar tu lado artístico y elegir la configuración que más te guste. En mi caso después de una serie de pruebas quedó así: En este punto deberías tener algo similar a esto. Si no es así asegúrate de que el material del lazo tiene un emission color bien configurado. Por último nos queda solucionar el error del texto por ambas caras. Para eso simplemente vamos a crear un script con el nombre CullingTextMeshPro o el que querais y vamos a dejar solo la función Awake con el siguiente código: De esta forma al darle al Play el texto automáticamente hará culling y no se renderiza por detrás. Estuve informándome sobre otras formas de hacer esto, pero las respuesta de Unity fueron que esta era la forma. Pero si conocéis otra forma contactad conmigo y lo actualizo. Espero que os haya gustado y hayáis aprendido cosas nuevas que al final es el objetivo esto. Cualquier duda contacta conmigo via twitter: https://twitter.com/_davidlopez29 o por aquí Hasta pronto!
  4. 6 points
    Hola soy James Roman, tengo ya varios años trabajando con Unity, y actualmente trabajo en una compañía como desarrollador de experiencias en Realidad Virtual. Y tengo ya bastante tiempo trabajando en VRLAB. Puedes verlo desde aqui. ¿Que es VRLAB? Es básicamente una colección de componentes para interacciones en VR usando Oculus, me he enfocado bastante en las armas ya que creo que es una de las cosas mas divertidas de probar en la Realidad Virtual, he incluido diferentes tipos de armas, escopetas, armas automáticas, revolver, arco y flecha, espadas. También diferentes tipos de recarga para estas armas, puedes cambiar manualmente el cargador a cada arma cuando este se agote, recargar usando diferentes tipos de gestos como en dead and buried, puedes recargar el revolver haciendo un giro rápido con la mano. - Armas - Como ya he mencionado he trabajado bastante el tema de las armas con un completo sistema de armas, varias armas ya incluidas (Escopetas, revolver, Automáticas), puedes tomar las armas existentes como base para crear las tuyas, o crear nuevas armas desde 0. - Completo Sistema de Interacción - También posee un completo sistema de interacción, muy extensible, puedes tomar objetos, interactuar con objetos, mover palancas, botones etc, crear animaciones de interacción diferentes para cada objeto, y diferentes comportamientos incluso para cada mano. - Arco y Flecha - Posee un arco realista con el cual puedes lanzar flechas, puedes tomar una flecha de tu espalda o simplemente tomar una que ya hayas lanzado, estas se pegan a los demás objetos de una manera bastante realista. - Diferentes Modos de Recarga - Posee diferentes formas para poder recargar las armas, puedes cambiar el cargador una vez que este se haya acabado, o simplemente realizar gestos con la mano como en dead and buried para recargar tus armas o simplemente tener munición infinita. - Sistema de Combate Cuerpo - En VRLAB puedes tomar un par de espadas y luchar contra los enemigos, los cuales responderán correctamente a las físicas, ademas de eso puedes golpear a los enemigos con tus armas, como con el arco o una escopeta si no tienes munición. - Botones y Palancas - Botones y palancas que responden correctamente a las físicas, desde las distancia puedes activar una palanca con un disparo o simplemente lanzando un objeto. - AI - Aunque el fuerte de este asset no esta en la AI, he añadido unos ejemplos bastantes interesantes y extensibles para trabajar con estos mismos. - Character Controller y Teleport - Tienes diferentes formas de moverte en VRLAB, la mas común quizás moviéndote alrededor con el joystick o usando un sistema de teleport muy parecido al de roborecall. Todo esto en prefabs bien organizados listos para tomar y soltar en la escena, con montones de posibilidades de modificación mediante el inspector, de igual manera me he esforzado para crear un código legible y placentero a la vista, así que si quieres simplemente entrar y mirar como esta hecho todo, y aplicar tus propias modificaciones mediante código, no debería ser muy difícil para alguien que tenga ya su experiencia con Unity. - Futuras Actualizaciones - - Añadir nuevas armas, entre ellas un lanzacohetes. - Sistema de inventario, para que puedas cargar varios objetos a la vez. - También cabe destacar que me gusta roborecall, y quizás añada algunas de sus funciones, entre ellas la posibilidad de tomar balas en el aire y devolverlas a los enemigos. - Luego simplemente escucharlos a ustedes y seguir mejorando. Dejo nuevamente el link al assetstore aqui, si lo pruebas no dudes en dejar un review para seguir mejorando, y si quieres contactar conmigo directamente puedes escribirme a james@unity3dninja.com finalmente los dejo con algunos vídeos cortos mostrando distintas funcionalidades.
  5. 6 points
    Hola a todos, mi nombre es David y este es el primero de una serie de tutoriales sobre Unity3D. Esta iniciativa surge del programa Unity Student Ambassador y están creados por mi inicialmente para workshops presenciales. Los he adaptado a este formato pero si tienes cualquier duda no dudes en preguntarme. Espero que os guste. Introducción ¿Que es Shader Graph? La creación de shaders en Unity ha sido tradicionalmente el terreno de juego de personas con habilidades para programar. Shader Graph abre el campo para artistas y otros miembros del equipo para que la creación de shaders sea mucho más sencilla. Solo conecta nodos en una red gráfica y podrás ver los cambios al instante. Requisitos El Shader Graph está disponible desde Unity 2018.1. Está diseñado para funcionar con otra característica de Unity 2018.1: Scriptable Render Pipeline (SRP). Por lo tanto, no puede usarlo con el Built-In Unity Renderer. Tiene por tanto soporte tanto para LWRP como para HDRP (o para su propio SRP). Para este tutorial usaré la versión 2019.2.9f1. ¡Comencemos! Lo primero que necesitamos es abrir Unity y crear un nuevo proyecto. Asegúrese de que elige usar el nuevo SRP. En nuestro caso elegiremos el LWRP. Confirmamos y esperamos que Unity lo prepare todo. Una vez dentro de Unity ya podemos ponernos a trabajar. Por defecto debería tener incluido el paquete Shader Graph. Puedes comprobar ese y otros paquetes instalados en Windows/Package Manager. Nuestro primer Shader En la ventana Project, pulsamos el botón y elegimos Create/Shader/PBR Graph. Si queréis conocer más acerca del PBR está es una buena guía: https://blog.teamtreehouse.com/beginners-guide-physically-based-rendering-unity Nombramos el archivo con el nombre que queráis. En este caso le llamaremos Standard_Color. Ya tendríamos nuestro primer Shader creado, vamos abrirlo. Lo seleccionamos y en la ventana Inspector pulsamos Open Shader Editor. Si todo ha ido bien, deberíamos ver esto: Dentro del Shader Editor podemos ver tres sectores claramente diferenciados: PBR Master Node: Es el nodo principal, al que acaban llegando todos los demás. Es el encargado de mostrar las características en el material. BlackBoard: Puedes activarlo y desactivarlo arriba a la derecha. Es donde creas y guardas las propiedades que necesitas usar. Encontrarás Colores, Vectores, Texturas etc… Estas pueden aparecer en el inspector del material para ser usadas más adelante. Preview: Es la previsualización actual de la entrada del PBR Master Node. Puedes cambiar el tipo de renderización pulsando el botón derecho. (Cubo, quad,sphere…) Una vez conocemos las partes vamos a añadirle funcionalidad a nuestro nuevo Shader. Comencemos añadiendo color. Vamos a abrir el Blackboard y vamos a pulsar en el +. Con esto podremos crear una variable de entre las que Shader Graph nos ofrece. En este caso elegiremos Color. Ahora podremos cambiarle el nombre, pero en nuestro caso lo dejaremos tal y como está, con el nombre Color, que al fin y al cabo es lo que será para nosotros. El toggle de Exposed indica si quieres que esa variable aparezca posteriormente en el material para ser editada de forma rápida. En nuestro caso así lo queremos así que la dejamos marcada. En Default puedes elegir el color que desees por defecto, como he dicho podrás cambiarlo después en el material pero si quieres ver como queda en el Shader Editor tendrás que cambiarlo aquí. Por último el Mode te permite establecer el color como HDR. Puedes hacer efectos realmente atractivos con esto pero de momento lo dejaremos como está. Una vez creado nuestro Color vamos a arrastrarlo hacia el Grid donde esta el PBR Master y lo soltamos. Como vemos este nodo Color solo tiene una salida, conectamos la salida con la entrada de Albedo. Si habías cambiado el color default verás que la Preview ahora aparece de otro color. Sino puedes ir ahora y cambiarlo. Una vez hecho esto pulsamos arriba a la izquierda en Save Asset y podemos cerrar el editor. Ahora solo nos falta ver nuestro shader en pantalla. Para esto añadimos una esfera a la escena y creamos un nuevo material. Le pondremos de nombre Standard_Color_MAT, por ejemplo. Una vez creado el material, lo seleccionamos y en el desplegable del Shader elegimos ShaderGraph/Standard_Color o como llamases a tu Shader. Arrastramos nuestro nuevo material y lo soltamos encima de la esfera y … Ahora podemos cambiar cambiar desde el Material el Color, ya que anteriormente lo activamos. Nodos importantes Antes de continuar el tutorial voy a explicar algunos de los nodos más usados ya que los vamos a usar más adelante. Me dejo muchos pero para esta introducción son suficientes: Math Basic: Son las operaciones matemáticas más comunes. Suma, División, Multiplicación, Resta … UV: Son nodos que actúan sobre las coordenadas de uv. Podemos rotarlas, moverlas y darle algunos efectos como el Twirl o Spherize. Veremos un ejemplo más adelante. Shapes: Son texturas generadas proceduralmente dentro del editor. Podemos crear círculos, rectángulos, polígonos etc… One Minus: es simplemente la operación 1 - x. Es muy útil como veremos más tarde, tanto que tiene su propio nodo. Noise: es un nodo generador de ruido. Veremos también su uso más adelante. Step: es un nodo que dado un valor entre 0 y 1, compara la entrada con ese valor y devuelve 0 si es menor y 1 si es mayor. Por ejemplo: si nuestro valor es 0.4, todos los valores por encima que entren en el nodo, serán convertidos a 1 y todos los inferiores serán 0. Dot: es un nodo que calcula el Producto Escalar entre vectores. Devuelve 1 si apuntan exactamente en la misma dirección, -1 si apuntan en direcciones completamente opuestas y 0 si los vectores son perpendiculares. Lerp: es un nodo que devuelve el resultado de la interpolación lineal entre las dos entradas en función de la entrada T. El valor de la entrada T está sujeto al rango de 0 a 1. Por ejemplo, cuando el valor de la entrada T es 0, el valor de retorno es igual al valor de la entrada A , cuando es 1, el valor de retorno es igual al valor de la entrada B y cuando es 0.5, el valor de retorno es el punto medio de la dos entradas A y B . Dissolve Shader Una vez conocemos los nodos más importantes, vamos a hacer un Shader algo más complejo que el anterior. Vamos a crear un efecto que disuelva el objeto haciendo que desaparezca y aparezca a nuestro gusto: Para esto volvemos a crear un nuevo Shader y le ponemos de nombre Dissolve. Lo abrimos y seleccionando el PBR Master pulsamos en el icono del engranaje. Aquí vamos a encontrar algunos ajustes interesantes como si el objeto es Opaco o Transparente. En este caso lo dejaremos como está (Opaque) y lo único que marcaremos será el Two Sided. Esto hará que el objeto pinte también sus caras internas, lo que conlleva eso sí, un coste extra. Tenlo en cuenta en el futuro, en este caso para el Cubo en cuestión, nos interesa que las caras internas también se vean cuando está disolviendo. Una vez marcado, vamos a crear algunas variables que usaremos. En primer lugar necesitaremos un valor comprendido entre 0 y 1 que se encargue de llevar el progreso disuelto. Será 0 cuando el objeto se vea por completo y 1 cuando esté completamente disuelto. Para eso en el BlackBoard crearemos un Vector1(que no es más que un simple número) y lo nombraremos como Dissolve Value por ejemplo. Para facilitarnos el trabajo, podemos cambiar el tipo de número con Mode. En nuestro caso está comprendido entre 0 y 1 por lo que elegiremos Slider y rellenaremos el min y el max con esos valores. A su vez, necesitaremos también un Color para el objeto, como en nuestro anterior Shader y un Color diferente para la parte que se esté disolviendo. Creamos ambas variables, estableciendo el Color para disolver cómo HDR si quieres que brille como el del gif (necesitarás también tener el paquete de post procesos y activar el Bloom). Por último necesitaremos un valor que indique el grosor que tendrá el dissolve. Podemos revisar el Gif para ver el grosor que tiene la parte que se está disolviendo. Creadas todas las variables en mi caso quedó así: Para el efecto de disolver necesitamos en primer lugar una textura que genere ruido donde las zonas negras indiquen lo que llevamos disuelto y las zonas blancas lo que nos queda por disolver. Por suerte, como vimos antes, tenemos un nodo de ruido perfecto para este uso: Simple Noise, asique lo añadimos. Podemos cambiar el valor de Scale del nodo a nuestro gusto. Cuanto menor sea el valor más “zoom” hará el ruido. También vamos a necesitar el nodo Step que si tenías dudas de su uso, en este caso lo vas a entender perfectamente. Ahora unimos la salida de Simple Noise a la entrada Edge del Step. Ahora podemos cambiar el valor del Step entre 0 y 1 para ver su utilidad real. Los valores de ruido que estén por debajo de ese valor devolverán 0 y los que estén por encima devolverán 1. Es decir cuando el Step sea 0 el objeto no se verá y cuando sea 1 se verá completamente. Justo lo que queremos que ocurra. Simplemente conectamos nuestra variable DissolveValue a la entrada In del Step. Para hacer pruebas vamos a colocar la salida del Step en el Albedo del PBR Master. Vamos a guardar y vamos a Añadir un cubo a nuestra escena. Crearemos un material con nuestro shader y se lo colocaremos al cubo. En nuestro material podremos cambiar el valor del DissolveValue. Como vemos el efecto se acerca a lo que buscamos, aunque tenemos dos problemas. Primero no se está disolviendo realmente ya que está pasando de negro a blanco simplemente. Y segundo que el efecto está al contrario, cuando el DissolveValue vale 0 debería verse el objeto completo y cuando está a 1 indica que el objeto está completamente disuelto. Vamos a volver a abrir el Shader Editor para solucionar ambas cosas. Primero vamos a hacer que la parte negra se convierta en transparente. Para ello simplemente tienes que conectar la salida del Step con el Alpha del PBR Master. También tendrás que activar el AlphaClip. Aunque el valor que entra por defecto es 1 tendrás que ponerle tu el valor a través de un nodo. Simplemente crea un nodo Integer (que es un número sin decimal) y conectalo a AlphaClip. Para el segundo problema simplemente usaremos el nodo que comentamos anteriormente. OneMinus. Si a 1 le restamos el DissolveValue obtendremos la parte contraria, que es justo lo que necesitamos. Si guardamos y probamos comprobamos nuestro material ahora podemos ver que funciona como queriamos. Se disuelve de blanco a negro con el ruido que creamos. Solo nos falta añadirle color. Para ello volvemos al editor. Necesitamos pintar el borde que se disuelve y a raíz de ahí lo que tengamos a un lado del borde lo borramos y lo demás lo pintamos del color normal. Una forma de encontrar el borde es sumar el DissolveValue y el borde y restar por un lado el Step de la suma y por otro el Step del DissolveValue solo. Es más fácil de entender con una imagen (para que sea más visual he cambiado el valor default del Dissolve Value a 0.5): Como vemos ahora tenemos el borde diferenciado, pero no lo estamos usando. Lo que vamos a hacer es pintar con los colores que creamos al principio. Una buena forma de hacerlo es usar Lerp. Podemos hacer que si la resta es 1(blanco) se coloree con el Color del Borde y si es 0(negro) el color sea el normal. Y esa salida del Lerp la conectamos a Albedo. Ahora podemos guardar y probar el shader. Si todo ha ido bien debería funcionar como esperábamos. Puedes cambiar a tu gusto los valores del material, como los colores o el borde. Si eres perfeccionista te darás cuenta de que si el borde es muy grande, pueden quedar algunos restos al disolverse. Esto podemos arreglarlo con un simple cambio. Sumando el valor del borde al dissolve antes de hacer el OneMinus. También podrías crear una variable para el Scale del Simple Noise. Así tendrías un valor más que podrías modificar desde fuera sin tener que cambiar el shader. Por último vamos a añadir una textura que se añada al color, así lo podremos usar en más objetos. Simplemente crea una variable de tipo Texture2D y arrastrala al grid con los demás nodos. Tendrás que sacar un nodo llamado Sample Texture 2D y arrastrar la textura a la entrada correspondiente. Luego solo queda multiplicar por el color normal y sustituirlo en la entrada A del Lerp anterior. Guardamos y desde el inspector del material añadimos la textura que queramos y habríamos terminado. No es la única forma de hacer este efecto, hay muchas otras, esta es la forma que yo usé. Espero que os sea útil. Cualquier duda que tengáis hacérmela saber y estaré encantado de ayudaros. Podéis encontrarme también por twitter: https://twitter.com/davidlopezdev Nos vemos en el siguiente.
  6. 5 points
    Hola chicos, comparto con vosotros una implementación de ruido perlin noise con fBm para todos aquellos que esteis interesados. Si necesitais generación procedural de contenido, con esto solamente necesitais llamar a una función. Además las plantillas de ruido se guardan como Scriptable Object. Os dejo imagenes de las demos que incluye con ejemplos de uso, dependiendo del caso: link: https://github.com/davilopez10/PerlinNoise_Unity3D Perlin Noise 1D Perlin Noise 2D Perlin Noise 3D
  7. 5 points
    Hola, He creado unos pocos vídeos de programación básica de NPC's, o programación de NPC's básicos. La intención es ir creando mas de esta tématica, sin obligación, y de tanto en tanto, pero irlos agrupando en la misma lista de visualización de youtube: Aquí os la dejo: Por ahora hay tres vídeos, o 2.5 por que el último es un poco ampliación del primero. -Como crear NPC's en Unity que te siguen. -Creamos un centinela con Waypoints en Unity, -Como hacer un NC persiga y huya en modo pánico. Ya ire informando de nuevas incorporaciones a la lista 🙂
  8. 5 points
    GUÍA TUTORIAL PARA JUEGOS CON ENTORNO 3d PARA MÓVIL Buenas gente mi nombre es Javier García, el desarrollador del juego de Bramson Case, (esperemos que próximamente en las plataformas , que ya me queda pokito^^’). Debido un comentario que me hizo Pioj en uno de los hilos, me he animado a preparar un post para explicar algunas cosillas desde mi experiencia y punto de vista que he aprendido estos años con el proyecto que llevo entre manos. Lo primero vamos a comentar son algunas cosas a tener en cuenta antes de empezar nuestro proyecto, ya sea tanto para móvil, como para pc, aunque en este post luego lo enfocaremos a la preparación de juegos en 3d para las plataformas de móvil ya sea en primero o en tercera persona. CREACIÓN DE UN GRUPO TRABAJO. Tenéis que tener en cuenta que aunque parezca fácil, la típica frase de..“VOY A HACER UN VIDEOJUEGO Y ME VOY A FORRAR” eso lleva una carga de trabajo impresionante que nunca se suele tener en cuenta al empezar el proyecto. (lo digo por propia experiencia y ya veremos lo de me voy a forrar xD) -Ilustraciones -Texturizado -Modelado 3d -Guionistas -Programación -Betatesters -Música -Marquetin -Etc.etc.. (A mi manera de ver, a no ser que sea un proyecto pequeño que puedas cumplir en un par de meses como mucho, intenta montar un grupo de trabajo, ya que en un par de meses suele comenzar la cuesta arriba y empiezan a aparecer todos los problemas que no tuviste en cuenta cuando dijiste esa mítica frase, tanto personales como a nivel del juego). Ya se que puede parecer algo pesado esta intro de post, pero lo considero bastante importante. Y con esta pequeña presentación, vamos a ponernos con el tema.:D --------------------------------------------------------------------------------------------------------------- Para una explicación mas sencilla vamos a separarlo en dos bloques, como he comentado anteriormente esto esta enfocado para las plataformas de móviles (concreta-mente en entornos 3d, aunque algunos conceptos también se pueden aplicar en otras plataformas). -BLOQUE 1 (Modelado, Texturas, Iluminación, Consejos) -BLOQUE 2 (Menús Básicos) BLOQUE 1 (modelado, texturas, iluminación, consejos) COSAS A TENER EN CUENTA ANTES DE COMENZAR EL MODELADO. -No existe ninguna formula mágica para una optimización perfecta. Como indicamos no existe ninguna forma concreta de optimizar el juego para sacar el 100 del rendimiento, en plan... si pongo las texturas en modo móvil, y pocos polígonos en el modelado, me va a ir todo fluido.(desgraciadamente eso no funciona así ). Unity tiene múltiples maneras que puedan ayudar a una buena optimización en el compilado, pero esas opciones de menú (que explicaremos mas abajo) son ayudas muy generalizadas, una buena optimización implica un bueno modelado desde un principio, tanto de personajes, como escenarios, acorde a lo necesitemos en cada momento. Buen modelado + buen ajuste en los menús = todo va de puta madre :D Por poner un ejemplo la imagen puesto a continuación es el exterior de la mansión Bramson donde se desarrollara el juego que llevo entre manos. (No solo la mansión esta completamente amueblada, si no que dentro de esta misma escena hay otra mansión de 2 plantas, también totalmente amueblada y algunos eventos especiales que también están cargadas en la misma escena, por lo que si se plantean bien las cosas desde un principio se pueden conseguir los resultados deseados.) Olvidaos de detalles hiper realistas en los gráficos. Tenemos que tener en cuenta que vamos a realiza un juego para móvil y el procesamiento y los recursos de un móvil son muy limitados comparado con un pc de sobremesa, en este caso tendremos que tener en cuenta algunos conceptos básicos al modelar. 1-MODELADO Intentar siempre modelar en medida de lo posible en low-poly, dándole algún detalle mas a los objetos que puedan estar mas próximos a la cámara, por ejemplo. (Si en un decorado tenemos una montaña al fondo del escenario que nunca vamos a llegar en el juego, es una tontería detallarla con muchos polígonos y darle una textura a mucha resolución, ya que en un móvil no se va a apreciar ese tipo de cosas, pero si se apreciar en los objetos del escenario que estén mas próximo a la cámara) 2-DETALLE DE ESCENA Una de los trucos mas comunes es usar algo mas de detalles donde el jugador vaya a fijarse en el proceso del juego, este ejemplo es muy básico, si tenemos un folio con un punto negro en medio, el ojo humano por norma general suele enfocar la vista en el. (En la imagen puesta a continuación se aplica la misma teoría, el personaje tiene una textura muy básica y algo menos detallada que la cara, que literalmente la cara es una fotografía, por lo que al haber algo mas detallado en ese momento, te sueles fijar mas, otra cosa es que alguien se fije en algo mas concreto como algún detalle en la ropa.. pero eso no suele ser común, a no ser que estés también en el mundillo para percatarte de esas cosas, o que lleves 2 meses buscando la típica puta llave que te tiene atascado y ya miras hasta en debajo de las piedras). 3-COLLIDER Un tema delicado, esta sección para mi bastante importante y a tener muy en cuenta a la hora de preparar la escena en el Unity, como sabréis para los polígonos de los modelos en unity existen varias maneras de meterle los collider a los objetos, ya sea para crear alguna activación de un evento o para bloquear el paso del personaje y evitar de esta manera el clipeo. Intentar usar exclusivamente los collider mas básicos, a ser posible todo cubos o planos, olvidaros de los mesh collider (ya se que es automático y mola mucho), eso al principio parece que no consume mucho recurso pero conforme vaya creciendo el proyecto, la cosa se desmadra muy rápidamente, a continuación os pongo un pequeño ejemplo de una de las salas de la mansión. 4- EXPORTAR MODELOS A UNITY (OBJETOS PRE-FABRICADOS) Un de los errores mas comunes que suele haber a la hora de exportar, es exportar todo el conjunto creando un único prefabricado, teniendo en la escena objetos iguales como pueden ser libros, sillas, etc. Para poder explicar esto bien vamos a simplificarlo al máximo en un par de imágenes, ya que es algo mas complejo pero de esta manera se quedara la base mas clara. -En la imagen 1 hemos creado 4 sillas y las hemos exportado a Unity ya sea en FBX, OBJ o el formato que sea. Como podemos ver al pasarlo a Unity nos a creado 1 único prefabricado con las 4 sillas de 400 polígonos, ese calculo se queda guardado en memoria y si repite el prefabricado en algún otro sitio usara el dato en memoria. -En la imagen 2 como la silla que vamos a usar es igual que las otras, la exportamos independientemente y luego copiamos el prefabricado, hemos conseguido el mismo resultado y nos hemos ahorrado el calculo de 300 polígonos. (aunque parezcan pocos polígonos, recordar que es un juego para móvil, todo lo que podáis ahorrar en una parte, podréis meterlo en otra cosa, o pensar que si tenemos 50 sillas en todo un decorado no son 300 polígonos… 50x100 con 5000 polígonos, comparado con 100 la cosa ya cambia bastante mas ) 5-SHADER ,TEXTURIZADOS Bueno aquí si que hay para gustos colores, ya que hay muchísimas variedad para jugar en esta sección, simplemente me centrare en comentar mi opinión personal y ya cada uno que sopese las opciones, yo en mi caso he usado el shader standar, evitando en medida lo posible usar el shader para móvil, ya que si a malas tengo mucha perdida de fps siempre tendré la opción de pasar todas las texturas a los shader de móvil para ganar algo mas de optimización, para la resolución de las texturas he ido jugando 2048 para objetos mas detallados y cercanos, y 1024 para cosas mas de fondo. -Que tenemos que tener mas en cuenta de un shader estándar, para un juego 3d para móvil. De todas las opciones que podemos ver en la imagen vamos a centrarnos en las mas importantes de mi punto de vista ALBEDO (diffuse para algunos programas) -Este es el color base de la textura, ya sea JPG, BMP, Etc.. (Al ser un juego para móvil intentar que sean todas las texturas en jpg no mas grandes de 2048) METALLIC (Specular par algunos programas) -Esta textura es el brillo que puede tener un objeto al recibir un punto de luz. (Aquí tenéis que llevar mucho cuidado si se usa esta textura, tener en cuenta que no existe en la vida real un objeto que tenga brillo perfecto en toda su superficie, debido a la suciedad, el desgaste, o mil imperfecciones que pueda tener, por lo que el objeto necesitaría una textura para que quede bien y un punto de luz en “tiempo real” para que haga un buen efecto, por lo que es un gasto de procesamiento enorme que a veces no merece la pena meter) NORMAL MAP -Esta textura lo que crea es un capa nueva encima de la textura albedo que le da relieve, dándole un detalle al modelo de low-poly haciendo que parezca que tiene muchos mas polígonos teniendo la base de low-poly. (Aquí realmente no he hecho muchas pruebas para el juego ya que me centrado mas en otras cosas, me imagino que si es solo para darle detalles a algunos objetos en concreto no quedara mal, pero sinceramente no se lo que puede llegar coger de los recursos del móvil, pero me imagino que bastante) REFLECTIONS -Como su nombre indica son los reflejos de un objeto como puede ser un espejo, el reflejo del agua, etc… (Para un juego de móvil yo no me centraría en usarla, a no ser como siempre comento que sea algo muy… muy concreto y pequeño, no poneros ha hacer rascacielos de cristal que se reflejen entre si, que vais a poner el móvil para que se puedan freír huevos). 6-ILUMINACIÓN Este para mi es el tema mas importante y el primero que se tiene que tener en cuenta para realizar nuestro proyecto, debido a que es algo complejo ya que hay menús involucrados los voy a dejar para el final, con los menús correspondientes para explicarlo lo mejor que pueda. ALGUNOS CONSEJOS COSAS PROHIBIDAS A TENER EN CUENTA. -Cosas que tenemos que intentar evitar en medida de lo posible, ya que esto para un juego de móvil hace que la cosa se pueda ralentizar de cojones… hablando en plata. 1-Texturas con canal Alpha, como la gente conocerá y si no lo comentamos, hay algunas texturas como puede ser el PSD, TIF , PNG,etc.. que contienen información para crear desde el mismo archivo una transparencia a la textura, se puede encontrar mucho en hierbas, las hojas de los árboles, etc.. Esto ayuda mucho al modelado 3d (para los juegos de pc),porque poniendo un par de planos bien colocados podemos conseguir unos buenos detalles, pero el problema es que el procesamiento en un móvil para estas texturas es muy… muy limitado y aunque para pc sea una ventaja, para móvil suele ser una desventaja y un gasto de recurso brutal. (En mi caso este es uno de los árboles, como se puede ver tiene el tronco y 8 texturas en PNG que tienen el canal alpha, pues si no me equivoco hay 8 árboles enfrente de la mansión y cada vez que se mira hacia los árboles me da una bajada importante, por lo que intento desactivarlos cada vez que puedo). Vamos…que la primera vez que los puse entre 20 y 30 para dejarlo mas bonito, al girarme en el juego se me peto el movil por completo y creo que hasta me soltó un…Pero tu estas flipando chaval . COSAS ACONSEJABLES A TENER EN CUENTA. 1- Acostumbraros a que cuando carguéis un objeto, revisar lo que habéis exportado, ya que al exportar un objeto puede haber cosas activadas que si no me equivoco pueden darle una sobrecarga innecesaria al prefabricado. 1-MODEL En la sección de Model ya cada uno que lo ajuste a lo que necesite. 2-RIG Aquí por el momento lo dejare para otro post si la gente lo ve bien ya que esto hay que explicarlo desde el programa 3d también. 3-ANIMATION Si el modelo no contiene animaciones esto desactivado. 4-MATERIAL Aquí hay algunos formatos que exportan las textura y se la aplican al modelo directamente, a mi me gusta desactivar esto y poner yo la textura en el Unity, pero eso ya son manías mías, me imagino que si esta bien configurado no importa mucho. DESACTIVAR LOS OBJETOS QUE NO SE VEAN EN CÁMARA. -Aquí simplemente comentar un par de detalles, cuando preparéis el inicio del juego intentar desactivar todos los objetos que no se vayan a usar nada mas empezar, ya que todos los objetos desactivados no cargan sus scripts, por lo que nos ahorramos bastante procesamiento de primeras, y ya cuando los vayáis necesitando los vais activando poco a poco. (Yo en la escena solo dejo el charácter controller y seguido un script de precarga que me activa la zona de inicio, todo lo demás esta desactivado de primeras). SCRIPTS (UPDATE & START) Intentar no usar muchos scripts que tengan codigo dentro del void Update y optimizar la sección de void Start todo lo que podáis. (Aunque parezca que no hace nada, todos las secciones de “ void Update y void Start “ que suelen salir de base en los scripts, si van a estar vacíos, los borráis por completo, porque aunque no tengas nada dentro si están en el script, ya se gasta un mínimo de recurso en checkearlo y si no están nos ahorramos ese chekeo, sobretodo el update. Y ya con esto pasamos al bloque 2, este bloque es mucho mas cortito que ya se me esta haciendo muy largo esto y no quiero extenderlo mucho mas ^^’ -BLOQUE 2 (Menus Basicos) Hay varios menús básicos que tenéis que revisar para ir aprendiendo a gestionarlos y mejorar la optimización del juego, por el momento comentare lo mas básico de cada uno, pero estos menús hay que aprendérselos bien para poder jugar con lo comentado anteriormente. Buen modelado + buen ajuste en los menús = todo va de puta madre :D (Tener en cuenta que estas opciones, son opciones generales y afectan a todo el juego cuando se compila, es como si fuera un limite, si tenemos una luz con una sombra super ultra realista, y en este menú ponemos que las sombras son super ultra low, se pasara a los parámetros super ultra low del menú al compilarlo). -MENU DE QUIALITY En este menú se controla y se configura que calidad y que modos dispondrá el juego. Por ejemplo: PC : BAJA, MEDIA, ALTA, UTRA. IOS : BAJA, MEDIA. ANDROID : BAJA, MEDIA, (y en cada opción su configuración claro esta) (para juego de móviles, la opción de “ V Sync Count “ es el demonio en persona, eso es lo primero que tenéis que quitar). -MENU DE GRAPHICS Este es otro menú a echarle un ojo también, poco a poco tendréis que ir aprendiendo a gestionarlo para sacarle punta en las compilaciones para móvil. -MENU OCCLUSION Este menú es para acelerar el procesamiento de la cámara, prácticamente lo que hace es desactivar (las caras de los polígonos, collider,etc..) que están fuera de la visión de la cámara, ayudando al procesamiento del escenario. -LIGHTING y MENU LIGHTING Y por fin llegamos a la ultima parte, que me la he dejado para el final porque la considero de las mas importantes. Este menú controla las luces generales de la escena. -Environment Propiedades de entorno. (En este menú se controla una iluminación global que afecta a toda la escena, dándole el tono que necesitemos a todo el decorado) en mi caso suelo darle un color base y ya voy jugando con los shadowmask. (shadowmask se explicara mas abajo) -Realtime lighting Iluminación que se aplica en general a toda la escena como bien pone en tiempo real. (esto en medida de lo posible intentar no usarlo, se puede conseguir casi los mismos resultados jugando un poco con los puntos de luz) -Mixed Lighting Calculo de las luces en modo bake. (Bueno… esta es la opción mas a tener en cuenta para conseguir una buena optimización y buenos resultados de iluminación para nuestra escena, muy… pero que muy importante, aprender a configurar esta parte del menú) De las tres opciones me enfocare exclusivamente en el shadowmask que es el que mejor resultado nos puede dar. Lo primero que tenemos que conocer a la hora de iluminar nuestro decorado, es que lo que mas recurso puede llegar a consumir en un entorno 3d es la iluminación, por lo que un exceso de puntos de luz sobrecargaría todo el procesamiento, ya sea por el radio de la luz en si, como por las sombras que puede llegar a generar. Debido a esto toda la iluminación en Unity tiene 2 opciones. -Realtime (como bien indica, es una iluminación en tiempo real del punto de luz, con todo lo que eso con lleva). -Bake (El bake es la opción de decirle a Unity que genere una textura que se aplicara a todos los objetos que interactuan con dicha luz, creando en la textura todas las sombras que se supone que tendría general el punto de luz, de esta manera se ahora el procesamiento en tiempo real, acelerando bastante el procesamiento del decorado). Esto es un pequeño ejemplo de la sombra de una farola en modo bake (Shadowmask) También comentar que esto tiene sus pro y sus contra. -Pro: Ayuda en el procesamiento del calculo de iluminación de los punto de luz. -Contra: Lo malo que tiene el bake, es que solo se puede aplicar a objetos estáticos. (Aunque como siempre digo, todo es cuestión de saber jugar con los menús, vamos a poner el ejemplo del típico juego de terror en una casa con una linterna). -Iluminación Environment : luz azulada muy oscura para dejar intuir el escenario (MODO BAKE) -Iluminación decorado : algunos puntos de luz con sus sombras en algunas lámparas, el televisor, etc, etc..(MODO BAKE) -Iluminación de linterna : le damos un punto de luz que no tenga mucho radio y las sombras en calidad media, para ir iluminando por donde vaya mirando el personaje (MODO REALTIME) Lightmapping Setting Esto son las propiedades textura que crea el modo bake. (Importante saber gestionar este menú para darle la calidad que queremos a los shadowmask). -Other Setting Como bien indica el menú, niebla y los halos. -------------------------------------------------------------------------------------------------------------------------------------------------- -Bueno señores, por el momento con esto ya se despide un servidor, espero que no se haya echo muy pesado el post, porque creo que me he emocionado un poco de mas y no soy de escribir mucho xD. Si lo veis bien, lo iremos puliendo con el tiempo, agregando y organizando poco a poco las secciones que falten por explicar, para que podamos tener un buen post de ayuda para la comunidad sobre este tipo dudas.
  9. 5 points
    Hola. estoy terminando uno de mis proyectos. se trata de un juego de naves, un matamarcianos (shoot'em up)... con toques de rouge lite. Falta terminar los modos de juego extras (modo arena, modo survival, y modo bossRush). El modo historia esta acabado, con 25 escenarios y 10 escenas especiales.... no es necesario pasar por todas para llegar al final, puedes elegir multiples caminos. (no es lineal). De momento tiene mas de 30 enemigos diferentes (contando los bosses). 16 skills diferentes (armas secundarias) y multiples mejoras para la nave. Banda sonora original con mas de 40 temas. A ver que os parece... vuestros comentarios seran bien recibidos. trailer gameplay: special scenes trailer: boss trailer:
  10. 5 points
    Unity cada vez que creas un nuevo script, sea del tipo que sea, siempre consulta un archivo plantilla para generarlo. Por eso siempre tenemos añadido, por ejemplo, la función Start y Update, o creada la clase en función del nombre que le pongas al Script. Pero eso puedes modificarlo fácilmente. Simplemente dirígete a la siguiente ubicación: Será diferente según la versión de Unity que uses. Ahí podemos ver todos las plantillas, simplemente abrimos la que queramos modificar. Ahora podéis añadir una cabecera de Copyright o quitar las funciones Start y Update (que si no hay que tenerlas vacías). Ya las añadirás tu cuando las tengas que usar. Espero que os sea útil. Hasta la próxima
  11. 5 points
    Buenas, si alguien lo recuerda, este juego lo empece hace mucho, lo deje abandonado y no pude resucitarlo al tratarse de versiones tan antiguas de Unity. Actualmente estoy haciendo un reboot, de momento y a modo de demo técnica, os muestro este pequeño video de ejemplo:
  12. 4 points
    Finalmente, liberamos la herramienta! pueden acceder a ella totalmente gratis! http://www.modelatorsystem.com
  13. 4 points
    ¡Buenas! Mi experimento de carreras en TuCiudadTM. La idea es poder generar una escena aproximada de cualquier parte del mundo. La gracia es poder correr por tu ciudad o hacer misiones que te envían a sitios conocidos. Apóyanos siguiéndonos en Twitter: https://twitter.com/yourcityracing (venga que es 1 click!)
  14. 4 points
    Es un pequeño juego 2D creado para la JAM de UnitySpain. Tienes que guiar al personaje por el bosque hasta que llegue a casa. El juego es tranquilo, se trata de ir encontrando los diferentes caminos y esquivar los peligros que se encuentra como los lobos o las lanzas. Creo que le dedique mas o menos unas 16 horas, y estoy contento con el resultado, tanto que me quedo con el proyecto para irlo evolucionando poco a poco, ya ire compartiendo los cambios y los "improvements". Cualquier idea, o crítica, que querais aportar sera muy bienvenida. Por ahora esta disponible en itch.io: https://uadla.itch.io/way-home
  15. 4 points
    Hola @nomoregames, primero que nada decirte que esto no es con ánimo de ofender ni de crear controversia. Este tipo de dudas son básicos de la programación, no es algo de unity sino de el lenguaje. Yo te aconsejo leerte un libro de c# o hacerte un curso donde aprendas al menos lo básico y no andes dando palos de ciego hasta encontrar la respuesta. No me molesta para nada que hagas estas preguntas, pero me parece que se crea contenido innecesario, soy consciente de que nadie nace sabiendo pero si no nos intentamos educar seguiremos en ese bucle de por vida. Digo esto por tu bien y por el entusiasmo que veo que tienes con la creación de videojuegos, puedes explotar ese potencial. Hay muchos cursos de programación en Youtube, también puedes utilizar webs como codeAcademy o KhanAcademy que son gratuitas y super buenas. Es un mundo muy bonito y que si le echas ganas puede sorprenderte más de lo que imaginas.
  16. 4 points
    Me alegro de que os guste!! Si tenéis cualquier duda, estoy por aquí (pero en el Telegram suelo contestar antes 😉).
  17. 4 points
    Acá les dejo el twitter de este señor: https://twitter.com/tuxedolabs?lang=es Sus videos y artículos son muy buenos, 100% recomendado. Tiene proyectos que integran: Geometría compleja basada en mini voxels (más tirando a átomos que al cubo de minecraft). Físicas rígidas, blandas, flexibles y de flotabilidad. Partículas, Iluminación completamente dinámica. Destrucción. Audio (para manejar todo el tema de las físicas + destrucción). Shaders. Efectos volumétricos. y más :) ... Realmente impresionante, se me hace que este tipo va a quebrar la internet en unos años. Les dejo algunos tweets: El juego que está creando (muy linda idea): Esas partículas :P
  18. 4 points
    Mira que fue una chorrada que se me ocurrio y es lo que mas exito tiene y mas gracia le hace a la gente. Gracias Pere por tus animos, quizas cuando crezca un poco el bicho pueda dedicarle algo de tiempo hacwr videojuegos, pero ahora lo veo complicado. Mas que por el niño por el trabajo, en el anterior si no habia incidencias el fin de semana podia llevarme el portatil y dedicarle tiempo a los videojuegos. Espero que a lo termines y verlo por aqui para probarlo. Os dejo otro gameplay muy gracioso de um chino, esta to loco!! Saludos!!
  19. 4 points
    Cuando tienes una gran cantidad de sprites en tu proyecto, es una buena práctica (por no decir que es obligatorio) organizarlas todas en torno a un Sprite Atlas. Esto te ayudará a ahorrar memoria en tiempo de ejecución además de a reducir los tiempos de acceso a ellas. Para crear un Sprite Atlas, puedes hacerlo desde botón derecho en vista de proyecto y Create/SpriteAtlas. Una vez creado simplemente tienes que seleccionarlo y agregar todos los sprites que necesites. Puedes probar las opciones para ver los resultados. Ten en cuenta que tamaños muy altos de Sprite Atlas no son compatibles con algunos targets. Puedes activar, desactivar o limitar el uso de Sprite Atlas desde ProjectSetting/Editor. Espero que os sea útil. Hasta la próxima
  20. 4 points
    He encontrado esta enorme fuente de información googleando a cerca de mesh deformation, y wow, que mérito tiene la persona que hizo esto. https://catlikecoding.com/unity/tutorials/
  21. 4 points
    https://connect.unity.com/p/spriteanimator-2d-tool Completo sistema para trabajar con Sprite Sheets Visitar en Assets Store https://assetstore.unity.com/packages/tools/sprite-management/spriteanimator-153405
  22. 3 points
    Desarrollo en Unity 2019.3. Una primera aproximación a un FPS sin prácticamente optimización más allá de los lightmaps del entorno. Es posible utilizar diferentes FX dependiendo del material de contacto. He utilizado algunos assets de pago y otros gratuitos en los apartados de diseño solamente. El código y la integración es mío desde cero. El canal de youtube para seguir las actualizaciones es: https://www.youtube.com/user/LosSopranoNet/videos
  23. 3 points
    la verdad que estan chulas las fisicas del cable. creo que esto no cuenta como spoiler del juego... o si? si es asi lo siento, cierrenme el tema. pero me gustaria devatir como creen qye funcionan esas fisicas. creen que la manguera esta formada por pequeñas secciones? o es mas bien varios raycast que dividen la manguera en secciones mas grandes cuando colisiona? y el tramo que tiene enrollado en la mano?? forma parte de la misma manguera? o es un objeto adicional para que de la sensacion de que se enrolla.... y miestras tanto la manguera original crece o disminulle su longitud en relacion con la parte que ha enrollado en la mano? ...claro que la parte que tiene enrollada en la mano tiene fisicas tipo "cloth".... pero no reacciona al escenario... eso es lo que me ha hecho pensar que son dos cosas distintas la manguera y lo enrollado... aunque tamvien cuando la lanza cambia un poco el comportamiento... creo que puede ser todo un unico objeto al que le cambian las "layers" de colisiones depemdiendo el momento ...y depemdiendo de que secciones de la manguera sean les ponen unas layers u otras... puede que todo sea una especie de "cloth" gigante... que cuando ha alcanzado su maxima tension (estirado) manda un mensage al personaje para que haga la animacion de "huy, ya no alcanza mas" ustedes que opinan?
  24. 3 points
    Buenas a todos, Quería presentados mi proyecto Steel Wars Royale en el cual llevo trabajando desde mediados del 2017. Es un proyecto muy ambicioso sobretodo por su complejidad técnica, ya que es un juego 100% online con batállas 1vs1 síncronas y sistema de almacenamiento de datos (BackEnd). Desde el principio, a pesar de tener recursos bastante limitados, he buscado calidad triple A y que al ver el juego de la sensación de que hay un buen estudio de desarrollo detrás. Esto me ha hecho ir mucho más lento de lo que me gustaría. Os dejo un mini trailer casero que yo mismo he hecho: En breves (en 2-3 días si todo va bien) voy a probar el juego con público real por primera vez, en una Alpha Cerrada para la plataforma Android desde Google Play. Me gustaría alcanzar un volumen de unos 50 jugadores, de los cuales ya tengo unos 20-30. Si alguien con Android se anima a ser Tester, es más que bienvenido! Los interesados podéis entrar en www.steelwarsroyale.com y dejar vuestro correo electrónico. Es una lista de correos gestionada con MailChimp. No se va a usar para hacer SPAM ni con otros fines comerciales, se va a usar únicamente para dar información del juego y avisar de sus testeos y lanzamiento. En cualquier momento os podéis quitar de la lista de correo pulsando abajo de cualquier e-mail "cancelar suscripción". Muchos de vosotros no seréis el target de audiencia para este tipo de juegos F2P de móvil, pero vuestras opiniones y feedback serían de gran ayuda. ¡Gracias de antemano a todos los interesados! Información más técnica para developers: Para el desarrollo del juego he usado el motor Unity3D. Para el sistema de BackEnd he usado el BaaS Gamesparks. He orientado el juego a ser 100% Data driven, es decir, en el arranque del juego se conecta al backend y adquiere todos los metadatos al vuelo (unidades, stats, recompensas, tiempos etc.). Esto me permite modificar gran parte del juego sin necesidad de subir una Build nueva a las stores. Si quiero modificar los stats de una unidad, o si quiero modificar el % de drop de undiades legendarias etc. lo hago todo desde el back-end. El poder hacer estas modificaciones al vuelo se estila mucho en juegos de móvil F2P (para un buen sistema de Live-Ops). Para el multijugador síncrono, he usado una tecnología que a día de hoy es privada. Es un motor determinista de Photon llamado Photon Quanqum. Conseguir esta tecnología (por el momento, sin coste alguno) ha sido complicado. Para ello me he tenido que reunir un par de veces con Christof Wegmann, fundador y CTO de Exit Games (Photon). Quantum es bastante peculiar por que requiere escribir la lógica de juego (movimiento, colisiones etc.) en unas librerías a parte con su propio motor (basado en ECS) que luego se insertan en Unity mediante DLL's. Es decir, Unity en este caso es un render-dummy, la lógica de juego/batalla está escrita en el motor Photon Quantum. Si tenéis dudas o preguntas, me las dejáis por aquí escritas
  25. 3 points
  26. 3 points
    Y aquí estamos con más novedades. El "esperado" ciclo día/noche y cambio atmosférico dinámico:
  27. 3 points
    ¿Has probado a juguetear con los distintos parámetros que tiene el NavMeshAgent? https://docs.unity3d.com/ScriptReference/AI.NavMeshAgent.html En el siguiente vídeo de Brackeys muestra un poco alguno de estos parametros
  28. 3 points
    Buenas gente, Al final no cambie de trabajo y sigo en el actual que me deja tiempo para desarrollar juegos asi que me he decidido a hacer la segunda parte de BLOODSHOT EYES Despues de la buena acogida que tuvo la primera parte me ha dado animos para hacer una segunda. Mi principal premisa es que quede profesional, cosa que en el anterior algunos aspectos dejaba mucho que desear. Quiero abrir este hilo para ir subiendo los avances a modo de devblog, no como en mis otros juegos que abria un hilo cuando ya estaba terminado. El anterior al ser mi primer juego iba improvisando todo y no tenia ningun tipo de concepto previo ni diseño ni nada, era un caos. En este quiero dedicar una buena parte a diseñar el juego antes de ponerme manos a la obra. La historia del anterior juego para los que no lo conociais trataba de una especie de scape room en una casa (escape house quizas se podría llamar). Te despertabas despues de haber estado de fiesta en una casa abandonada y no podias salir de la casa, mientras tres niños satanicos te hacian la vida imposible. Esta segunda parte va a tratar de, de donde salieron esos niños. Estara ambientado en un bunker donde la iglesia trataba de crear tres nuevos profetas con poderes que harian que la iglesia volviese a dominar el mundo, el caso es que les sale mal y los niños se vuelven satanicos. El jugador como protagonista, despierta despues de haber estado de fiesta en una acampada donde el camino de vuelta ha quedado bloqueado por un derrumbe, investigando llegara hasta el bunker, tras entrar en el bunker ya no podrá salir y tendra que averiguar como salir del bunker donde ya se desarrollaran todo el juego. Dejo a continuación algunos puntos que quiero que tenga el juego: -SENSACION DE QUE TE PERSIGUEN: el el primer juego la gente decia en los comentarios que la ambientacion de miedo y suspense era buena pero que luego realmente no sentian la tension de que algo les perseguia y estaban en lo cierto, una vez que tenias la linterna y ya tenias luz todo el rato, podias estar 3 horas parado que no te iba a pasar nada, en este voy a crear unos NPC (los niños) que vayan patrullando y de los que tendras que esconderteen armarios, cajas, etc... -HUMOR NEGRO: esto gusto mucho en el anterior juego y quiero mantenerlo. -GUIÑOS AL ANTERIOR JUEGO: Me gustaria hacer guiños al antiguo juego, como el oso Tommy, los muñecos del kamasutra etc... -FONDO NARRATIVO: En el anterior juego habia unas notas que te contaban un poco la historia de los dueños de la casa, pense que no llamaria mucho la atención porque mucha gente pasa de leer, pero a otra gente les gusto mucho y hacia que el juego tuviese sentido narrativo. En este juego lo voy hacer mediante cintas de cassette. -BUENA CALIDAD GRAFICA: En el anterior juego gracias a gente de este foro me quede bastante contento con los graficos y la iluminacion del juego pero no con los modelos 3D, en este me lo quiero currar y aunque el modelado no es para nada mi fuerte intentare que sean detallados. Los niños estoy probando ha hacerlos un poco etereos, una especie de humo negro o que vayan con una capa que les cubra casi enteros. Tendre que probar ya que no me veo modelando y animando bien tres niños, en el anterior juego quedaron muy cutres. Y por ahora es lo que he pensado. Empezare a conseguir que las mecanicas funcionen y cuando ya funcione todas las mecanicas me pondre con la ambientacion, decorado, iluminacion, modelos etc... Por ahora he conseguido que un humo negro vaya patrullando por un escenario y cuando te vea te persiga y si te pilla mueres. Que vaya patrullando lo consegui con la Navegacion y los agentes de unity. Y para que tuviesen "vision" y te detectaran segui este TUTORIAL muy interesante. Bueno dejo de enrollarme ire actualizando contenido. saludos
  29. 3 points
    Espero que no se considere como spam, pero estoy grabando mis progresos aprendiendo Unity a través de un juego de cartas. Está claro que si lo veis las vacas sagradas, me atizais en el lomo, pero igual viene bien para los que son tan inutiles como yo. Pues eso. Aquí lo dejo, por si van apareciendo novatillos en esto. A darle duro.
  30. 3 points
    ¡Buenas! En este post @seimus comentaba sobre una herramienta para exportar un tilemap como PNG, y @pioj también estaba de acuerdo con la idea así que hice una pequeña herramienta y la subí al github. La verdad es que la he testeado muy poco pero en principio debería adaptarse a cualquier tamaño, yo la he estado testeando con sprites de 32x32. Os dejo un vídeo y el enlace a github! https://github.com/leocub58/Tilemap-to-PNG-Unity Espero les sirva de ayuda, yo la verdad es que lo he hecho por simple aburrimiento jajajaja. ¡un saludo!
  31. 3 points
    Lo primero es aclarar que con este post no pretendo ni faltar, ni empezar ningún tema de discusión, ni causar ningún tipo de enfrentamientos, pero este tipo de cosas me gusta poder expresarme claro, sin ningún tipo de tapujos.Como digo en algunos de mis post...vayamos por parte como dijo el tito jacky. Como bien comenta francoe1 esta conclusión no quiere decir que no compartimos opiniones. peor referente a este post hay algunas cosas desde mi punto de vista que no comparto. 1-Desuso Referente a este punto te puedo asegurar que estas totalmente equivocado, ya que las mayores comunidades y las mas seguras que existen tanto publicas como privadas en el world son el 70% foros, que suelen estar modificados y actualizados por los propios usuarios, incluso yo diría muchos mas antiguos que este sistema de foros, otra cosa es que le buscador de del señor GOOGLE te cape el mas del 75% de todo el internet, para que solo te centres en la moda que suele usar la gente. Vamos... hablando claro y sin faltar al respeto de nadie....es para hacer borregos. Un poquito de humor nunca viene mal. XD -El motivo principal de usar cosas simplificadas es muy fácil.(Menos módulos menos problemas y mas fluidez) simplemente hay que saber usar la herramienta y saber que función tiene, y no pase como esta pasando ahora que tengo amigos con carreras terminadas de informática y no saben que es un disco de 5 y 1/4.(y eso desde mi punto de vista es muy triste) -Por lo que en general contra menos módulos y menos chorradicas tenga mucho mejor, siempre y cuando cumpla la función para la que se usa. 2-Forma de comunicación. -En este tema también te equivocas, pero no lo voy a ampliar porque la verdad no viene al caso para el hilo del post. 3-Lista de correo -Referente a la comunicación de listas de correo no es que estén en desuso para mandar o recibir información, si no todo lo contrario, la única diferencia es que para chorradicas y tonterías ya tenemos el wasap, dejando los correos en una posición mucho mas seria y personal a la hora de comunicarse con alguien. 3-"Simple texto" Aquí reafirmo lo comentado anteriormente con la frase de Joseph Goebbles ministro de propaganda de la Alemania nazi " Una Mentira repetida mil veces...se transformara en verdad" 1 Imagen = 1000 palabras. 1 vídeo = 1000 imágenes. Por lo que la deducción es........... -Con esto no implica que se usen imágenes o vídeos para mostrar o explicar las cosas, pero eso no quita que sea mejor que el texto, simplemente es una herramienta mas que bien usada puede ayudar mucho a la hora de realizar ayudas o comunicaciones, pero solo eso....ayudas en conjunto al texto. 4-Mejor mostrar un vídeo??? Creo que es este caso esta claro, por norma general cuando alguien pide ayuda en algún tema, que es lo que mas se suele usar este tipo de foros desde mi punto de vista, necesitas ayuda a ser posible para ayer, por lo que ponerse a montar un vídeo para una ayuda, sinceramente es una estupidez y una perdida de tiempo ya que casi todo esta en joutube (No se pierde nada por mirar en jotube antes de preguntar por aquí algún problema). Dejando el foro para ayudas o información mas técnicas, le da una profesionalidad que dejaría de tener si nos ponemos a poner corazoncitos y chorradas cada 3 por 4. 4-Demostrando que funciona? Referente a que las redes sociales que comentas como facebook y twitter recordar que las redes sociales "No son foros" las redes sociales son para una cosa y los foros son para otra totalmente distintas. 5-Portafolios propios. -Aquí mas que aclarar una cosa, ya que yo también creía que esa opción podría ser buena en las comunidades hace tiempo, destacar que los portafolios personales en este tipo de comunidades no suelen ser prácticos y dan mareos de cabeza. Para eso ya hay paginas que se dedican a ese tipo de cosas como puede ser arstation, pinterest etc... No es por el echo de subir las cosas en un foro, es simplemente que esa pagina se dedica a eso, por lo que pagara su cuota a los motores de búsqueda para salir en la sección de imágenes de Google, Firefox, etc.. y si lo que te interesa es tener algun tipo de difusión publica, tendrás muchas mas opciones si usas las plataformas que ya hay. Opinión personal referente al foro. -Bueno y ya por ultimo, yo la verdad es que el foro lo veo bien tal y como esta,ya que para mi la función principal la cumple, que se vayan añadiendo alguna que otra cosa que vean los administradores que pueden ser útiles, lo veo bien mientras no pierda la esencia del foro, pero un cambio radical lo veo una cagada, como dicen... si algo funciona, mejor no lo toques, y si no que se lo digan a la de Cazafantasmas 3 xDDD. Bueno pues con esto me despido, espero no haber sido muy pesado y reitero que este post no esta montado para faltar el respeto a nadie y si alguien lo ve así, mis disculpas no era mi intención, pero quería dejar mi opinión clara, se ve que tanto tiempo en casa encerrao me da que pensar . Un saludo a todos 😄
  32. 3 points
    Utilizad el sharedmaterial, no el material.
  33. 3 points
    La última actualización que ya puse vía Telegram. Así se ve la evolución:
  34. 3 points
    El componente button contiene un booleano que se llama Interactable justamente para esta situación.
  35. 3 points
    Hola a todos,me alegra volver por aquí. Quería enseñaros el proyecto que tengo entre manos, esta en desarrollo y las texturas ni siquiera están bien tileadas, pero ya tengo el escenario mas o menos montado a falta de muebles, plantas y bastantes detalles. Los sonidos de momento tampoco están, me esta costando bastante encontrar. No tengo prisa en acabarlo así que seguramente va para largo, pero cuando lo acabe quiero que tenga bastantes detalles. Si alguien se le ocurre algo que pueda ir bien en el estilo del juego o alguna sugerencia, se agradecería. Si se os ocurriera también algunos assets de la store que me pudierais recomendar seria estupendo. como ya habréis visto algunos modelos los he descargado y otros los he hecho yo. En principio quiero que el juego se base en encontrar llaves y abrir puertas, rodando el mismo mapa. tambien me falta un adaptador de kineckt para el ordenador para dar vida a las animaciones. Un saludo a todos.
  36. 3 points
    Es lo primero que he hecho pero no me entero porque no explican las cosas paso por paso, por ejemplo, ¿cómo se llega a esta ventana?: Te dejo el link de esta página, no lo compartas, es ultra secreto, lo saque de la deep weeb pero aporta una información vital sobre AnimatioView Link del infierno Link del Infierno X2 También quiero que sepas que existe una web a dia de hoy algo conocida, desarrollada especialmente para buscar eso que no sabemos ni como se llama Link a la página mágica.
  37. 3 points
    muy pro la documentacion, no esperaba menos de @lightbug (no esperaba menos de 200 paginas XD) no sabia que habias continuado con tu character controler (conocia la version 2d) ...pero ahora has completado tu complemento con un completo y funcional 3D... muy pro todo.... ...este @lightbug es muy pro... dan ganas de secuestrarle y encerrarle en una habitacion a teclear codigo... digo... estaria guai colaborar con el en algun proyecto...
  38. 3 points
    WIP. (8/12/19) español: Hola gente! estoy desarrollando un sistema procedural, para la creación de edificios de polígonos bajos. actualmente el sistema cuenta con: - creación de estilos nuevos. - opción para agregar o quitar guías de puntos y lineas. - selección de estilos para dibujar. - menú interactivo de muestra para los estilos creados. - selección de texturas para las paredes y el tejado. - modificación de texturas (escala y posicion). - altura base del modelo. - altura total del modelo. - generar o borrar el tejado. - creación, eliminación y manipulación de nodos. - menú interactivo para crear o eliminar el estilo seleccionado, y eliminar el modelo actual en el que estas dibujando. en manos de un buen diseñador, esta podría ser una gran herramienta! ¿que opinan al respecto? espero que les guste esta idea! https://www.youtube.com/watch?v=RnpPpRkUDpk
  39. 3 points
    si quieres hacer que la cabeza mire a un sitio en concreto debes hacerlo en "LateUpdate", ya que el orden seria: -Update -Animacion -LateUpdate entonces si mueves un "hueso" en Update, luego la animacion te lo "pisa", recoloca los huesos como manda la animacion... pero si lo haces en "void LateUpdate()" entonces tu "pisas" la animacion y recolocas el hueso como quieras
  40. 3 points
    Hola Os informo de que Vuforia se está poniendo las pilas con las licencias. Si publicáis un app que les llama la atención, no podréis usar la licencia de developer y os pedirán que paguéis por la licencia. El problema es, si habéis publicado con la de developer, no podréis comprar la standard sino la Pro que vale una pasta al año. Os recomiendo que si empezáis un proyecto de AR, os miréis y lo hagáis con el ARFoundation de Unity. Saludos
  41. 3 points
    He estado experimentando con los túneles y puentes. En realidad tendré que reescribir varias partes para poder mejorar esto, pero me ha servido para ver la problemática..
  42. 3 points
    ¡Hola! Os traigo uno de mis assets gratis más descargados: Basic Motions Pack. Se trata de un pack de animaciones 3D de movimiento básicas para que las apliquéis a los personajes de vuestros juegos y apps. Asset Store Link (Gratis) Lista de animaciones: - Idle01- Idle02- Idle01 - Idle02 (transición)- Idle02 - Idle01 (transición)- Jump (inicio - en el aire - aterrizar)- Caminar- Correr- Correr hacia atrás- Sprint Totalmente gratis y lo podéis usar en cualquier tipo de proyecto, incluso comercial. Cualquier duda o sugerencia: contact@keviniglesias.com Más assets como este: www.keviniglesias.com Asset Store Publisher Vídeo de muestra con algunos ejemplos:
  43. 3 points
    Portal Effect El siguiente efecto es un portal muy simple inspirado un poco en la serie Rick and Morty: Para este efecto, a diferencia del anterior, vamos a crear un Shader Unlit Graph. La diferencia es que el PBR Graph incluye cálculos de iluminación avanzados entre otras cosas, cosa que el Unlit no. Este nodo Master como vemos, sólo tiene entradas para color y alpha. Una vez creado el shader, vamos a añadir un Quad a la escena con un nuevo material con nuestro shader. Colocamos la cámara para poder verlo y hacemos el Quad del tamaño que desees hacer el portal. Podrás cambiarlo posteriormente. Una vez creado abrimos el shader. Lo primero que queremos es crear una máscara circular para darle el efecto ovalado y no tener el rectángulo actual. Esto es simple, simplemente creamos un nodo de forma tipo elipse(Procedural/Shape/Elipse). Cambiamos el tamaño a 1 en ambas dimensiones y colocamos la salida del nodo en el Alpha del Master. Como en el anterior shader, sacamos un integer del AlphaClip y lo colocamos a 1. Si guardamos y probamos podemos ver que ahora es una elipse en vez de un rectángulo (cambia el color en el Unlit Master directamente si no lo consigues ver). Para seguir vamos a hacer uso de dos nodos, que combinados, dan justo el efecto que buscamos. El primero de ellos es un nodo de ruido,Voronoi. La explicación de Voronoi se saldría del objetivo de este tutorial asique si te interesa te dejo un enlace de un artículo que lo explica muy bien: https://www.abc.es/ciencia/abci-diagrama-voronoi-forma-matematica-dividir-mundo-201704241101_noticia.html Junto al nodo de Voronoi vamos a usar un nodo de movimiento de UV, en este caso por Twirl que hace que las UV giren. Uniendo el nodo de Twirl al nodo de obtendremos lo siguiente: Puedes cambiar las variables de entrada de ambos nodos para que configurar el efecto a tu gusto. También sería una buena práctica crear propiedades para poder configuraras luego desde editor. Ahora solo falta que gire, para conseguir este efecto necesitamos acudir a otro modificador de UV, en este caso el nodo Rotate. Este nodo se coloca en la entrada de UV del Twirl y nos permitirá controlar el giro de este. Podremos controlar el giro con la entrada Rotation del nodo Rotate. Llegados a este punto vamos a hacer uso de un nodo muy importante, que quizás se me olvidó comentar en la lección pasada. Es el nodo Time, el cual nos permite usar diferentes tipos de tiempo según lo necesitemos. Creamos entonces un nodo Time y conectamos la salida Time (el tiempo por defecto) a la entrada de Rotation. Como ves, si queremos controlar el tiempo simplemente podemos guardar una variable que multiplique el tiempo y esa salida la conectamos al Rotate. Puedes experimentar con los demás tipos de tiempo para ver lo que ocurre con cada uno. Ahora ya solo necesitamos añadirle color. Puedes notar que el Voronoi tiene dos salidas, te animo a que pruebes el efecto con ambas, ya que son el mismo concepto pero de diferentes estilos. Yo me voy a quedar para este con la salida Cells, que le da un toque más estilizado. Al igual que con el anterior, vamos a hacer uso del nodo Lerp que nos ayudará a convertir los colores negros y blancos en los colores que nosotros queramos. Creamos dos colores, para poder editarlos más adelante y los colocamos en las entradas A y B del nodo de Lerp. Con esto el efecto estaría terminado. Vamos a añadirle unos detalles extra para mejorar el efecto. Podemos sacar un nodo Step del Voronoi. En este caso he usado la salida por defecto para poder apurar más el Step. Ponemos un valor pequeño en la entrada del Step para darle un toque sutil simplemente. Lo multiplicamos por el color que quieras, en mi caso blanco y posteriormente lo añadimos a lo que teníamos hasta ahora. Siéntete libre de modificar los valores a tu gusto para darle el tu propio toque. Espero que os sea útil. Cualquier duda que tengas no dudes en dejarla. Hasta la próxima.
  44. 3 points
    Hola, un vídeo en el que explico como crear objetos recolectables. He intentado que sea lo mas configurable posible. Por ejemplo, se pueden indicar objetos a activar en los objetos que se cogen, y el player (responsable del inventario) puede contener objetos de diversos tipos, y a cada tipo se le puede asignar la instanciación de un objeto nuevo cuando se use.... No se si me explico, pero a mi me han funcionado muy bien, así que espero que ayude a todos los que estan empezando. Saludos!
  45. 3 points
    Buenas gente! Bucando información sobre como importar eficientemente audio para android he encontrado este articulo que seguro que os sirve de utilidad, a mi me ha servido para despejar muchas dudas: https://blog.theknightsofunity.com/wrong-import-settings-killing-unity-game-part-2/ Saludos
  46. 3 points
    @Rootet en tu script hay cositas que están bien otras que están mal, por ej: 1) Update para inputs, FixedUpdate para físicas: if (Input.GetMouseButtonDown(1)){ if (corriendo){ } else{ rigi.velocity = new Vector2(velocidad * 1.25f, rigi.velocity.y); } } En update, estás modificando una velocidad, cosa que debés hacer en FixedUpdate, esto se lee como "Si apreto el botón derecho y corriendo es false la velocidad X es el 25% más grande" y esta actualización sucede en un solo cuadro, no cuadro a cuadro. Además si la velocidad es un 25% más grande se supone que corriendo ahora debe ser true pero no, se setea true si apretás el otro botón (en FixedUpdate). ───────────────────────────────────────────────────────────────────────────────────────────────────── 2) Quién es responsable de corriendo? if (Input.GetMouseButtonDown(0)){ if(corriendo){ if ((enSuelo || !dobleSalto)){ sonido.Play(); //Empujón hacia arriba //Opción 1. Metodo up de Vector2 rigi.AddForce(Vector2.up*fuerzaSalto); //Otra opción //Aplicamos una fuerza de 0 en X y de fuerzasalto en Y //rigi.AddForce(new Vector2(0,fuerzaSalto)); if(!dobleSalto && !enSuelo){ dobleSalto=true; } } } else{ corriendo=true; NotificationCenter.DefaultCenter().PostNotification(this, "PersonajeEmpiezaACorrer"); } } Cuando apretás el botón izq y no está corriendo se da la primer vuelta (el else), es decir que se pone corriendo = true. En el siguiente cuadro GetMouseButtonDown no se dispara (por razones obvias) entoces el "if(corriendo)" no se da. Sí se va a dar el "if(corriendo)" en el proximo click. Además, ¿quién pone corriendo en false? Y volviendo al punto 1, solo si corriendo es falso la velocidad aumenta. Una vez que diste click izquierdo corriendo nunca vuelve a false (?). Puede ser que me haya olvidado de algo, muchas veces contesto a la ligera. ───────────────────────────────────────────────────────────────────────────────────────────────────── █████████████████████████████████████████████████████████████████████████████████████████████████████ Podés resolver el problema parcheando if's y demás, pero te diría que de entrada la estructura es muy confusa para una tarea tan simple, tomalo como una oportundad de mejora y experimentá con una nueva, que tenga más lógica y sobretodo que alguien externo al código lo vea y lo entienda al instante, pensá que esto es un salto y una funcionalidad de correr, practicamente no es nada. La lógica que te recomiendo para una mezcla Update + FixedUpdate en un platformer (y con cualquier personaje) es la siguiente (seguramente hay cosas que no definí, solo una idea muy por arriba): // inputs - esto expandilo a todas las inputs que estás esperando, lo mismo con ejes // En este ejemplo está solo correr "Run" (que elegí la leftShift) bool runPressed = false; bool runReleased = false; bool running = false; bool isGrounded = false; void Update() { // Update puede pasar 100 veces más rápido que FixedUpdate (50 fps por default), así que // todos los KeyDown se acumulan, no se setean, así no perdés ninguno en el camino // por acumular me refiero a usar una simple OR runPressed |= Input.GetKeyDown( KeyCode.LeftShift ); runReleased |= Input.GetKeyUp ( KeyCode.LeftShift ); } void FixedUpdate() { //Detectar suelo, determinar direcciones de movimiento, ángulos, etc // Por supuesto acá es donde decís "suelo = true o false" isGrounded = IsGrounded(); // el vector objetivo cuadro a cuadro, no necesariamente el aplicado Vector2 targetVelocity = Vector2.Zero; // bien general un "if( suelo ) .... if( isGrounded ) { //Todo lo que pasa si y solo si el jugador está grounded // en este caso la input a evaluar es run así que if( runPressed ) { running = true; targetVelocity.x = ... } else if( runReleased ) { running = false; targetVelocity.x = ... } } else //Todo lo que pasa si y solo si el jugador NO está grounded { //en el aire no puede correr running = false; targetVelocity.y = ... } //Una vez determinado el estado se aplica el vector obtenido a la velocidad (de la forma que quieras). rb.velocity = ...(dependiendo de targetVelocity) // IMPORTANTE --> Resetear inputs, FixedUpdate ya las usó runPressed = false; runReleased = false; } Animación y movimiento poco tienen que ver, si no ves los efectos en pantalla tratá de exagerar los valores, en vez de 1.25f poné 5f. Igualmente creo que sí, desde el animator podés setear la velocidad del clip (revisá las referencias de Animator o google más rápido), aunque no recuerdo, estoy completamente seguro que para el sistema Legacy (viejo) se puede hacer, pero con el componente Animation. Saludos
  47. 3 points
    Efectivamente, ahora mismo eso no es posible con clases C# serializadas, pero la buena noticia es que a partir de Unity 2019.3 lo va a ser gracias a un nuevo atributo llamado SerializeReference. Esto es algo que los que desarrollamos herramientas llevábamos AÑOS esperando que Unity implementase, así que hay cierta expectación con el tema. Más información aquí: https://forum.unity.com/threads/serializereference-attribute.678868/
  48. 3 points
    Os presento mi 2º (segundo) juego: "area51invasion" Link al juego: https://play.google.com/store/apps/developer?id=Raven+Games+Spain Consiste en aplastar a los invasores para que no roben a los aliens del área 51. Partidas de 15 segundos. La gente no saca más de 30-40 puntos. ¿Cuál es vuestro récord? Extras Hecho desde cero en 9 horas. 8 horas fueron en el apartado gráfico.
  49. 3 points
    ¡Buenas! Me estoy planteando dar una pequeña charla introductoria sobre narrativa procedimental y generación de tramas argumentales en videojuegos, y me preguntaba si existe un interés general por ello. la charla entraría sobretodo en el ámbito de aplicaciones de la IA en el desarrollo de videojuegos y sería un poco hablar de como se encuentra el estado actual y cuales son las soluciones y algoritmos más utilizados para ello. Muchas gracias y espero vuestro feedback!!
  50. 3 points
    Buenas amigos, ya ha pasado un tiempo pero les dejo un nuevo video sobre UIElements en Unity para aquellos que esten buscando más info en este tema que es muy nuevo aún.
UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...