Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 15,00€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales

Leaderboard


Popular Content

Showing most liked content since 01/29/2020 in all areas

  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. 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
  3. 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
  4. 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.
  5. 3 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.
  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. 2 likes
    Eso va a depender de la colisión en sí. El CC lo que hace es proyectar su forma y decir "movete hasta ahí", pero no la hace de manera perfecta, en algunos casos simplemente queda un poquito penetrado en el collider. Si esto pasa, es posible que la "caja" lo detecte y sea empujada (por la misma simulación de físicas). --> Es un comportamiento deseado? No, no lo es, es un efecto no deseado, la caja no debería ser empujada nunca. Así que, si no te pasa, mejor. Por qué pasa esto? bueno, por situaciones de la misma escena, la forma del collider, la velocidad del personaje, la forma del personaje, por el ángulo de incidencia, etc etc. Por ej, also similar pasa en mi character controller. Si considero los rigidbodies dinámicos (caja blanca del gif) y los habilito para la "detección de objetos estáticos" (un layermask del personaje), lo que pasa es lo mismo que en tu caso, el personaje se proyecta con capsuleCast y detecta a la caja (en el gif no se ve ningun movimiento, como debería ser). En el segundo caso, sin considerarlo como estático (es decir sin que el capsule cast lo detecte) simplemente interactura normalmente, usando las físicas (que sería un "equivalente" a usar el callback en tu caso, aunque no es exactamente igual). Otra cosa que vas a tener que tener en cuenta es que las colisiones que hagas no van a ser "perfectas", con esto me refiero a que pasa lo siguiente: Se mueve el personaje hasta la caja (pegadito a ella). Se dispara el callback Se le da una fuerza a la caja Como ves, nunca vas a estar pegado + empujando la caja, siempre va a haber un pequeño espacio, que dependiendo la velocidad y fuerza de aplicación será más o menos notable. Lo ideal sería mover también al CC luego de haber empujado la caja, pero tendrías que esperar hasta después del step físico para saber donde va a terminar esta... sí, complicado. En estos casos podés usar algo que se llama PhysicsScene para meter a la caja sola en la escena, resimular el step físico, ver donde terminará la caja, y luego ahí posicionar el CC. Pero bueno, esto lo menciono medio a laire, si estás usando el CC de Unity no tiene sentido ponerse heavy con todo esto, con el callback debería darte resultados medianamente pasables. Si tu caja fuera muy "predecible", quizás hacer a la caja kinemática pueda ser una opción viable, pero ya no estamos hablando de físicas reales ni nada, simplemente movimientos norte, sur, este y oeste, tipo un laberinto de pacman. Sin agregarle un collider a qué? al personaje? el personaje tiene un CC que es (para las físicas) efectivamente considerado como un collider especial (esto lo podés testear con un OnTriggerEnter), pero sin reaccionar a nada, es kinemático basicamente. La colisión se detecta entre un kinemático (personaje) vs dinámico (caja) y se llama al callback. Este callback brinda información (el parámetro), de ahí en más está en el programador en qué hacer con ella. Saludos
  9. 2 likes
    Hola, mirá recordé este video de Sebastian Lague, pero hablaba de Ray Marching. Lo sé, está en inglés, pero con el video es muy fácil de seguir (fijate si podés obtener subtítulos, aunque no los recomiendo, muchas veces dicen cualquiera): * Video de ray marching 22/02 - 24/02 R.I.P * El tema es que después me salio en los videos relacionados, uno de Marching cubes jajaj: No he trabajado con estas técnicas, así que más no puedo sumar al tema.
  10. 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
  11. 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
  12. 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.
  13. 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.
  14. 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!
  15. 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/
  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. 1 like
    Me parece que todo el mundo encara este tipo de temas de forma errónea, y lo digo en general (no por lo que dijiste). El tema no está en qué se puede o no hacer con X o con Y herramienta. Una cosa es ser un profesional (2D ,3D,audio, etc) otra muy distinta es ser un desarrollador independiente. 1 - Si sos un profesional y estás buscando trabajo, te van a pedir manejo de software estándar en la industria, sea photoshop, adobe illustrator, pro tools, etc. ¿Esto es así porque son los mejores? No, para nada, es porque, además de ser muy buenos (no se puede negar), constituyen el "lenguaje de comunicación" entre pares o colegas tuyos, cosa que a una empresa le conviene (ni hablar de varias trabajando a la vez). 2 - Si por el contrario sos un desarrollador independiente, haciendo la tuya (como en tu caso supongo), está perfecto usar herramientas que hagan lo que necesites y sobretodo que sean gratis y bien soportadas. La verdad que lo veo excelente y siempre apoyo esto. Hoy en día se puede hacer cosas con programas gratis. La verdad es impresionante que existan estas maravillas. En mi caso siempre tiro por Blender, Gimp, InkScape, Reaper, Audacity, Godot, etc. También, coincido con lo que dijo @pioj. Mostrarse es la mejor forma de mejorar, el feedback es vital.
  24. 1 like
    Veo que te generas más problemas que soluciones, algo importante que debes saber es que: "Hay público para todo juego". A algunos les gusta los shooters, rpg, platformer, el llamado 2.5d (creo xD), juegos con gráficos realistas, gráficos de píxeles, cubos, de diversos colores, blanco y negro... Etc. Lo que los hizo conocidos no fue por ser el mejor juego del mundo, si no, porque hubieron quienes estuvieron dispuestos a desarrollar algo que les gustaba, así comenzaron a contactarse con otras personas, recomendar el juego con amigos, y sus amigos a sus amigos, subirlo a internet, comentarlo en grupos relacionados con esa índole. Si te pones el impedimento de no hacer un juego porque no te gusta los inputs de pc, android, o tal vez porque alguno de estos no están en la capacidad de correrlos, solo piensa por unos minutos: hace más de 30 años, hubieron personas que apenas y tenían kb de memoria ram o almacenamiento, y lograron hacer cosas que hoy en día, para muchos le es imposible hacer. Si le ves lo malo a todo, no vas a llegar a ninguna parte. En realidad no conoces toda la historia del Mario64, esa fue una estrategia de venta, y créeme, si hubiera sido desarrollado para pc aún así sería muy conocida, porque detrás del juego hubieron personas que vieron un camino para su desarrollo y no se detuvieron solo porque no existía la consola donde ejecutarla. Ahí mismo tienes el ejemplo, "ellos desarrollaron la consola". Deja de darte más problemas y desarrolla lo que te gusta, si no tienes el dinero suficiente para pagar licencias, busca ayuda, presenta tu idea a algún público y has que te patrocinen, siempre hay quienes apoyan un buen título. El que ya exista un juego no quiere decir que nadie jugara el tuyo, si existe un shooter, tu has un shooter pero agrégale habilidades al personaje, si quieres hacer un rpg pero ya existe uno, desarrolla un rpg pero agregale diversos mapas, diferentes tipos de héroes, quizá un fantasma, o un leñador que por 2 segundos se hace invisible, otro que se teletransporta un poco hacia adelante con una habilidad, agrega mascotas que den bonificaciones, etc, es un mundo lleno de posibilidades.
  25. 1 like
    Yo empezaría con el soporte de teclado/ratón ya que lo tienes que tener sí o sí. No puedes obligar al jugador a que tenga un mando en PC. Y veamos también que nivel de calidad puede llegar a tener el juego, que con ello ya te va a dar muchos más quebraderos de cabeza.
  26. 1 like
    Claro, de hecho hay muchas maneras de hacerlo, pero tu limitante en cuanto a la programación no lo permite. ¿Forma simple?.. Creas un componente que sirva como "trigger" para la "permanencia" del jugador, más un controlador de "triggers" para disparar el audio. [RequireComponent(typeof(AudioSource))] public class TriggerController : MonoBahviour { public static TriggerController Instance { get; private set; } private AudioSource m_source { get; set; } [SerializeField] private AudioClip[] m_audioClips = null; private void Awake() { Instance = this; m_source = GetComponent<AudioSource>(); } public void OnTrigger(int audioIndex) { if (!m_source.isPlaying) m_source.PlayOneShot(m_audioClips[audioIndex]); } } Luego creas el componente que debería ir en cada Box Trigger public class Trigger : MonoBahaviour { private void OnTriggerStay(Collider col) { if (col.tag.Equal("Player") && Mathf.Abs(col.GetComponent<CharacterController>().velocity.magnitude) > .5f) TriggerController.OnTrigger(0); } } Intenta entender esto y seguramente tu juego quedara mejor.
  27. 1 like
    Yo no pienso a los juegos por sus inputs (tal o tal mando, móvil, desktop, etc), sino por sus acciones/género (ambos muy ligados). Por ej, en un platformer 2D moverte a la derecha será apretar la flecha derecha, la D o cualquier otra tecla en PC, en android será tomar el desplazamiento de un joystick, en la switch será .. .etc etc. Es decir, tu juego requiere que el personaje se mueva a derecha, esta es la base, las inputs se deberán adaptar a esto. Una vez tengas la base del gameplay, podés darle algún "sabor" a las inputs. El ejemplo más claro es usar el joystick para desplazar lentamente al jugador. En PC no es posible ya que o apretás o no. Con un mando o desde el móvil podés regular esta acción. Dicho todo esto, ambas acciones se realizan de igual manera, el PC lo leerá de 0% o 100% y el mando de 0% a 100%, osea que no vas a hacer un juego completo en android, y otro para desktop. Habrá variaciones, sí, pero tratá de generalizar los conceptos de fondo, la "base" que mencioné antes. Esto me gusta pensarlo como un shader, los shaders a su vez tienen sub shaders, si el gpu no te tira el de mayor nivel, pasará a otro de menor nivel, y así, hasta que al final habrá un Fallback X, que significa que si nada anduvo use este X. Con las acciones hacé lo mismo, definí la base y de ahí anda maximizando la experiencia para cada dispositivo, como dijo @iRobb, siempre y cuando un dispositivo no le saque un ventaja notable a otro. Ej: En PC tenés que apuntar y disparar usando el ratón. En android tocás a quien matar en la pantalla y listo, apunta y lo mata automaticamente. Por lo general cada estilo de juegos tiene su plataforma de preferencia, los platformers van con los típicos mandos ya que necesitas acciones fáciles y conocidas. Para un RTS de alta competición probablemente un móvil o un mando no sean lo indicado. Teclado, aunque me gustaría usar un mando. Ya que está: Alguien quiere regalarme un mando? (bueno tenía que intentar) Juegos XXX Hot de plataformas (metroidvanias en general, otro género me aburre), point and click (muy fan de estos), algún que otro en primera persona, pero enfocados en la ambientación (estilo The vanishing of ethan carter, Dear esther, soma, amnesia, etc). Igual hace años que no juego a nada.
  28. 1 like
    No sé que tipo de videojuego estás creando aunque creo que en vez de intentar generalizar los controles en móvil y PC es un error. Creo que es mejor utilizar las diferencias que tienen para dar una mejor experiencia. O sea, PC con mando, que seguro se puede saber de qué tipo es, y en móvil utilizar el compass/giróscopo y algún botón virtual por ejemplo.
  29. 1 like
    Te voy a dar por orden las cosas de deberías hacer. 1 - Adaptarse a utilizar los niveles de accesos como corresponde, si no especificas que x función es privada, pública, interna, protected, esto tiene razones de seguridad, pero tambien simplifica las cosas a la hora de leer código. private void Update(){ } private void Start(){ } 2 - Adaptarse a una nomenclatura "coding convention" esto hace que sea mucho más fácil programar y leer el código, las que te recomiendo serian las siguientes. Todas las variables publicas, internas y protegidas deben empezar con mayúsculas. Todas las variables privadas deben empezar con "m_" Todos los parámetros de una función deben empezar con minúsculas. Todas las variables dentro de una función deben empezar con minúsculas (como sus parámetros). 3 - Siempre que sea posible se debería omitir el uso de GetComponent, esto quiere decir que podes guardar referencias del componente en un campo para luego ser utilizado, esta tarea siempre que sea posible se debe realizar desde la función Awake(), es muy importante esto. public class PlayerController : MonoBehaviour { public static PlayerController Instance { get; private set; } private ShootingManager m_shootingManager { get; set; } private AmmoManager m_ammoManager { get; set; } private HealthManager m_healthManager { get; set; } private void Awake() { Instance = this; m_shootingManager = GetComponent<ShootingManager>(); m_ammoManager = GetComponent<AmmoManager>(); m_healthManager = GetComponent<HealthManager>(); } } 4 - Intenta crear propiedades que agrupen cierto comportamiento lógico para evitar estar repitiendo código constantemente. private bool m_availableShot { get { return m_ammoManager.haveAmmo && m_healthManager.canShoot && PlayerController.Instance.canMove; } } 5 - Evita usar static string, es mejor declararlos dentro de una constante private const string _BUTTON_FIRE_1 = "Fire1"; Te dejo un código de ejemplo basado en lo que compartiste para que puedas evaluar y ver cómo mejorar el tuyo, no esta mal, pero está lejos de ser algo funcional. Ánimo! public class PlayerController : MonoBehaviour { public static PlayerController Instance { get; private set; } private ShootingManager m_shootingManager { get; set; } private AmmoManager m_ammoManager { get; set; } private HealthManager m_healthManager { get; set; } private void Awake() { Instance = this; m_shootingManager = GetComponent<ShootingManager>(); m_ammoManager = GetComponent<AmmoManager>(); m_healthManager = GetComponent<HealthManager>(); } } public class ShootingManager : MonoBehaviour { private const string _BUTTON_FIRE_1 = "Fire1"; public static ShootingManager Instance { get; private set; } private AmmoManager m_ammoManager { get; set; } private HealthManager m_healthManager { get; set; } [SerializeField] private BulletManager m_bulletPrefab = null; private bool m_availableShot { get { return m_ammoManager.haveAmmo && m_healthManager.canShoot && PlayerController.Instance.canMove; } } private void Awake() { Instance = this; m_ammoManager = GetComponent<AmmoManager>(); m_healthManager = GetComponent<HealthManager>(); } private void Update() { if (Input.GetButton(_BUTTON_FIRE_1) && m_availableShot) OnShoot(); } private void OnShoot() { BulletManager bullet = Instantiate(m_bulletPrefab, transform.position, transform.rotation); bullet.Initialize(); } } public class BulletManager : MonoBehaviour { [SerializeField] private float m_speed = 10; [SerializeField] private float m_lifeTime = 3; private Rigidbody2D m_rigidbody { get; set; } private void Awake() { m_rigidbody = GetComponent<Rigidbody2D>(); } internal void Initialize() { player = PlayerController.Instance; //Logica del bullet. } }
  30. 1 like
    Jaja sí, surgió como un "fork" de la versión en 2D, ya que quería una versión "todo terreno 4x4" (a.k.a 2D/3D), y ante un problema con la falta de depenetración en 2D (que en 3D funciona a la perfección) dije "y si lo hago dinámico ???" y ahí está. (de los rigidbodies dinámicos aprendí muchísimo, sobre todo de contactos y demás) Ahora estoy tratando de pasar el asset 2D (Kinematic 2D) al mundo del 3D pero manteniendolo kinemático y 2D (no se si me explico). Y así dar soporte a los dos, pensándolos como uno solo (a grandes rasgos). Para nada, todo pura fachada. off kors
  31. 1 like
    Diría que tendrías que reescalar el background negro a la resolución del dispositivo y no reescalar el panel del 1080p. El background negro sería el último gameobject de la jerarquía para que se sobreponga sobre todo el resto.
  32. 1 like
  33. 1 like
    Bueno, la mía también la utilizo profesionalmente En el mío para otros objetos de tipo multimedia como vídeos por ejemplo, se alojan en AWS en estructuras de carpetas multiidioma que son descargados dependiendo del mismo. También existe el idioma neutral, que sería un objeto no dependiente de multiidioma.
  34. 1 like
    Enhorabuena!! Ya va cogiendo forma, me parece un proyecto muy interesante.
  35. 1 like
    Un campo es una variable que se declara directamente en una clase o estructura. Una clase o estructura puede tener campos de instancia o campos estáticos o ambos. En general, debe usar campos solo para variables que tengan accesibilidad privada o protegida . Los datos que su clase expone al código del cliente se deben proporcionar a través de métodos, propiedades e indexadores. Al utilizar estas construcciones para el acceso indirecto a los campos internos, puede protegerse contra valores de entrada no válidos. Ejemplo public class MiClase { public float MiCampo = 0; } Una propiedad es un miembro que proporciona un mecanismo flexible para leer, escribir o calcular el valor de un campo privado. Las propiedades se pueden usar como si fueran miembros de datos públicos, pero en realidad son métodos especiales llamados accesores . Esto permite acceder fácilmente a los datos y aún así ayuda a promover la seguridad y flexibilidad de los métodos . Las propiedades permiten que una clase exponga una forma pública de obtener y establecer valores, al tiempo que oculta el código de implementación o verificación. Se utiliza un descriptor de acceso de propiedad get para devolver el valor de la propiedad, y un descriptor de acceso set se utiliza para asignar un nuevo valor. Ejemplo public class MiClase { private float m_miPropiedadValue = 0; public float MiPropiedadBidireccional { get; set;} public float MiPropiedadUnidireccionalGET { get { return m_miPropiedadValue; } } public float MiPropiedadUnidireccionalSET { set { m_miPropiedadValue = value; } } //VALUE es el valor que se le esta asignando a una variable. } Entonces podemos decir que un campo es la forma de representar libremente una variable. Mientras que una propiedad es un forma de enmascarar un campo o valor, las propiedades tambien se pueden utilizar para realizar cálculos u otra combinación de información. Ejemplo public class PlayerStatistics { public int Defense; public int Attack; public int Velocity; public int Range { get { return (Defense + Attack + Veloctiy) / 3; } } //Desde la versión 4.7 de C# se pueden utilzar las arrow propertys //La desventaja es que solo son para propiedades de solo lectura. public int Range => (Defense + Attack + Veloctiy) / 3; } Aparte de esta explicaciones básica existe diferencias en el MSIL pero esto ya es más técnico.
  36. 1 like
    El uso de Mathf.Clamp es correcto, pero si vas a asignar la variable desde múltiples lugares te recomiendo utilizar propiedades. private float m_value = 0; public float Value { get {return m_value;} set { m_value = Mathf.Clamp(m_value, 0, 1);} } De este modo cada vez que asignes Value se va a aplicar la limitación.
  37. 1 like
    Gracias nomoregames y siento lo de tu ruptura, espero que se pueda arreglar. He puesto unas capturas de pantalla en el primer post, ahora si me ha dejado ponerlas, saludos.
  38. 1 like
    Bienvenido al mundo de los IK y los RIG... Es bastante complicado de encontrar el flujo de trabajo correcto, pero con el tiempo te vas acostumbrando a la forma de trabajar con RIG.
  39. 1 like
    Muy bien! Yo también he estado con el ARCore y el ARFoundations. Publiqué uno por aquí. Te pongo tu vídeo embebido:
  40. 1 like
    No, una cosa es un error, un fallo, algo que está puesto así que no debe ser así. Unity tiene muchos mensajes, callbacks o como los quieras llamar. Justamente, es porque queremos un engine para crear juegos que ellos ponen a disposición todos estos callbacks. Desde ya que en Unity Technologies no tienen una bola mágica para adivinar qué es lo que los millones de usuarios van a hacer, en plan de "ciclo de update para todos y todas". Quizás OnAnimatorIK resulte útil para actualizar el transform de los IK. Si tuvieras que procesar algo cada vez que un contacto ocurra será OnCollisionEnter, para otra tarea como reconocer inputs vendrá bárbaro Update, para aplicar fuerzas a un rb será FixedUpdate, y así. Como te dice Franco, dependiendo del "game loop" te resultará Start, Update, FixedUpdate, etc. Ellos simplemente destripan todo el loop y te lo dan en forma de callbacks o mensajes. Acá tenés una lista completa (bajá hasta "Messages"): ---> MonoBehaviour Todo esto está más que detallado en la documentación: Execution Order FixedUpdate FixedUpdate should be used instead of Update when dealing with Rigidbody. For example when adding a force to a rigidbody, you have to apply the force every fixed frame inside FixedUpdate instead of every frame inside Update. Bueno, creo que Franco ya lo explicó arriba. Es por el tema de la simulación física. Este concepto no es algo fácil de agarrar si recién empezas con motores en general, y eso que estamos hablando de Unity que es relativamente amigable. Para obtener resultados coherentes los motores físicos usan un "Tick" fijo, usando un fixed delta time. Con lo que mencioné arriba de autoSync, desde 2017 (creo) hacia adelante empezó el proceso de abandonar la sincronización automática entre Transform y cuerpo físico. Esto significa que si vas a tocar (en cualquier forma) a un rigidbody o collider asociado debés usar FixedUpdate , ya que estos forman parte de las físicas de motor (si es que querés hacer las cosas bien, claro que podrías reactivar autosync y fué, pero esto no es una buena práctica). Es decir, el único momento en el que el cambio tiene notoriedad es luego de que haya pasado el "update físico" (Internal physics update). Vos debés modificar los valores justo antes de este update físico. Y donde está dicho Update? bueno para tener 100% conociemiento de esto te pasé lo siguiente ---> Execution Order Fijate que OnAnimatorMove es válido, pero solo se da cuando el animator se mueve (??, ir a la doc), OnStateMachineenter/Exit es válido, y pero si no tuvieras una state machine de Animator? como vez todos estos podrían llegar a funcionar pero dependen de componentes de animación y de eventos en concreto (enter/exit,OnMove, etc). Entonces, ¿Cual de estos bloques te asegura que se ejecute una y otra vez sin depender de ningun componente? --> Fixed Update -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Estos temas no son super fáciles de agarrar a la primera. Te recomendaría crearte un proyecto separado (o escena separada) y empezar a jugar con esto. Imprimiendo en consola mensajes, dibujando rays, lo que sea que te ayude más a entender toda esta estructura (ya que es lo básico). Pero ojo, esto no significa que cualquiera que haga juegos por ahí se sepa esto al 100%, me atrevería a decir que probablemente el 40% de los que usan y crean juegos en Unity (hasta juegos comerciales) ni siquieran se saben que FixedUpdate está sobre el mismo hilo que Update. En el foro oficial ves a usuarios "pro" que dicen que Update y FixedUpdate corren de manera separada en sus mundos, como si fueran dos hilos completamente distintos (a pesar de que el diagrama de arriba está bastante bastante claro de que esto no es así). Por eso, tomate tu tiempo, esto no se aprende en 1 día.
  41. 1 like
    Te voy a contestar nuevamente intentando no herir tus sentimientos. 2 cosas importantes antes de empezar, la definición de comando está muy alejada de lo que realmente quieres expresar, en dicho caso deberias utilizar algo referente al código, por ejemplo, línea de código, API, etc. Segundo, lo que estás llamando proceso se define como Función, son cosas demasiado diferentes para confundirlas. Ahora dejando claro lo anterior vamos al tema del ¿por qué se utiliza más de una función de actualización?, el por que es simple, Unity como todos los motores gráficos que existen tienen un variable que se conoce como GameTime esta variable Unity la llama deltaTime, no es más que el tiempo que pasó desde el último frame al actual, esto nos sirve para crear una lógica consistente. EJ. si intentas trasladar un objeto sin deltaTime este dependerá de cuantos FPS tengas en el momento, sin embargo si multiplicas esto por deltaTime entonces compensaras el movimiento entre diferentes FPS, esto es una simple regla de 3 simples. ¿Por que FixedUpdate? La separación de Update y FixedUpdate se debe a una decisión de diseño y una solución a Physics Pass, mientras la función Update se llama en cada frame, la función FixedUpdate se puede llamar 1, 0, o varias veces todo depende del Physics Pass y la configuración del proyecto. Las físicas no solo hacen que tu Rigidbody se mueva, si no, tiene que calcular los Hitbox, contacts, triggers, joins y todos lo componentes físicos que existan en la escena. ¿Por qué no usar siempre FixedUpdate? Por la misma razón que no colocas la lógica del Juego dentro de la función Start o Awake, por que no se trata de la función que deriva del Game Loop. Si estás interesado en saber más te recomiendo LEER lo siguiente donde explica muy bien el ciclo de vida de un juego. https://ir.lib.uwo.ca/cgi/viewcontent.cgi?referer=&httpsredir=1&article=1138&context=electricalpub Suerte!
  42. 1 like
    Que notición @pioj, desde ya al igual que como te dicen arriba, agradecerte por todo. Yo me inicié en Unity Spain allá por el 2011 creo (solo estuve un año), y no era nada pero absolutamente nada lo que es hoy en día. Incluso el foro oficial de unity es un chiste frente a este. Así que muchas gracias por todo , lo tenés más que merecido y no cabe duda que todos aquí opinan lo mismo. Me asustó lo de " dejar el mundo del Desarrollo de Videojuegos, tal vez hasta la Informática. ", pero bueno, tendrás tus justas razones. A meterle pa' delante. @francoe1 no hay drama, contá con mi ayuda en lo que pueda. Eso sí, tené en cuenta que no es lo mismo ser activo que administrar una comunidad como esta, no lo digo por vos, lo digo por mí .
  43. 1 like
    @Pathus22 en el video de la clase 2 vi que tenés el ícono del Epic Games Launcher ... traidor! Jaja, muy buenos vids, bien desarrollados y rapiditos. En la clase 1 dijiste "bajen siempre la última version que seguramente va a estar bien para estas clases" (o similar), conociendo a Unity de 2017 a 2020 ya no tenés certeza de nada, si hiciste algo en la 2020.1 seguramente en la 2020.2 se rompe todo . Me interesa muchísimo la parte de multiplayer, así que voy a esperar. ¿Podrías subir el temario completo (más o menos)? O es spoiler? Saludos
  44. 1 like
    Es una pasada. cuando acabe con lo que tengo entre manos lo probare seguro.
  45. 1 like
    Buenos días, está claro que yo no se de esto ni la mitad que usted y no pretendo dármelas de listo, tan solo soy un aprendiz autodidacta de la programación con el sueño de poder realizar un juego aunque sea parecido a los triple A (porque todos los juegos que he hecho han sido proyectos sin acabar que dejan mucho que desear). Pero a veces nos complicamos mas de la cuenta para hacer cosas sencillas y desde lo poco que conozco, se que por ejemplo cuando usamos time.Deltatime tras ese comando que Unity nos facilita hay una variable que va sumando al igual que si la creamos nosotros y que si usamos time.Deltatime 40 veces, cada vez es un contador nuevo que ha creado Unity, por tanto una variable invisible que nos consume recursos. Muchas veces hacemos las cosas mas complicadas de lo que son por querer hacerlas perfectas. Mi lema es: si funciona, hazlo. Un saludo.
  46. 1 like
    nose si mira siempre a un sitio o es en determinados momentos o como lo usas... pero puedes hacer algo asi.... para que rote suave tienes que tener una variable private Quaternion oldRot; en el script. y pones algo asi: transform.LookAt(sitio) transform.Rotate(0,-90,-90) cabeza.rotation = Quaternion.Lerp(oldRot, cabeza.rotation, 0.1f); oldRot = cabeza.rotation; no se si eso ira bien porque no se como va tu script... si pones el codigo podre ayudarte mejor igual hay que alterar el orden... o hacerlo diferente... pero poderse se puede, todo se puede hacer en programacion
  47. 1 like
    En mi caso recientemente me di cuenta de que durante gran parte de mi vida (un 99.99998%) estuve usando blender mal (y exportando mal también). Resulta que estaba usando el "frente" a la vista que se logra apretando el numpad "3" (para los que lo usen van a entender), osea el plano YZ. En realidad el frente se considera a la vista lograda con "1" (no "3"), es decir, el plano XY (X a derecha, Y hacia adelante Z hacia arriba ---> Right handed). Que pasaba? que siempre debía de rotar 90 grados el modelo. Blender usa coordenadas "Right Handed" vs las "Left handed" de Unity, de acá la necesidad de transformar los ejes. En las opciones de exportación podés retransformar los ejes, yo estaba asumiendo que el problema era el otro (el sistema de coordenadas) cuando en realidad era que yo mismo estaba rotando el modelo en blender. Con respecto a las animaciones estropeadas, si tenés en cuenta bien los ejes podés retransformar todo a Unity sin perder todo (Seguramente podés lograrlo desde el mismo Blender modificando los transform o algo por el estilo). En fin, no se si está relacionado a tu problema pero lo menciono ya que después de tanto tiempo se me dió por mirar los tres pequeños ejes que aparecían en el visor .
  48. 1 like
    actualizacion del sistema. lo nombre "modelator", que piensan al respecto? dejo un video, en el cual se crear un pequeño escenario para la prueba! espero que les guste!
  49. 1 like
    Os dejo mi ultimo juego por aquí a ver si le dais una oportunidad y lo probais, y me decis si os ha gustado. Es un juego 2d de plataformas creado con unity3d estilo retro y muy dificil. Descarga: https://drive.google.com/file/d/1W-M7m3-0p2eVcJzxiHaWeJamtzy-_lGq/view?usp=sharing
  50. 1 like
    Buenas gente, He subido la nueva versión BETA V3, en principio va a ser la definitiva. He realizado las siguientes modificaciones y mejoras: -Rediseño UI -Mejora en la escena del baño principal. La he potenciado un poco con efectos visuales. -Mejora de la escena final. -He añadido algún "susto" más. -Cambio de algunos sonidos, como en el sótano que he cambiado el sonido de las pisadas en el agua, antes sonaban a lata y muy cutres. -He añadido un "huevo de pascua". ¿a ver si lo descubrís? -He cambiado algunas texturas. -remodelado algunos objetos como el reloj de cuco del altillo. -Optimizado un poco más. -Añadida la funcionalidad de agarrar algunos objetos gracias al script que dejo amablemente lightbug ;). Os dejo algunas imágenes con algunos cambios: Aquí os dejo parte de lo que pasa si descubris el huevo de pascua.... Aquí algunos cambios de texturas en la escena final, no he puesto más por no hacer spoiler... El nuevo diseño de la UI, más sencillo para mi gusto queda mejor Imagen de la cocina con la luz en modo linear, la verdad que ha ganado bastante He añadido efectos en la escena del baño para potenciarla Probadolo a ver que os parece, he dejado el enlace arriba en la primera pagina del post. saludos¡¡
×
×
  • Create New...