Jump to content
UnitySpain

Leaderboard


Popular Content

Showing most liked content since 01/24/2020 in Posts

  1. 4 likes
    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. 4 likes
    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!
  3. 3 likes
    No está pensado para eso, le estás haciendo un mal terrible al pobre componente. Entiendo el truco, pero no te conviene usar algo así para esto. Hasta que te das cuenta de que el CC no lo podés rotar ... si querés siempre un personaje que tenga el Up = Vector3.up, estonces está bien. Primero lo básico, ir a la documentación: https://docs.unity3d.com/ScriptReference/CharacterController.html Para el callback OnControllerColliderHit tenés un ejemplo que hace exactamente eso: https://docs.unity3d.com/ScriptReference/CharacterController.OnControllerColliderHit.html Y si nada te funciona, bueno, simplemente obtener del asset store el mejor character controller: https://assetstore.unity.com/packages/tools/physics/character-controller-pro-159150
  4. 3 likes
    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
  5. 3 likes
    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.
  6. 3 likes
    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...
  7. 3 likes
    Hola @nomoregames te aconsejo que antes de empezar a intentar realizar un juego al 100% aprendas, técnicas, formas, algoritmos que suelen utilizar los desarrolladores de juegos. Aprendizaje Básico: Entender las estructuras de datos simples de C# Entender los delegados y eventos Aprender sobre NameSpace, Clases, Estructuras y Niveles de Accesibilidad. Aprender sobre Clases Abstractas Aprender sobre funciones Virtuales Aprender a utilizar Switch Aprender a utilizar Enumeradores Aprender a utilizar Linq, ventajas y desventajas Entender los vectores Aprender y utilizar vectores de dirección Entender las posiciones, rotaciones, escalas tanto globales como locales Aprender el ciclo de vida de una objecto en C# Aprender el ciclo de vida de un componente Entender MonoBehaviour Aprender a realizar Herencias Aprender a serializar clases Aprender a utilizar BinaryWriter y BinaryReader. Aprender a trasladar objetos a diferentes velocidades. Aprender lo básico sobre componentes físicos (Rigidbody) Aprender fórmula de tiro parabólico. Aprender fórmula de curva bézier. Aprender sobre Raycast, Box , Sphere, Line, Ray y todas sus variantes. Aprender sobre prefabs y el nuevo flujo de trabajo con nested-prefabs. Aprender a utilizar Singleton Aprender a utilizar Atributos de clases. Aprender a utilizar Scriptable Object para la fragmentación de comportamiento datos. Aprender sobre Listas, Arreglas Aprender sobre variables de sólo lectura Aprendizaje Avanzado: Aprender sobre funciones arrow Aprender sobre funciones lambda Aprender a utilizar correctamente Dispose y Garbage Collection Aprender a utilizar Dots. Aprender a utilizar HLSL (Surface Shaders) Aprender a utilizar Partículas Aprender a utilizar Sockets Aprender a utilizar WebClients Aprender a utilizar Threads Aprender algoritmos de búsquedas de camino Pathfinding como A* Actividades: Crear un sistema simple de WayPoints Crear un sistema de seguimientos de WayPoints mediante direcciones y fuerza Hacer un seguimiento de cámara simple Simular la gravedad de una caja sin rigidbody. Calcular la fuerza exacta para lograr el salto de 1 unidad con rigidbody. Generar un Cubo mediante Código con MeshRenderer. Guardar y Cargar datos en formato binario. Simulador de vuelo de un avión sin Rigidbody. Simulador de vuelo de un helicóptero sin Rigidbody. Simulador de vuelo de un avión con Rigidbody. Simulador de vuelo de un helicóptero con Rigidbody. Movimiento simple de jugador 2D sin rigidbody. Movimiento simple de jugador 2D con rigidbody. Movimiento simple de jugador 3D sin rigidbody. Movimiento simple de jugador 3D con rigidbody. Movimiento simple de jugador 3D con CharacterController. Detectar si el Jugador está en contacto con el suelo. Calcular el tiempo que el jugador estuvo en el aire. Calcular el tiempo que el jugador estuvo en el suelo. Calcular la fuerza necesaria vertical y horizontal para que un objeto sin Rigidbody recorra 10 unidades con una fuerza gravitatoria de -10 en el eje Y. Detectar si el Jugador está en contacto con la pared (que se encuentre por delante). Detectar si el Jugador está en contacto o próximo a un objeto sobre su cabeza. Evitar que el Jugador salte si no tiene el espacio suficiente. Generar zonas con diferentes comportamientos físicos, como deslizarse, alentar, acelerar, rebotar. Controlar la velocidad de Jugador para que recorra 100 unidades en línea recta siempre al mismo tiempo. Diseñar UI mediante editor (Edit Mode). Diseñar UI mediante código (Runtime). Proyectos para aprender sobre mecánicas: Intenta replicar las mecánicas de la forma más exacta posible, luego modificarlas para experimentar y entender el por que se llegó a la decisión de mantener esos valores. Memo Puzzle Rompecabeza Pong: https://es.wikipedia.org/wiki/Pong Snake: https://es.wikipedia.org/wiki/La_serpiente_(videojuego) Tetris Arkanoid Pacman Space Invaders Super mario bros (Mecánicas) The legend of zelda (Mecánicas) Infinity Runner (Mecánicas) Half-Life 1 (Mecánicas) Proyectos NO RECOMENDADOS: RPGs MMO ROL el clásico "GTA" Juegos Multiplayer como BF, Fornite, etc.. Links para estudio y practicar: son los que me acuerdo que leí en algún momento y me han servido, los de CEDV son muy buenos, lamentablemente ahora se pasaron a Unreal, pero siguen estando las ediciones del 2015 https://openlibra.com/es/book/download/desarrollo-de-videojuegos-un-enfoque-practico-3a-ed/ https://openlibra.com/es/book/download/desarrollo-de-videojuegos https://openlibra.com/es/book/download/logica-del-videojuego http://cedv.uclm.es/libro2015/M4.pdf Esto está destinado a todos los usuarios que se encuentren estancados.
  8. 3 likes
    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
  9. 2 likes
    Buenas jhonatan El ejemplo que pones de Alva Majo es despues de haber tenido un juego exitoso, tu primer juego es dificil que lo copien, no te ralles por eso. Sobre lo de Android o PC depende de lo que quieras, yo que tu no pensaria en el dinero para decidir que plataforma elegir, sino la que mas se adecue al resultado que quieres tener. Porque siento ser pesimista, pero casi no ganaras dinero con tu primer juego, eso si, experiencia mucha. Cuando hice mi primer juego para android ya andaba pensando si hacerme autonomo, una S.L o como tributar con todo el dinero que iba a ganar. Un año despues llevos ganado 15$ y al principio me dio bajona al ver que nadie se lo descargaba, pero actualizando y arreglandolo al final estoy bastante contento con el "exito" que ha tenido el juego. + 10.000 descargas y se lo descargan todos los días entre 60 y 80 personas y subiendo. Pero ya me he hecho a la idea que no voy a ganar dinero con el. Para subir tu primer juego yo no lo subiria a Steam, porque perderas 300 euros, subelo por ejemplo a Itch.io que puedes ponerle precio y es gratis subirlo. Si tiene exito en Itch.io ya subelo a Steam. Tu centrate en tu juego y luego ya iras viendo y sobre todo terminalo. Tambien te recomiendo que subas lo que vayas haciendo aqui para que te podamos ir ayudando a mi me sirvio de mucho en mi juego para PC y tranquilo que no te copiaremos la idea
  10. 2 likes
    No siempre, si a un rb le seteas la velocidad tenés el mismo control que cualquier kinemático (bueno, digamos bastante control). Lo que hace la diferencia son las técnicas de control en general (sobre todo la detección de suelo), cosa que en el kinemático lo tenés que hacer sí o sí. Exacto. No necesariamente tienen que ser raycast. Depende el método, trabajando con un método o el otro te va a hacer pensar al algoritmo de una manera o de otra: 1) Un personaje kinemático + queries (raycast, boxcast, shperecast, etc) Se realizan queries se determina la posición final se pone al personaje allí. repetir Es difícil? Puede que sí, y puede que no, necesitas solo 10 minutos para crear un buen personaje kinemático, que probablemente te va a servir para toda la vida. Será complejo? Ni ahí. 2) un personaje dinámico + contactos (on collision enter/stay): Pasó el update físico (aquí se llenan los contacts, luego de la simulación) Recorrés todos los contactos y los guardas en un buffer (si querés los filtras) en el frame que viene te metés a FixedUpdate (antes de la simulación) Usas los contactos como quieras y determinás una velocidad final Borrás el buffer!! repetir TIP: Si vas a usar contacts, una cosa muy interesante (que nunca me había dado cuenta antes) es que OnCollisionEnter/Say/Exit se corre tantas veces como objectos haya(excluyendo al personaje): No, podés usar la información de los contactos. Por ejemplo: ContactPoint[] buffer = new ContactPoint[20]; void OnCollisionStay( Collision collision ) { int contactHits = collision.GetContacts( buffer ); for( int i = 0 ; i < contactHits ; i++ ) { ContactPoint contact = buffer[i]; //... } } Saludos
  11. 2 likes
    hola! veo que sigues trabajando en el proyecto XD se me olvido contestarte para saber si es horizontal o vertical se haria algo tipo "triplanar shader", si quieres te hago que sea asi. pero de momento te he hecho un shader (especialmente para ti) que te crea las UVs directamente (en el shader), y te las ajustaria para que la textura no se corte indevidamente (osea siempre el numero de repeticiones sera un numero entero (int)) ponle una textura de UNA ventana, y te la repetira un numero de veces X (int) pero siempre intentara mantener el mismo tamaño de ventana, entonces te rapetira mas o menos veces la ventana parra llenar el poligono. osea, contra mas grande sea el poligono mas ventanas pone... contra mas alto, mas "pisos" pone... puedes poner las medidas de cada "altura" (piso) del edificio (he puesto 3 metros, osea que cada 3 metros te hace una copia de la textura) (siempre te hara un numero de copias entero, no te "partira" los pisos, las ventanas) y tambien poner la medida de el "ancho" de la textura (de la ventana/habitacion/lo que sea) (son las variable vertical size (x) y horizontal size (y)) he puesto para que tambien puedas ponerle una BumpMap y un SpecularMap (para el specularMap haz una copia de la textura de la ventana y pon donde sea cristal blanco y en el resto negro, y en unity en el inspector en la textura donde pone "Alpha Source" le pones "from grey scale") y asi te hara reflejos solo donde la texura sea "cristal"... aqui tienes el shader. Shader "Custom/buildings 1" { Properties { _Color ("Color", Color) = (1,1,1,1) _MainTex ("Albedo (RGB)", 2D) = "white" {} _BumpMap("Normal Map", 2D) = "bump" {} _SpecularColor("Specular Color", Color) = (0.5, 0.5, 0.5, 1) _SpecMap("Specular Map (alpha)", 2D) = "white" {} _Glossiness("Smoothness", Range(0,1)) = 0.5 _SizeY("vertical Size", Float) = 3 _SizeX("horizontal Size", Float) = 6 } SubShader { Tags { "RenderType"="Opaque" } LOD 200 CGPROGRAM // Physically based Standard lighting model, and enable shadows on all light types #pragma surface surf StandardSpecular fullforwardshadows vertex:vert // Use shader model 3.0 target, to get nicer looking lighting #pragma target 3.0 sampler2D _MainTex; sampler2D _BumpMap; sampler2D _SpecMap; struct Input { float2 uv_MainTex; //float3 worldPos; //float3 worldNormal; //float2 auxUV; }; float _SizeX; float _SizeY; half _Glossiness; half _Metallic; fixed4 _Color; fixed3 _SpecularColor; void vert(inout appdata_full v) { //float3 pos = UnityObjectToClipPos(v.vertex); float3 pos = mul(_Object2World, v.vertex).xyz; float3 vUp = float3(0, 1, 0); float3 vNormal = mul(_Object2World, float4(v.normal, 0)).xyz; //float3 vNormal = UnityObjectToWorldNormal(v.normal); float3 vTang = normalize(cross(vNormal, vUp)); float vDist_x = dot(vTang, pos); float vDist_y = dot(vUp, pos); float uv_x = (int)(vDist_x / _SizeX); float uv_y = (int)(vDist_y / _SizeY); v.texcoord = float4(uv_x, uv_y, 1, 1); } // Add instancing support for this shader. You need to check 'Enable Instancing' on materials that use the shader. // See https://docs.unity3d.com/Manual/GPUInstancing.html for more information about instancing. // #pragma instancing_options assumeuniformscaling UNITY_INSTANCING_BUFFER_START(Props) // put more per-instance properties here UNITY_INSTANCING_BUFFER_END(Props) void surf (Input IN, inout SurfaceOutputStandardSpecular o) { // Albedo comes from a texture tinted by color fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; o.Albedo = c.rgb; // Metallic and smoothness come from slider variables half spec = tex2D(_SpecMap, IN.uv_MainTex).a; o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_MainTex)); o.Specular = _SpecularColor * spec; o.Smoothness = _Glossiness * spec; o.Alpha = c.a; } ENDCG } FallBack "Diffuse" } puedes usa una textura tipo algo asi para probar: o algo asi: si necesitas que te explique algo mas o que te cambie cosas dime. el shader lo he hecho para probar si te sirve algo asi... a ver si te gusta... se le puede añadar cosas y funcionalidades... tambien puedo intentar hacer, como te dije, que el primer piso sea una textura diferente (comercios/portales) si quieres te lo hago tambien... saludos.
  12. 2 likes
    Diferencias Usas raycasting cuando quieres saber a qué distancia o qué objeto impacta con un un segmento de línea. Así sabemos qué tenemos delante en la dirección de interés. Ese segmento lo defines en el momento de calcular el raycast, así que puede ser lo que tu quieras (pero por cada rayo que calculas, incurres en un coste computacional). Se pueden usar para: Calcular la distancia al suelo desde un punto (rayo hacia abajo) para posicionar objetos o cámaras. Calcular el lugar donde impacta un disparo "instantáneo" (rayo desde el cañón de un arma). Calcular en qué objeto está apuntando el ratón. Calcular qué objetos "ve" uno de nuestros personajes o vehículos (se suelen calcular unos cuantos rayos alrededor para saber si vamos a colisionar con algo). Fíjate que puedes proyectar rayos para calcular la distancia a objetos con los que aún no se está colisionando. Y recuerda también que además del Raycast, tienes el Spherecast y otras variantes, porque una línea es muy fina, y a veces necesitamos proyectar una "esfera" para saber si hay algún objeto en la dirección de interés. Las colisiones en Unity en cambio son resueltas por el motor durante la simulación física, y necesitan que haya un Rigidbody involucrado (ya que los Rigidbody son los objetos con los que trabaja el motor físico). Sólo obtendrás colisiones entre Ridigbody y objetos que tengan un Collider de algún tipo. Las colisiones se pueden gestionar como eventos, así que Unity llamará a OnCollide cuando se produzca una colisión. Además, los Collider pueden marcarse como "Trigger", lo que causará que no se comporten como sólidos, sino que puedan ser atravesados (en este caso, Unity llamará a OnTriggerEnter). Esto se puede usar para saber cuando uno de nuestros objetos físicos impacta con algo o atraviesa un "trigger".: Saber cuando un personaje u objeto entra en determinado área. Reproducir sonidos en las colisiones entre objetos. Saber cuándo un personaje u objeto toca a otro o una parte del escenario. Cuál usar para un character controller Parece que no es muy recomendable usar el motor físico para controlar un personaje a no ser que la simulación del movimiento en sí misma deba ser físicamente realista. Yo en general opino parecido, pero cada caso varía. El motivo principal de no usar el motor físico, en mi opinión, para esto, es que tendrías que modelar el movimiento del personaje usando fuerzas, rozamientos, materiales... y gestionar los tropiezos y caídas (superficies inclinadas, etc). Esto puede tener sentido en algunos proyectos pero en general complica lograr un movimiento consistente. Por otra parte usar uno o unos pocos Raycast es más rápido que dejar que el motor físico mueva tu personaje, aunque esto no tiene un gran impacto si el collider de tu personaje es una simple cápsula.
  13. 2 likes
    Francoe1, es un lujazo ver a Don Gonzalo usar su espada para disparar la llama de poder en el Build. El disparo funciona perfectamente. Aunque ahora tengo que lidiar con otros problemas más (casi todos los scripts están construidos con la misma lógica que éstos), los intentaré lidiar con los conocimientos y consejos que he aprendido con tu ayuda sobre public static, los get; set; y las instancias. A ver si puedo apañármelas. Te estoy eternamente agradecido. Mil Gracias de nuevo. PD.: No se descarte un próximo post con más quebraderos de cabeza!
  14. 2 likes
    En PC juego con mando o ratón/teclado. Desde el FIFA, Need for Speed, Battlefield V, RDR2, bueno decenas. En Android cero patatero. Mírate esta web que contiene detalles de cada app en steam, sus ventas, jugadores, etc: https://steamdb.info/
  15. 2 likes
    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.
  16. 2 likes
    Es recomendable utilizar una extensión de IList que soluciones el problema, no por rendimiento, si no para mantener orden y que el código se más fácil de leer. public static class System.Generic { public static void Shuffle<T>(this IList<T> list) { Random random = new Random(); int n = list.Count; for(int i= list.Count - 1; i > 1; i--) { int rnd = random.Next(i + 1); T value = list[rnd]; list[rnd] = list[i]; list[i] = value; } } } De este modo puede utilizar la extensión en cualquier lista dentro del código. private void SetData(List<Item> items) { items.Shuffle(); }
  17. 2 likes
    Hola amigos. Hace ya un año publique mi herramienta de localización CGLocalization en el Asset Store. Ahora está en la versión 1.1 con algunas mejoras y código fuente incluido. Ahora mismo estoy trabajando en otras Cree un blog específicamente para la herramienta donde publicaré los cambios que vaya implementando a la herramienta, documentación, tutoriales y más. Enlace al Blog: CGLocalization Blog Enlace al Store: CGLocalization Package Enlace a la versión free (Solo contiene ejemplos): CGLocalization Free Package Trailer:
  18. 2 likes
    Podrias compartir los errores o el archivo de debug del compilado. Esto puede deberse a que estas utilizando funciones que solo están disponible en una plataforma y/o el editor y por esta razón está generando errores el compilado.
  19. 2 likes
    @lightbug no voy a hacer quote de tu post por que se hace largo, pero estas en lo correcto, en el comentario "Es normal, me estresa un poco algunas cosas. Pero siempre intentaré tener respeto." Había escrito más explicando sobre el porqué de las cosas, la modularidad, los punteros de memoria y GC pero después de escribirlo me pregunte ¿Por que estamos compartiendo información de esta forma?. Cuando yo arranque en el desarrollo de juegos con previos conocimientos en programación tuve que estudiar y aprender muchas cosas, en esos tiempos en el foro estaba @Jocyf que compartía un material bastante llevadero, no se trataba de hacer una réplica del tutorial, si no, de la observación y la implementación de otras personas, luego, me di cuenta de la importancia del Open Source y lo gratificante que es empezar a apoyar proyectos en GIT. En todo mi camino desarrolle para grandes y chicas empresas , proyectos fáciles, complicados hasta fracase un par de veces pero nunca nadie me explico absolutamente nada, nunca me dijeron el "Por qué" se realizaba algo de cierta manera, siempre tuve que buscar la explicación por mi parte, esto no quiere decir que no exista gente sin ganas de compartir, de hecho en el foro oficial de Unity hay personajes que me han ayudado bastante con problemas que en ese entonces creía complejos. Me termine dando cuenta de algo, los programadores nuevos (no quiero generalizar) simplemente aprender a repetir. La programación es un ARTE y PASIÓN quienes lo comprenden son las personas que pasan horas y horas escribiendo código, intentando entender, aprender y optimizar todo al máximo, no importa que sepas como funciona, lo que importa es la experiencia que tenes para implementar el conocimiento en diferentes contextos. Dando la explicación anterior se puede deducir porque decidi no perder tiempo en contestar a esta persona y aprovecharlo en algo mejor. (Aca invertí mi tiempo) @Jhonatan00_00 No te lo tomes a mal, pero cuando no sabes de qué hablas, no tenes idea, es mejor no argumentar y menos aún intentar retrucar. Si quieres y realmente te gusta el desarrollo de juegos empieza por aprender y entender. En el topic hice 2 respuestas con soluciones, en la primera intente no invadir en la solución que el usuario encontró, esto es muy importante, cuando alguien te consulta algo tienes que responder siempre contextualizando el contenido según su conocimiento. La segunda respuesta es para ejemplificar que la problemática tiene una solución alternativa, más eficiente y la que se utiliza generalmente para resolver este problema, el incremento de una variable para este tipo de cosas es totalmente impracticable, inestable, inseguro, etc. Sin embargo, existen más formas aún, que se implementan en contextos diferentes, en conjunto con otros componentes que forman un sistema modular. En resumen, no quiero que se mal entienda, me gusta ayudar y compartir mi conocimiento, me gusta leer a otros usuarios, pero me rompe mucho lo huevos que se intente discutir sin argumentos y/o conocimientos. Saludos-
  20. 2 likes
    Si no mal recuerdo Mask Avatar aparece junto Animator Controller, version 4.0. Fíjate que deberías tenerlo, yo use mucho tiempo la 4.2.x y tenía Avatar Mask.
  21. 2 likes
    La idea está bien, la herramienta aún tiene mucho trabajo por delante, pero el núcleo parece bien encaminado. Cosas que agregaria. Posibilidad de crear muros fijando su ANCHO y ALTO Posibilidad de biselar borders. Simple sistema de auto guías. Manteniendo Shift que la línea esté en un ángulo recto Trabajar con curvas bezier. Temas, que las texturas tengan nombres genéricos y puedas crear temas, y puedes asignar cualquier tema en runtime, esto puede servir para ciclos de día y noche donde las luces cambian, cuando llueve, nieva, etc... Tambien para diferentes épocas festivas, como halloween, navidad, ... Creo que con esto estaría más que suficiente. El valor que le pondría al assets sería de u$d 35
  22. 2 likes
    En el animator existen Mask Avatar que son justamente para habilitar o deshabilitar el link de los huesos con la malla. https://docs.unity3d.com/es/530/Manual/class-AvatarMask.html Todo esto se llama IK (Inverse Kinematics) es un tema complejo a nivel matemático, pero Unity ofrece módulos que solucionan parte del problema. Recuerda que puedes utilizar OnAnimatorIK desde un componente que se encuentre en el mismo GameObject que AnimatorController para sobre escribir y crear tus comportamientos IK. animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, leftFootPositionWeight); animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, leftFootRotationWeight); animator.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootObj.position); animator.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootObj.rotation); Puedes asignar el peso del IK, mientras más cercano al 1 se encuentre menos fuerza tendrá la animación. Revisa esta sección, está perfectamente explicado y en español. https://docs.unity3d.com/es/2018.4/Manual/InverseKinematics.html
  23. 2 likes
    Hola, no soy un experto ni nada y además hace 1 año casi exacto que vendo assets, así que lo que digo agárralo con pinzas. Lo primero que sí tenés que hacer (fuera del tema del precio) es unirte en el foro de Publishers del foro oficial. No recuerdo si necesitas publicar primero o solo con registrarte como publisher te dan el pase. La cuestión es que ahí se discuten este tipo de temas y más. Un topic estaba orientado exactamente a esto, y un developer de Unity dejó este video: En definitiva no existe una respuesta 100% clara. El precio de algo (dentro de un contexto) acarrea la información de tu producto. Entra la cuestión de que somos seres caóticos y emocionales, y estamos dispuestos a comprar algo, no solo para usarlo, sino también para lucir y refregar en la cara lo que pagamos (o al menos creérnosla de que fue bueno, lo sea o no tanto). Es difícil decirte $ X estando muy seguro (esto debido a que internamente no conozco tu asset, y creas o no, todo vale, no solo los features) pero puedo plantear algunas cuestiones que para mi son importantes (mmm ya me veo escribiendo un post largo ): 1 - Oferta/Demada + Tu toque: El primer error es suponer que el precio representa el esfuerzo detras. Si esto fuera así un asset complejo saldría un ojo de la cara. Como todo, es un balance entre oferta y demanda, pero también podés meter el "factor humano" en el medio. Esto va de la mano con el punto 2 (casi el método clásico de elección en el Asset store) ---> 2 - Buscar assets similares: Esto puede ser beneficioso o no. A veces tenés que hacer la tuya y sobresalir con el precio. Basicamente le decís a quien te compra el producto "Soy mejor que el resto" (que dicho sea de paso es alguien que probablemente no tenga conocimiento del "resto"). Esto lo podés asociar a una "etiqueta" de precio (creo que así las llaman). Por ej, para el mundo de los juegos, si compras algo de $60 es un juego AAA (esto ya es como cultura general ya), entonces vos esperas un producto así. Buscá un asset similar y (como estás arrancando) cobralo (no se) 5 dolares menos ... esto va al punto 3 ---> 3 - Futuros incrementos: ¿Cual es tu plan a futuro con el precio? pensas poner el asset a un precio final de entrada? o ir incrementando poco a poco? (una o dos veces el primer año). Quizás esto pueda usarse como estrategia también. El comprador solo se da cuenta de esto, no es necesario hacer un aviso. 4 - Más allá del contenido del asset, muchas veces lo que vale (y mucho) es: 4.1 Soporte: Responder mails, resolver bugs, etc. Atención en general, ser "profesional", saludar formalmente. Basicamente transmitir al cliente y al resto que están lidiando con alguien que se preocupa por ellos, no solo alguien que junto código y lo subió a la store para ganar dinerillo. 4.2 Documentación, manuales, referencias de API, todo esto te da un colchón impresionante. Evitar word, bloc de notas, y todas esas cosas medias cutres. Es muy útil saber redactar tu documentación y además presentarla bien. 4.3 Extras de todo tipo: página web propia, demos, redes sociales, contactos, en redes sociales y en el mismo foro de Unity. 5 - Código "PRO" (al menos a la vista jaja): Esto puede o no aplicarse a tu caso, si tenés código está bueno diseñarlo usando ciertos estándares, sobretodo para extenderlo, mejorarlo vos mismo y además brindar documentación de la API. No solo algo que haga un tarea y listo. EJ: Esto mueve a un objecto 5 unidades por segundo en una dirección: Esto hace exactamente lo mismo, y además explica bien de que va cada campo y método, además de que permite personalizar el método (en esta caso una pavada) con una implementación propia haciendole un override: 6 - Metadata: A lo último pero muy importante también. Que és esto? videos, imagenes, Logos, etc. Tampoco es necesario pegar altas ediciones de video, ni ser un experto de Ilustrator, simplemente tener algo de gusto y un poco de sentido común. En resumen, te sugiero que te vayas al punto 2. Empezá a buscar asset similares. Si pensas que a futuro lo vas a dejar mejor que no te importe cobrar más incluso si a la primera no vendés nada. Tené cuidado con poner algo a un precio y bajarlo porque no se vende, esto lo que transmite es falta de confianza. Tampoco pongas un precio exageradamente bajo porque lo vas a terminar subiendo mucho seguramente. Tu asset se ve muy prometedor! La verdad que por lo técnico soy un queso diciendote vale tanto. También te diría que mantengas ese "look Unity" y no metas demasiados colores y cosas a la UI , basicamente usá estilos compatibles con Unity (Button, Box, HelpBox, etc). No hagas lo que hizo el autor de Aura2 (En las reviews lo matan con esto). Otra, andate a los UI Element si podés, este año va a ser el año del pase, más de la mitad de la gente que usa el Asset store está en 2019! (está en el foro de publishers). Y además 2020 trae (supuestamente) el nuevo Input System. Así que para nosotros que vendemos assets es un momento clave de transición. (jaja terminó el magapost y no te dije ni un valor ... ponele $15 dolares a ver que pasa , de última le subís) Saludos
  24. 1 like
    @Jhonatan00_00 tu idea por genial que parezca es nula la posibilidad de que alguien te lo copie. Estas pidiendo ayuda en el Foro y recibiendola de forma desinteresada, una forma de contribuir es empezar a publicar tus proyectos, imágenes, pequeños gif, videos que expliquen los puntos que destacan. Con este pensamiento no debería existir Kickstarter, estamos hablando de proyectos de categoría empresarial compitiendo cara a cara para lograr el apoyo de la gente, y creeme, no se roban las ideas. - FL Studio vs .... No, es muy raro que un músico utilice FL Studio para grabar música (omito el REGGAETON, TRAP o variante, por simple hecho de no ser música), de forma profesional se utiliza Pro Tools y hace unos años están migrando a Ableton Live, esto te lo digo con toda la certeza del mundo, mi vida se separa entre la programación y la música. Blender vs 3DSMax Super discutido el tema, pero, es imposible comparar estas herramientas, 3DS Max es increíble, va más allá de lo que se puede hacer con simples vértices, existen modificadores, scripts y otras cosas que complementan a 3DSMax de forma que lo hacen la herramienta más potente del mercado, Después pasaremos a Maya que es un mundo aparte igual de potente. GIMP vs Photoshop Unity Gratis Lamento decepcionarte 1 vez mas, unity no es gratuito. Si nadie vio tu juego, y simplemente lo estás desarrollando para satisfacer tus gustos lo más probable que termines como el auto de Homero Simpsons. Saludos!
  25. 1 like
    Cómo experiencia te puedo comentar que he realizado muchos proyectos de los cuales algunos fueron juegos, y si, es bastante desalentador meter mucho esfuerzo en algo que luego queda en el olvido, muchas veces se debe a malas decisiones de diseño. Pero como verás sigo metiendo muchas ganas a aprender y programar, enfócate en terminar el proyecto y compártelo en la comunidad, también puedes crear un tópico WIP para que tengas un feedback y te animes a seguir. Este mundo es así, si subes el listón la cosa es aún peor, por lo pronto quiero ver algo de ese proyecto, videos imágenes y más información, la comunidad te va a ir dando ideas. ---------- Fuera de la parte emocional, tenés que pensar que el desarrollo es una profesión, por lo cual muchas de las herramientas son licenciadas y con un coste bastante elevado, esto es justamente para filtrar gran contenido mediocre y asegurar por lo menos que hay un contrato de calidad. Steam, Google Play, iOS tiene licencia que van entre los 30U$S a los U$D300 luego a esto tienes que sumar las licencias de los software de diseño como Photoshop, Illustrator, bueno, todo lo de Adobe ya que está comprando todo.... Pero para eso esta UnitySpain, acá podés compartir tus proyectos y obtener las críticas necesarias para seguir mejorando, cuando te sientas cómodo con algún proyecto puedes pensar en publicarlo de manera comercial!
  26. 1 like
    Discutir problemas e implementaciones técnicas de esta índole requieren mucho conocimiento en varias áreas pero las que más peso tienen son GAMEPLAY y UX. Muchos juegos basan su Gameplay para ser ejecutados con Joystick, es el caso de juegos de Fútbol, Tenis, Básquet, mientras que otros se basan el uso de keyboard y mouse, pero ¿Que los lleva a esta decisión?. Desarrollar un videojuego o cualquier otro proyecto requiere de planeamiento, dentro de este se evalúan puntos importantes, como la plataforma, el público objetivo, la dificultad, etc. estos datos son los que llevan a definir qué tipos de tecnologías se van a utilizar, tecnologías engloba la forma de entrada o conexión que va a tener con el usuario. Si la mecánica y las tecnología de entrada pueden parecerte dificil, entonces no tiene sentido hablar de UX, aquí la cosa si se vuelve compleja, se requiere mucho CONOCIMIENTO y experiencia, gente con estudio que analize la forma más simple de hacer todas la acciones dentro del juego, si esta persona no sabe qué tecnologías se van a utilizar no puede trabajar. Piensalo, te estoy dando ejemplos con profesionales de la industria. Mi recomendación como la de @iRobb es que no te preocupes por estas cosas, va más allá de lo que podemos realizar, mejor intenta que todo funcione con las tecnologías universales, teclado, mouse y monitor, el resto con el tiempo iras aprendiendo. ------ Que quiero decir con esto, no pierdas tiempo en este tipo de planteamientos, son complejos de expresar y de entender, mejor ocupa el tiempo en el proyecto.
  27. 1 like
    En un componente (script) ubicado en el mismo lugar que el Animator, poné: void Salto01() { //Tu código ... } Si se está disparando el evento y ningún componente (del gameObject con el Animator) tiene este método, se te imprimirá en consola un error. Si el clip es importado (creo que figura como ReadOnly) tenés que irte a las opciones de importación del asset, tab Animation, luego metete en el clip, events y definí todo por ahí.
  28. 1 like
    Las animaciones importadas desde un modelo no son lo mismo que las animaciones creadas desde el componente Animation View.
  29. 1 like
    Cómo te lo has currado, tío! Este finde me pondré a ver si lo depuro un poco guiándome por tus consejos. Mil gracias, Francoe1. Ere un crack!
  30. 1 like
    En general es muy común que si arrancás no sepas usar los Lerp, por lo menos yo la pasé igual. El truco está en entender cómo es que se usan para lograr ese efecto de suavizado. El efecto se debe a dos cosas: Que el "punto a" (primer argumento) cambie cuadro a cuadro. Debido a 1, el desplazamiento respecto del "punto a" (afectado por el tercer argumento) parece ir reduciéndose (el factor aproximadamente fijo, el desplazamiento este no lo es). Interpolar linealmente (Lerp) es algo que todo el mundo sabe, por ejemplo si tenés un punto en a y otro en b e interpolas con un factor de t (0 a 1), tenés que el resultado c = a + (b - a) t (creo que lo puse bien), basicamente te vas acercado en un factor t al destino. El truco está en reasignar el punto a (el item 1 anterior): En vez de: c <- a + (b - a) t Ahora tenés: a <- a + (b - a) t Ahora, cuadro a cuadro vas a estar moviendo el origen, y por lo tanto el Lerp va a cambiar también. El efecto es algo así (t = 0.25): A ----------------↓---------------------------------------------- B A--------------↓------------------------------ B A--------↓-------------------- B A-----↓------------- B El Color.Lerp hace exactamente eso, pero con floats, y considerando componente a componente.
  31. 1 like
    Buenas gente, Os dejo un enlace de una web muy chula, de fluidos creados con webGL podeis cambiar parametros y ver los resultados. https://paveldogreat.github.io/WebGL-Fluid-Simulation/ Espero lo disfruteis, como yo, jeje
  32. 1 like
    Hola gente, acá les traigo un problemita que estoy teniendo con la documentación. Resulta que hace poco lancé un nuevo asset para el Asset Store y realicé la documentación online (Este es el sitio: https://lightbug14.gitbook.io/ccp/ ). La cosa es que quiero tenerla de forma offline también ( sin pagar 1 centavo ;) ). Dicho esto, no quiero usar ningun formato de libro o impreso, quiero se sea contenido web, tipo html (o markdown, que basicamente terminará en html).Es decir, ningún GoogleDocs, MS Office , Libreoffice, etc, ya que estos no están pensados para documentos técnicos (formato muy caótico, además de que tampoco disponen de la creación de un panel de navegación). Tengo experiencia con LaTeX para generar documentación/tesis en pdf (lo he usado muchísimo y es genial) pero estoy buscando algo más "digital", de nuevo, esto no va a ir a parar a un formato impreso. Para que se entienda un poco, realicé esto usando Markdown + GitBook + Github pages. Para los que no sepan que es esto que les digo (y ya que está les hago conocer estos grandes recursos): Markdown: Un lenguaje que te permite rapidamente escribir y etiquetar los bloques de texto como en el html de toda la vida (parrafo, header1,header2, itálica, negrita, etc) pero sin usar los tags de html (Ej <strong> ... </strong>). Si quieren jugar con esto aca dejo un editor online de Markdown --> https://stackedit.io/ (denle a "Start writing" arriba). ... el típico readme.md de los repositorios de github está en markdown. Gitbook: una plataforma de generación de sitios estáticos (sin bases de datos, permisos, etc, simplemente todo el contenido va localmente a la computadora, como un documento estático), la cual permite recopilar "páginas" en lenguaje markdown y crear/compartir un sitio online, ya sea público o privado. Te ofrece todos los chiches incluidos, buscador, barra de navegación (con anidación y todo), sistema de puntajes, estadísticas, una interfaz gráfica muy amigable, etc. Github pages: (muy pero muy de moda hoy en día) Basicamente te permite convertir un branch de un repositorio de github, usandolo como "hosting" gratis. Por ejemplo, se puede usar para una página estática (html+css+js). Este tiene la interesante posibilidad de usar markdown directamente + Jekyll (un embellecedor). Bueno, usé todo esto combinado y estoy muy contento con el resultado. El tema es que quiero "descargar" el html completo para entregarlo con el asset en formato html. Gitbook ofrece una opción de "PDF Export", pero hay que pagar :( Y por qué no pagar y listo? Por dos cosas: Termina siendo pdf, cosa que no quiero. Porque hay tantos generadores de sitios estáticos gratuitos en internet, que seguramente gracias a mi incompetencia e inexperiencia en el tema estoy obviando alguna alternativa 100% viable y sencilla. ---> Por eso escribo este hilo, si alguien tiene o ha tenido experiencia en esto sería muy bueno conocer su opinión al respecto. Desde ya que esta consulta no está ligada al desarrollo de juegos, puede ser que hayan utilizado generadores para construit su sitio de poesías, su blog personal, su sitio ilegal de ventas de armas, lo que sea que requiera de contenido estático. Alternativas: He probado mkdocs. Este hace exactamente esto, recopila páginas de markdown y te indexa todo con un lindo panel de navegación etc etc. Problema: ha quedado algo obsoleto, o por lo menos la versión que uso no funca para nada. La última sería usar html de toda la vida(manualmente). Problema: Sería un dolor de quinotos, sobretodo el tema del panel de navegación, pero si se pudiera automatizar el proceso (con scripts y que se yo) estaría dispuesto a hacerlo. Saludos.
  33. 1 like
    Perdon que no conteste, pero no se porque no se habian activado las notificaciones de sus mensajes. @lightbug En multiplayer hay dos partes de las cuales ya grabe una. Vamos a hacer un servidor autoritativo propio, desde 0 y sin usar ninguna libreria externa ni paga. este tipo de servidores sirven para juegos de estrategia, juegos de cartas, juegos que sean por turnos,etc. digamos que "juegos lentos" y que no manden muchos mensajes por segundo a travez de la red, en los cuales la latencia no afecte tanto. En segundo lugar vamos a ver todo sobre photon que es la libreria mas utilizada para juegos en multiplayer. Haber hecho nuestro propio sistema va a hacer que usar photon sea muy facil y vamos a poder hacer cualquier tipo de juego con esta libreria, mas q nada juegos "fast peaced" de corte FPS, MOBA, RTS, etc. La mayoria de las cosas que grabo no estan atadas a algun feature de unity, son conceptos, temas y metodologias de corte general, que te sirven para cualquier tipo de programa, no solo en juegos e incluso no solo en unity. Si llegan a ver mas lenguajes de programacion o otros engines, van a ver que el contenido les va a servir igual. La idea es enseñarles a hacer lo que sea! no hacer un tutorial paso a paso de como hacer X juego, sino enseñarles a que se puedan arreglar solos. si yo enseño paso a paso como hacer un inventario por ejemplo, no es tan util como enseñar cada concepto necesario para hacerlo... Intento que al que vea los videos no se quede con una guia para realizar cierto algoritmo, sino que se queden con conocimiento y entendimiento para poder desenvolverse solos en el mundo de la creacion de juegos. ------------------------- @iRobb Sin duda! de vez en cuando entro y levanto el post con avisos de "el estado del tutorial". Pasa que para llegar a lo avanzado e intermedio hay q pasar muchos temas que son basicos para que el que agarre los tutos mas altos no se quede sin entender. ademas cuando ya di un concepto, cuando lo menciono, en vez de volver a explicarlo digo, Este tema es de la clase "x numero", si no te queda claro, volve a esa clase y repasalo. No quiero dejar a nadie suelto! xD en temas mas avanzados vamos a ver sistemas que son muy usados, patrones de diseño de codigo, antipatrones, generacion procedimental, AI, algoritmos avanzados, sistema de despacho de mensajes, estructuras de datos complejas y demas. Saludos y los veo en los tutos! cualquier cosa mi mail es patito.cuak@gmail.com y mi server de discord (Y el de los tutos) es https://discord.gg/4eDmtu @pioj si, es algo que note, mas que nada en los primeros videos! no estaba tan cómodo hablando a la cámara y eso, pero a partir del tuto 10 en adelante agarro mejor ritmo, ademas de ahí empece a preparar mas cada clase con antelación y eso hace que explique de mejor forma y con mas soltura cada tema, lo cual mejora la calidad y velocidad de los videos. Gracias por el comentario y lo tengo en cuenta! un saludo y espero verte por el canal!
  34. 1 like
    solo tres elementos? quizas hacerlo con "random" y con "if" para casos con mas elementos suelo hacer una "list" con todos los elementos y hago un bucle "for"... entonces, en el bucle, con "random" elijo uno delos elementos y asigno donde sea y le hago "remove" de la list...entonces ese elemento ya no esta en la list... y sigue el bucle escojiendo al azar elementos de la lista y quitandolos de ella... pero solo para tres seria mejor hacer algo asi; int seleccion1 = Random.Range(0,3); int seleccion2 = Random.Range(0,2); if (seleccion2 >= seleccion1) { seleccion2 += 1; } int seleccion3 = 0; if (seleccion3 >= seleccion2) { seleccion2 += 1; } if (seleccion3 >= seleccion1) { seleccion3 += 1; } .... aunque no se si esto era una duda tuya real o era un ejercicio para nosotros... o para los noobs... si quieres borro mi respuesta para que la gente haga el ejercicio
  35. 1 like
    Buen trabajo. Yo hice el mío hace tiempo, seguro que no tan atractivo visualmente como el tuyo aunque práctico. Una de las características que le añadí es qué, en vez de editar un archivo de texto y que la información de los idiomas fuera estática, es vincularlo con una BBDD de Firebase. De este modo hay dos ventajas: 1. Se descarga solamente el idioma que proceda en su momento (o en opciones si se cambia). 2. Puede editarse externamente sin recompilación del app. No añadir nuevos pero si modificar los datos existentes. Saludos
  36. 1 like
    Bueno, eso es porque estás aprendiendo de la manera que no se hace. Los tutoriales son atajos que pueden "ablandar" un tema, "ejemplificar" algo, "hacerte dar el click" luego de haber pasado por lo teórico. Son suplementos de una base, no la base en sí. Ojo me refiero a tutoriales al 100% (hacé esto, después esto, y así), hay algunos que incluyen material teórico que están muy bien, pero en general no recomendaría un tutorial. Es necesario saber la teoría para comprender un tema al 100%? Sí -> Manual Es necesario comprender un tema al 100% para hacer cosas? No, dependerá del uso que le dés, pero en general alcanza con conectar mini conceptos dentro de un contexto. Eso sí, probablemente no vas a terminar dando una charla pública, exponiendo el tema en cuestión durante dos horas, pero te va a alcanzar para hacer lo tuyo. Esto quiere decir que nadie nunca se va a los tutoriales de una? Claro que no, todo depende. Por ej, sale el nuevo input system, bueno, me voy a un tutorial (solo para verlo en acción y sacar lo básico que necesito), en el mismo hablan de interfaces de C#, scriptable objects, assets, eventos de C# para escuchar a tal acción, etc. Esos temas ya los conozco, no pasa nada, puedo hacer la mía. Si más adelante me interesa indagar más pues me voy a la documentación. Caso contrario, imaginate a alguien no sabe qué es un asset, un scriptable object, qué es C#!! dios mio tremendo embole. Es decir, conociendote vos mismo sabés hasta que punto te podés mandar o no a un tutorial. Por favor, si vas a ver un tutorial que sea de calidad, si es un video que sea de Brackeys para arriba, siendo Sebastian Lague el hijo de su madre más hijo de su madre de todos . Dicho esto, si te considerás un principiante y tenés ganas reales de aprender, alejate de tutoriales lo que más puedas. O por lo menos, usalos inteligentemente (como puse más arriba), para suplementar el tema. El manual es ultra detallado (me atrevería a decir que en un 95% de los temas). Hay algunas cuestiones mucho más técnicas (como físicas por ej) donde es necesario indagar más, como preguntarle cosas a los Unity Devs en los foros, realizar pruebas, etc. Pero en general, todo está ahí, es la principal fuente de información, no existe libro en la tierra que supere al manual (así como no existe nadie que tenga más experiencia siendo yo que yo mismo). Tenés manual y referencia, ojo que no son lo mismo!. Las referencias actúan como una clásica referencia de API (funciones, métodos, propiedades públicas, etc), en cambio el manual es pura explicación y desarrollo de los temas. Las referencias de API no exponen contenido teórico, no se puede aprender con ellas, solamente explican la interfaz (de ahí su nombre). Y bueno, obviamente si querés aprender C# anda derecho a aprender C#. Si querés algo en formato libro tenés uno muy bueno y muy conocido (eso sí lo conozco en ingles) que se llama: "C# 7.0 in a nutshell: the definitive reference" , podés pegarle una ojeada a los temas en Google Y claro, es eso es lo que hace. Con respecto a los libros de Unity, no es por desmerecer a los autores que enseñan Unity, hay muy buenos libros (y otros que meeee). En mi opinión Unity se aprende desde la fuente, es decir, Unity enseña Unity mejor que nadie, además de que ofrece material actualizado (o no, si querés aprender Unity 3 tenés material también). Sumá: C# Manual de Unity Unity Learn Y tenés todo lo necesario. Como está arriba, no es necesario aprender al 100% C#, en Unity Learn tenés un curso de scripting bien fácil que te introduce a cada partecita de C#, con eso debería bastar para arrancar (por lo menos para pegar el envión). Saludos
  37. 1 like
    Mira este topic - https://blogs.unity3d.com/es/2019/05/14/introducing-the-animation-rigging-preview-package-for-unity-2019-1/ Y este https://blogs.unity3d.com/2019/09/05/advanced-animation-rigging-character-and-props-interaction/
  38. 1 like
    Me gusto tu respuesta! con esa actitud deberías responder siempre. Esto no es algo intencional, imaginate que vos no entendes ciertas cosas por lo cual tu contexto está basado en tus conocimientos, para darte una respuesta real debería conocerte y poder contextualizar las cosas. Es por esta razón que siempre intento contestar de la forma que creo más correcta, de esta manera puedes seguir buscando información relacionada y solucionar tus problemas. Algo muy importante, si quieres aprender lo mejor es leer toda la documentación de Unity es corta y tiene información muy importante para entender muchos conceptos, yo la he leído varias veces, algunas en inglés y otras en español, mi ingles no es muy bueno y me costo baste pero mis ganas de entender superan esas limitaciones. Anímate a Leer, los videotutoriales son un arma de doble filo, si bien lograr un resultado más inmediato es muy dificil asimilar los concepto, sobre todo, por que mucha gente que hace tutoriales no sabe el porqué ni el concepto de las cosas. Saludos.
  39. 1 like
    Buenas noches, ya veo la cantidad de información que voy a tener que procesar... creo que ya me está doliendo la cabeza solo de mirar cosas y mas cosas por encima. Cuando no entiendes algo y te esfuerzas por entenderlo te agotas enseguida y mas a estas horas. Por eso mismo, no pretendan que un novato como yo o como otra persona que entra al foro con un problema super básico entienda todo eso. Es increible todo lo que saben ustedes y dudo que nunca llegue a saber la mitad, pero intento aprender sobre procedimientos prácticos, aprendiendo solo lo que me pueda servir y no teniendo que estudiar tanto para al final probablemente no usar mas que la mitad de lo que aprenda, porque en todas las carreras hay mucho de paja y poco de grano como se suele decir y no creo ni que sea necesario. Cuando entro al foro me doy cuenta que es el mejor foro de Internet sobre Unity y es gracias a ustedes, por todo lo que saben, pero también me doy cuenta de que cuando alguien pregunta cualquier cosa suelen liarlo mucho, porque empiezan a explicar toda la teoria de un montón de cosas y a nosotros ya nos cuesta dar con la tecla para hacer una chorrada. De todas formas no viene mal aprender, voy echándole un ojo a esto y a lo otro. Un saludo.
  40. 1 like
    Bueno, tal vez no soy el más indicado para decir ésto pero... En lo que llevo en UnitySpain (Desde el 2018) he aprendido y visto que los usuarios, verdaderamente reciben ayuda. Hay quienes llega a esta comunidad a aprender y conocer más de el desarrollo de videojuegos, algunos inician desde aquí, porque encuentran motivación con las cosas que se pueden hacer y tienen esas ganas de querer seguir haciendo más, porque saben que tienen toda esta información y apoyo de la comunidad. Tal vez no lo entiendan, pero lo que quiero explicar es que: La comunidad no puede quedar abandonada, la información de post anteriores es muy extensa y para los nuevos que se adentran al mundo del desarrollo, eso les podría ser muy útil, porque como @lightbug dice "Incluso el foro oficial de unity es un chiste frente a este" . Lamento la decisión de @pioj sobre el retiro, espero tengas mucha suerte en lo que sigas. No soy el mejor programador o muy activo en los post, pero pueden contar con mi ayuda para mantener la comunidad activa por si deciden aceptarla.
  41. 1 like
    @pioj Que decisión tan grande te has tomado, pero los cambios siempre son buenos y necesarios, no queda más que agradecer el gran esfuerzo que has puesto para que el foro tenga hoy en día todo su reconocimiento, con mis más sinceros sentimientos te deseo lo mejor en este cambio. En cuanto al foro, creo que somos pocos lo usuarios que desde hace aproximadamente 10 años estamos en la comunidad aportando y ayudando, no me gustaría que esto se pierda y de repente ya no contar con el foro, los que aún quedamos y con pasión disfrutamos lo que hacemos seguramente se nos hará un nudo en la garganta. Si no encuentras un reemplazo me gustaria hacerme cargo del legado de UnitySpain por algún tiempo, sería genial contar con la ayuda de @lightbug que es uno de los usuarios más activo del foro y por cierto Argentino lo cual es una ventaja en cuanto a contacto (si @lightbug, es una invitación). También invitó a @iRobb Desde ya, gracias por tanto y suerte con el siguiente paso en tu vida! Un abrazo
  42. 1 like
    Jaja arranco leyendo la página y decía "Por favor, procurad que el tono de esta conversación no suba a más ..." ... here we go again Eso es buena práctica de programación, y probablemente no lo veas ahora, pero tiene todo el sentido del mundo. No es simple capricho. Keycode: Este me parece el más obvio de todos. El script no se llama "DetectTheFKeyTime", osea que asume una "Key" genérica. Que pasa si le pasás el código a alguién que no tenga la tecla F de su teclado? (no se, se le cayo pegamento justo en el contacto). Claramente esta persona se queda sin poder hacer sus propias mediciones porque el programador responsable no supo proyectar, algo clave en este rubro. Como se arregla, posibilitando la selección de otras inputs, es tu problema actual? No, puede ser el de mañana? quién sabe... Evento: Si tuvieras que detectar esta tecla en 15 monobehaviours distintos, tendrías que copiar y pegar todo el código en cada uno. Bueno, ya no es necesario, porque suscribiéndote al evento deseado simplemente le indicás el método a llamar y el proceso ocurre "under the hood". // Action<float> Pepe --> void Pepe( float arg ) public class UnMonoB : MonoBehaviour { [SerializeField] DetectKeyTime detectKey = null; void OnEnable() { detectKey.EventFinish += EventFinish; } void OnDisable() { detectKey.EventFinish -= EventFinish; } void EventFinish( float duration ) { // tu código... } } Condicionales: Los if esto o if aquello no representan el problema, muchos de estos procesos corresponden a decisiones lógicas irrelevantes. La papa está la tareas específicas, es decir una vez que ya ingresaste en alguna función o método, quizás el manejo de memoria, la creación de basura, multi threading, etc. Dicho esto, la programación no está en hacer que algo simplemente funcione (eso lo hace cualquiera leyendo las referencias) si esto fuera así muchos investigadores, matemáticos y científicos que usan python o matlab para programar serían tremendos programadores (y claramente no lo son, uno se da cuenta). Para ellos, que quieren ser 100% funcionales va perfecto, que hagan todo el spaghetti que quieran (ya que simplemente necesitan apretar un botón y que la computadora haga un cálculo una vez y listo). Un buen programador ve más allá de lo obvio, está proyectando soluciones a problemas (no errores) que quizás no existen en el momento, pero que seguramente van a aparecer. Cosas que pueden solucionarse con modularidad, abstracción, dependencia, extensibilidad, etc. En mi caso personal esto lo viví de una manera muy graciosa, un profesor de una materia de redes nos pidió hacer un trabajo práctico. Lo hice, todo perfecto, el programa a desarrollar debía leer un archivo txt con unas IP, después clasificarlas y demás. La cosa es que se lo entregué, el abrió el programa y a la hora de poner el argumento (Debía de ser "ip.txt") puso ""#$$"#ADF!!!!!¡¡¡?-----a1" ... y claro todo falló. Desaprobado. Cual fue el error? que yo como programador pensé que todo iban a ser buenos chicos, chicos de bien y poner "ip.txt"...grave error. ---> Lo del "?." lo hizo para cancherear, total y absolutamente, no es la primera vez . La memoria ocupada por un float no es el "problema" aquí. La cosa está en llamar a esa variable múltiples veces desde una clase externa, siendo esto absolutamente innecesario. Sé que suena raro, desde ya que arrancar poniendo el foco en el DeltaTime no es algo que va a ser relevante frente al resto de las complicaciones que conlleva la creación de un juego (gráficos, lógica, networking, audio, manejo de memoria, etc). Ahora, si aislas todo y te ponés a pensar en lo que implica esto, estas llamando X veces (Ojo al piojo, X puede ser 40 como 40000000) a un valor que no cambia durante el frame, y que lo creas o no tiene un costo (no es gratis). Muchas veces está bien si estás en modo funcional y necesitas terminar algo de la noche a la mañana. Ahora si vas a hacerlo de forma seria sí hay un problema. Todo dependerá del contexto y de cuán adentrado estés. Por ej si pruebas este simple script (usando stopWatch) que incrementa un valor a (a1 y a2): using UnityEngine; using System.Diagnostics; public class test : MonoBehaviour { public int count = 4000; void Update() { long resultTimeDT = 0; long resultDT = 0; float a1 = 0f; float a2 = 0f; float dt = Time.deltaTime; Stopwatch watch = new Stopwatch(); watch.Start(); for( int i = 0 ; i < count ; i++ ) for( int j = 0 ; j < count ; j++ ) a1 += Time.deltaTime; watch.Stop(); resultTimeDT = watch.ElapsedMilliseconds; watch.Restart(); for( int i = 0 ; i < count ; i++ ) for( int j = 0 ; j < count ; j++ ) a2 += dt; watch.Stop(); resultDT = watch.ElapsedMilliseconds; print(string.Format("Time.deltaTime (ms) = {0} con a = {2} --- dt (ms) = {1} con a = {3}", resultTimeDT , resultDT , a1 , a2 ) ); } } Mis resultados para count = 4000 (osea x2 de 4000^2 = 32 millones de incrementos): Vas a notar la diferencia. Otra vez, ¿es super relevante ver el tema del Dt? no, pero si minimizar el efecto no cuesta nada mejor. ¿Vas a necesitar llamar 32 millones de veces un Time.deltaTime? nunca en la vida, si es así claramente estás haciendo algo mal. Esos casi 300 ms de más claramente justifican el definir un simple float. Saludos
  43. 1 like
    Que genial descubrimiento lo del openlibra.com @francoe1 Me he ido directo a retrogaming y está... la Microhobby Jajajaja Gracias!
  44. 1 like
    Es normal, me estresa un poco algunas cosas. Pero siempre intentaré tener respeto.
  45. 1 like
    para solucionarlo bien bien tendria que tener mucha mas informacion.... cual es el eje que mira hacia adelante en la cabeza.... porque si dices que estan mal los ejes signnifica que el Z no apunta hacia adelante... y entonces seguro que el Y no apunta hacia arriba y el X no apunta hacia la derecha.... porque lo suyo seria hacerlo usando los ejes y calcular cuanto tiene que rotar con respecto a como esta rotada "dentro" de la animacion... porque la animacion supongo que movera un poco la cabeza (suavemente).. lo suyo seria calcular el angulo usando los vectores de direccion de la cabeza... usando Vector3.Dot para obtener seno y coseno del angulo que forma la cabeza respecto al vector al que llamas "Direccion_Cabeza"(*)... y luego usar Mathf.ATan2 para hayar el angulo que debes girar. si me das los ejes, si me dices hacia donde apuntan los ejes x,y,z de la cabeza puedo intentar hacertelo, ...pero al final no se si funcionara bien... lo suyo seria que pudiera acceder a tu proyecto y asi te lo podria "arreglar" en un momento... unas unityCloud? tienes el proyecto en la "nube" de unity? si quieres te paso mi correo para que me des acceso (momentaneo) a tu proyecto y le hecho un ojo... aunque este finde me pilla un poco mal... estare viernes, sabado y domingo fuera... pero el lunes te lo puedo mirar si quieres (*) las variables deberian comenzar con minusculas ("direccion_Cabeza") y las "classes" y funciones en Mayuscula.
  46. 1 like
    hola puedes usar el transform.LookAt y luego rotarlo manualmene para corregir con transform.Rotate(x,y,z) por ejemplo pongamos que al rotarlo con LookAt la cabeza queda ladeada 90 en el eje Z pues luego le pones un Rotate(0, 0, -90) y solucionado.... o si queda mirando hacia arriba le pones un Rotate(90, 0, 0)... (pero despues del LookAt) espero que te sirva. sino, hay otras formas de hacerlo, puedes poner un objeto vacio (empty gameobject) dentro de la cabeza y que ese si este orientado correctamente, calculas el vector3 "normalizado" desde ese objeto al punto donde debe mirar, y con vector3.dot entre ese vector y los vectores forward y right puedes calcular el seno y coseno de los angulo Y que forma, ...y con el vector y forward y up puedes calcular seno y coseno del angulo X... sabiendo los senos y cosenos puedes usar Mathf.ATan2 para saber el angulo y luego los usas en el eje apropiado con Rotate, rotando porejemplo el eje "Y" con el angulo "X" y el eje "Z" con el angulo "Y"... o lo que sea... y aun hay mas maneras de solucionarlo.. porejemplo rotas la cabeza con LookAt, guardas los valores del transform.eulerAngles en un vector3 "angulosCabeza" y luego intercambias los valores de X por Y o lo que sea... osea pones los eulerAngles en otro orden... en vez de x,y,z luego le metes los valores en otro orden... z,x,y o lo que sea... aunque creo que hacer esto fallara porque primero tendrias que hayar el angulo entre el cuerpo y la cabeza (anguloY cabeza menos anguloY cuerpo) y eso son los valores que luego tendrias que intercambiar... y seguro que hay mas formas... si no te funciona ninguna de estas puedo pensar otra... o si no logras hacer una de las que te he puesto (ya que lo he explicado a lo rapido) puedo intentar explicarlo mejor... o tambien si quieres te pongo ejemplos con codigo
  47. 1 like
    Está en el post de más arriba. FixedUpdate, por las razones que mencioné antes. Velocidad = Δ desplazamiento / Δ tiempo Δ desplazamiento es la cantidad de desplazamiento que le tenés que agregar a tu objeto, es decir sería tu " + transform.forward * Velocidad * Time.deltatime ": Despejando: Δ desplazamiento = Velocidad * Δ tiempo De ahí sale la forma esta (que se llama de "Euler"). Todo en realidad parte desde las derivadas, pero acá te manejas con pequeños incrementos, osea el tiempo de frame a frame (no el frame count). En el mundo Unity sería: Δ desplazamiento = Velocidad * dt Y cual es el dt que debés usar? bueno, eso depende (y no tanto, ahora vas a ver) del método que uses: Si es Update Time.deltaTime te da el tiempo que tardó el último frame. Si es FixedUpdate (<--- es este) Time.fixedDeltaTime te da el tiempo que pasó en FIxedUpdates (generalmente coincide con "Project Settings/Time/Fixed step" (creo)) Pero, y si estás en FixedUpdate y llamás a Time.deltaTIme ¿que pasa?, nada, te devuelve lo mismo que Time.fixedDeltaTime ... yo siempre uso Time.deltaTime para todo y listo. frameCount devuelte la cantidad de frames que pasaron, osea que no es un dt, no sirve. Eso habría que ver el código, osea con "tener dos fuerzas programadas" no se entiende demasiado. Lo que sí se sabe es que se debe hacer una sola llamada a MovePosition por frame físico. --> https://docs.unity3d.com/ScriptReference/Rigidbody2D.MovePosition.html It is important to understand that the actual position change will only occur during the next physics update therefore calling this method repeatedly without waiting for the next physics update will result in the last call being used. For this reason, it is recommended that it is called during the FixedUpdate callback. Note: MovePosition is intended for use with kinematic rigidbodies.
  48. 1 like
    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
  49. 1 like
    Primero un cuento corto: Me he decidido por al fin subir algunos assets al asset store (de los tantos que tenía, actualmente 3, Kinematic2D, GrabIt y LaserMachine) , pense "bueno esto es fácil, me registro, doy subir al asset store y probablemente dos días después me llegue un mail diciendome gracias por su tiempo Sr. Lightbug" bueno, no fué del todo así, pero después de medio mes de malabares, curso autodidacta intensivo de html+css (duración 1 día) y algunas luchas con Unity Connect acá estoy . ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ASSET STORE ----> Kinematic 2D DEMO ---> DemoWebGL DESCRIPCIÓN Kinematic2D es un controlador de personaje 2D Totalmente Kinematico (no basado en físicas) que te permite realizar el movimiento de tu personaje 2D mientras se encarga de manejar las colisiones correctamente. Basicamente ofrece las funcionalidades del Character Controller (Componente) que viene por defecto con Unity (y más), pero con tres grandes diferencias: Está preparado para movimiento bidimensional (de aquí el 2D) La forma del cuerpo del personaje es una caja (en vez de una capsula, esto es genial para platformers) Funciona con colliders 2D y 3D (Ej: colliders de sprites y 3D mesh) El principal objetivo de este asset es darte la posibilidad de que tú construyas encima un controllador de movimiento del personaje (Ej maquina de estados, habilidades, etc), sin preocuparte por la parte aburrida de las colisiones, así te puedes enfocar en el diseño y mecánicas de tus personajes ... lo divertido! .. para más info --> ir al link del AssetStore -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- PD: Después de haber creado (creo que por primera vez) un hilo en el foro oficial de Unity debo decir, que UnitySpain está años luz adelantado, en todo aspecto, volver aquí es como dejar de usar el intel pentium 2 para subirte a i7 realmente, (y ni hablemos del código) ... felicitaciones @pioj
  50. 1 like
    Un mini juego para Halloween para probar el AR Foundations de Unity 2019.2. La publicaré en breve. Espero os guste.
×
×
  • Create New...