Jump to content
UnitySpain

lightbug

Registrados
  • Content Count

    2,246
  • Joined

  • Last visited

  • Days Won

    179

lightbug last won the day on September 1

lightbug had the most liked content!

Community Reputation

720 Excellent

About lightbug

  • Rank
    Leyenda

Profile Information

  • Especialidad
    Coder

Recent Profile Visitors

2,327 profile views
  1. Uh muy bueno @francoe1, tiene tremenda pinta. Pregunta: ¿Por qué soporta >= 2019.2? PD: Justo justo justo fuí al link de Connect y encontré un errorcito (o quizás es una imagen vieja) en la sección "Info" (de Player and Settings) --> Direaction ... te aviso por si se te pasó.
  2. Jajaj totalmente, acá el uso práctico hace la diferencia. Según Wikipedia: "In mathematics, the quaternions are a number system that extends the complex numbers." ---> a +b i + c j + d k Un número complejo se puede expresar en 2 dimensiones, una para la parte real (que NO acompaña a la "i") y otra para la parte imaginaria (que acompaña a la "i"). Entonces acá se puede decir que un Quaterion se puede expresar con 4 dimensiones. Revisando el código de Unity, un Quaterion es efectivamente un vector de 4x1,: public Quaternion(float x, float y, float z, float w) { this.x = x; this.y = y; this.z = z; this.w = w; } En el mundo matricial la multiplicación de una matriz de (M filas xN columnas ) x (I filas x j columnas): ( M x N ) x (I x J ) .... Es válida o realizable si N = I, es decir --->( M x N ) x ( I x J ) ... y el resultado tiene dimensión MxJ (Extremos) ---> ( M x N ) x (I x J ) Acá dejo un poco de código de Quaternions (sacado del código de Unity). Lo interesante es que estos valores se puede arreglar de tal o tal forma y resultar en vectores, quaternions o directamente matrices de 4x4 (ejemplo: parte las matrices que usan los shader, MVP en OpenGL, WVP en D3D , necesitan agregar una componente a la posición, de Vec3 a Vec4). Basicamente lo que hace Unity es afectar a los factores de tal forma de generar el resultado querido. Acá el operador *(Q,V) ... la regla que mencioné arriba: public static Vector3 operator *(Quaternion rotation, Vector3 point) { float num1 = rotation.x * 2f; float num2 = rotation.y * 2f; float num3 = rotation.z * 2f; float num4 = rotation.x * num1; float num5 = rotation.y * num2; float num6 = rotation.z * num3; float num7 = rotation.x * num2; float num8 = rotation.x * num3; float num9 = rotation.y * num3; float num10 = rotation.w * num1; float num11 = rotation.w * num2; float num12 = rotation.w * num3; Vector3 vector3; vector3.x = (float) ((1.0 - ((double) num5 + (double) num6)) * (double) point.x + ((double) num7 - (double) num12) * (double) point.y + ((double) num8 + (double) num11) * (double) point.z); vector3.y = (float) (((double) num7 + (double) num12) * (double) point.x + (1.0 - ((double) num4 + (double) num6)) * (double) point.y + ((double) num9 - (double) num10) * (double) point.z); vector3.z = (float) (((double) num8 - (double) num11) * (double) point.x + ((double) num9 + (double) num10) * (double) point.y + (1.0 - ((double) num4 + (double) num5)) * (double) point.z); return vector3; } Acá el operador* (Q,Q), Multiplicación de Quaternions (otras reglas): public static Quaternion operator *(Quaternion lhs, Quaternion rhs) { return new Quaternion( (float) ((double) lhs.w * (double) rhs.x + (double) lhs.x * (double) rhs.w + (double) lhs.y * (double) rhs.z - (double) lhs.z * (double) rhs.y), (float) ((double) lhs.w * (double) rhs.y + (double) lhs.y * (double) rhs.w + (double) lhs.z * (double) rhs.x - (double) lhs.x * (double) rhs.z), (float) ((double) lhs.w * (double) rhs.z + (double) lhs.z * (double) rhs.w + (double) lhs.x * (double) rhs.y - (double) lhs.y * (double) rhs.x), (float) ((double) lhs.w * (double) rhs.w - (double) lhs.x * (double) rhs.x - (double) lhs.y * (double) rhs.y - (double) lhs.z * (double) rhs.z) ); } Da miedo ... Lo importante es leer el manual y saber que hace cada método del Quaternion. Cuando apretás el botón del ascensor que hace que el ascensor funcione (para un usuario promedio), lo que importa es saber a qué piso querés ir.
  3. Si solo te importa la presentación de las medallas, diría opción O-P-B. En el caso de un podio olímpico o de carreras, el oro está más alto, en este caso el oro se ve primero (asumiendo que es más llamativo lo primero que se presenta). En muchos juegos el texto del ganador (oro) tiene los colores dorados y muchas veces alguna que otra animación llamativa y divertida, esto podría sumar más que el orden de presentación. La otra opción es presentarlos en vertical (con Oro arriba).
  4. Reglas de oro sin duda alguna, agrego una de Vectores con Quaternions muy útil: - Para rotar un vector usando un Quaternion se multiplica (en este orden): vectorRotado = quaternion * vector
  5. Sí, gracias por mencionarlo. En el tutorial utiliza 2018.3.5, creo que es debido a que el paquete se encontraba en etapa de experimentación UnityEngine.Experimental.Input. Actualmente en 2019.1 el paquete se puede usar con UnityEngine.InputSystem. El tema de las versiones y los paquetes en preview suele confundir bastante.
  6. Jaja yo hacía lo mismo, acá hice un post acerca del hack: http://www.unityspain.com/index.php?/topic/38762-unity-dark-para-versión-̶p̶o̶b̶r̶e̶-free/&tab=comments#comment-145051 Claro, no lo digo por pesado de tener el dark, sino que cuando hacés herramientas muchas veces uno omite la estética y pone un color que quede bien para el skin actual. Después te suelen mandar que no se ve nada en el Dark . Por eso uso directamente los estilos propios de Unity (gracias a la famosa tool gratis que te deja ver los Built-in styles) y que los colores los "decida el editor" cuando se necesario (aunque no es una solución perfecta). Uh muy interesante, gracias por el link. Tengo que ponerme con UIElement, hace tiempo que lo vengo dejando de lado.
  7. Recién he probado la beta y esto un 80% convencido (aclaro, no he metido ninguna de mis tools para verificar compatibilidad), el flat le queda muy bien y a nivel íconos hicieron un gran trabajo. Como soy pobre tengo el skin light de la dark no puedo opinar, me jode las pelotas que todavía los de Unity crean que la gente compra Pro para tener el skin (y sí, va a terminar siendo por esto si siguen así), eso demuestra la madurez de los directivos de fondo. Con respecto a la UI todavía hay cositas que no me agradan, pero eso es por el mismo estilo flat, por ejemplo muchas veces omito algo porque todo se ve tan igual y plano. A nivel de Editor han metido muy buenas opciones, lo de la view camera me parace genial (aunque no se si esto ya estaba), también lo de las tools de escena, el hover sobre los elementos también ayuda. Espero que el nuevo sistema de Inputs se integre, aunque creo que lo van a dejar para 2020. En la beta que probé hay errores muy básicos, por ejemplo das a "New Folder", la crea, pero no deja el foco sobre el nombre (cosa de escribir el nombre de la carpeta), uno tiene que ir y renombrarla cada vez. Otro error grave, cuando creas un nuevo script, antes podías escribir el nombre y la clase se renombraba, ahora se genera un "NewBehaviourScript" y arreglátelas como puedas. No miento, perdí como 45 minutos tratando de ver que estaba pasando, y claro, el error era lo que decía el cartel, pero después de estar 12 años creando clases quién iba a pensar que de golpe decidieron cagarla con el nombre. Como puede ser que versión a versión tengan los mismos errores?? esto se corrige una sola vez y listo, pero Unity se las rebusca para generar nuevos bugs una y otra vez, es increible. Seguro para el lanzamiento oficial todo esto se corrige, y seguramente la UI va a recibir iteración tras iteración de re-diseño, lo cual está bien, recuerdo el primer prototipo mostrado por los devs en el foro oficial y daba calambres, este está muchísimo mejor en comparación.
  8. Acá les dejo un excelente tutorial ( en tres partes ) a modo de introducción al nuevo Input system. Uno de los mejores que vi, los demás videos parecen copy+paste, además de que todos ponen las expresiones lambda sin ni siquiera saber que hacen (o por lo menos da esa sensación). Parte 1: introducción y Setup Basicamente de Input.GetKeyDown(KeyCode.w) a keycoard.wKey.isPressed Parte 2: Binding y Composite Acá explica como se pueden especificar bindings (conexiones entre acciones y dispositivos físicos) visibles en el inspector. Un "Composite" es lo mismo pero para con más de un binding. Parte 3: Input System Asset Se migra todo lo expuesto en la clase a un Asset propio del nuevo sistema, con la ventaja de setear varios ActionMaps (por ej uno para un menu, otro para gameplay, etc) con sus acciones y sus bindings.
  9. Ponelo así mejor (si es que acceleration.x pasa cuadro a cuadro no debería dar problema en FixedUpdate, sino habrá que meter también un update que registre todos los deltas y aplicarlos en fixedUpdate): Rigidbody2D rb2D void Awake() { rb2D = GetComponent<Rigidbody2D>(); } void FixedUpdate() { //es lo mismo que antes (en 2D), Vector2.right es <1,0> // y quité deltaTIme, la simulación pide fuerzas o velocidades, no desplazamientos rb2D.velocity += Vector2.right * Input.acceleration.x * SpeedD; } Yo recuerdo que hice un juego para Android que usaba el acelerómetro, me acuerdo que estuve algun tiempo usando un método X y diciendo "esto no anda!". Al final recuerdo que era otra funcionalidad la que debía utilizar, digo esto porque esto me suena mucho a mi situación. De todos modos acá está la doc oficial: Parte de aceleración (conceptual): As a device moves, its accelerometer hardware reports linear acceleration changes along the three primary axes in three-dimensional space. You can use this data to detect both the current orientation of the device (relative to the ground) and any immediate changes to that orientation. Acceleration along each axis is reported directly by the hardware as G-force values. A value of 1.0 represents a load of about +1g along a given axis while a value of -1.0 represents -1g. If you hold the device upright (with the home button at the bottom) in front of you, the X axis is positive along the right, the Y axis is positive directly up, and the Z axis is positive pointing toward you. Scripting: You can read the Input.acceleration property to get the accelerometer reading. You can also use the Input.deviceOrientation property to get a discrete evaluation of the device's orientation in three-dimensional space. Detecting a change in orientation can be useful if you want to create game behaviors when the user rotates the device to hold it differently. Al final yo creo entender que podés encontrar cambios en la orientación (aunque mencionan aceleración lineal también, por eso es algo confuso) y también la orientación final del dispositivo (?), probá con eso último, no lo se, podría ser que estés modificando Input.acceleration.x solamente cuando estés girando tu movil, probá con deviceOrientation. Saludos
  10. Sí totalmente, muchas veces usan un modelo muy parecido al suelo (que puede confundirse con alguna pequeña elevación) y listo. Otras veces se usan rocas (más común), por ejemplo para presentar la entrada de una cueva.
  11. Exacto, en realidad un script separado para inputs es lo ideal (separado del movimiento). Lo de las OR se lo rob... digo tome prestado a los de Unity , de la serie del training day de 2D (excelente por cierto, va desde personaje hasta audio): Create A 2D Platformer
  12. @Rootet en tu script hay cositas que están bien otras que están mal, por ej: 1) Update para inputs, FixedUpdate para físicas: if (Input.GetMouseButtonDown(1)){ if (corriendo){ } else{ rigi.velocity = new Vector2(velocidad * 1.25f, rigi.velocity.y); } } En update, estás modificando una velocidad, cosa que debés hacer en FixedUpdate, esto se lee como "Si apreto el botón derecho y corriendo es false la velocidad X es el 25% más grande" y esta actualización sucede en un solo cuadro, no cuadro a cuadro. Además si la velocidad es un 25% más grande se supone que corriendo ahora debe ser true pero no, se setea true si apretás el otro botón (en FixedUpdate). ───────────────────────────────────────────────────────────────────────────────────────────────────── 2) Quién es responsable de corriendo? if (Input.GetMouseButtonDown(0)){ if(corriendo){ if ((enSuelo || !dobleSalto)){ sonido.Play(); //Empujón hacia arriba //Opción 1. Metodo up de Vector2 rigi.AddForce(Vector2.up*fuerzaSalto); //Otra opción //Aplicamos una fuerza de 0 en X y de fuerzasalto en Y //rigi.AddForce(new Vector2(0,fuerzaSalto)); if(!dobleSalto && !enSuelo){ dobleSalto=true; } } } else{ corriendo=true; NotificationCenter.DefaultCenter().PostNotification(this, "PersonajeEmpiezaACorrer"); } } Cuando apretás el botón izq y no está corriendo se da la primer vuelta (el else), es decir que se pone corriendo = true. En el siguiente cuadro GetMouseButtonDown no se dispara (por razones obvias) entoces el "if(corriendo)" no se da. Sí se va a dar el "if(corriendo)" en el proximo click. Además, ¿quién pone corriendo en false? Y volviendo al punto 1, solo si corriendo es falso la velocidad aumenta. Una vez que diste click izquierdo corriendo nunca vuelve a false (?). Puede ser que me haya olvidado de algo, muchas veces contesto a la ligera. ───────────────────────────────────────────────────────────────────────────────────────────────────── █████████████████████████████████████████████████████████████████████████████████████████████████████ Podés resolver el problema parcheando if's y demás, pero te diría que de entrada la estructura es muy confusa para una tarea tan simple, tomalo como una oportundad de mejora y experimentá con una nueva, que tenga más lógica y sobretodo que alguien externo al código lo vea y lo entienda al instante, pensá que esto es un salto y una funcionalidad de correr, practicamente no es nada. La lógica que te recomiendo para una mezcla Update + FixedUpdate en un platformer (y con cualquier personaje) es la siguiente (seguramente hay cosas que no definí, solo una idea muy por arriba): // inputs - esto expandilo a todas las inputs que estás esperando, lo mismo con ejes // En este ejemplo está solo correr "Run" (que elegí la leftShift) bool runPressed = false; bool runReleased = false; bool running = false; bool isGrounded = false; void Update() { // Update puede pasar 100 veces más rápido que FixedUpdate (50 fps por default), así que // todos los KeyDown se acumulan, no se setean, así no perdés ninguno en el camino // por acumular me refiero a usar una simple OR runPressed |= Input.GetKeyDown( KeyCode.LeftShift ); runReleased |= Input.GetKeyUp ( KeyCode.LeftShift ); } void FixedUpdate() { //Detectar suelo, determinar direcciones de movimiento, ángulos, etc // Por supuesto acá es donde decís "suelo = true o false" isGrounded = IsGrounded(); // el vector objetivo cuadro a cuadro, no necesariamente el aplicado Vector2 targetVelocity = Vector2.Zero; // bien general un "if( suelo ) .... if( isGrounded ) { //Todo lo que pasa si y solo si el jugador está grounded // en este caso la input a evaluar es run así que if( runPressed ) { running = true; targetVelocity.x = ... } else if( runReleased ) { running = false; targetVelocity.x = ... } } else //Todo lo que pasa si y solo si el jugador NO está grounded { //en el aire no puede correr running = false; targetVelocity.y = ... } //Una vez determinado el estado se aplica el vector obtenido a la velocidad (de la forma que quieras). rb.velocity = ...(dependiendo de targetVelocity) // IMPORTANTE --> Resetear inputs, FixedUpdate ya las usó runPressed = false; runReleased = false; } Animación y movimiento poco tienen que ver, si no ves los efectos en pantalla tratá de exagerar los valores, en vez de 1.25f poné 5f. Igualmente creo que sí, desde el animator podés setear la velocidad del clip (revisá las referencias de Animator o google más rápido), aunque no recuerdo, estoy completamente seguro que para el sistema Legacy (viejo) se puede hacer, pero con el componente Animation. Saludos
  13. Yes! esto es un game changer, eso sí, si el agujero modifica el TerrainCollider.
  14. Nooo man, vos sos amduartev!! jajajaj recuerdo cuando en mis comienzos busqué en Youtube "Unity Horror Game" y salió tu video ... este: https://youtu.be/I4FqzEaAQ2E Incluso hace un año estaba por preguntar por el foro si alguien conocía dicho proyecto de terror y/o al autor. En su momento no podía creer lo bien lograda que estaba la ambientación (incluso ahora, eso demuestra como con shaders viejos, buenas texturas y una point light pueden crear mucho), encima con Unity (que en esa epoca era todo UDK), fue una inspiración sin duda. Digo esto porque vi el video y me recordó bastante a aquella escena (el video hizo de OnTriggerEnter), por más que no sea la misma tienen algo que las relaciona, audio, ambientación, shaders, no se... algo. Apa, Master? De qué pioj?
  15. La verdad es que queda bastante bien, da una idea de cuanto falta para la meta, un estilo kickstarter. Una pregunta: ¿Es posible meter las noticias o el Feed en uno de los paneles laterales? Cosa de cliquear e ir directamente al link (no al topic), por ej con las últimas 5 noticias. Ah mira vos, tiene sentido, era sabido que el Admin y los mods se daban puntos ellos mismos jajaja. Sí, la verdad que están bárbaros, seguramente muchos de los importantes sean "under the hood", siempre se valoran. La galería me encanta, aunque todos los links me dan error. El foro de buenas practicas también me parece genial, aunque siento que el formato blog quedaría mejor, de todos modos la idea es muy buena. Ya que está pregunto, hace unos días me metí a un Topic X y descubro que era capaz de seleccionar la respuesta correcta, siendo que nunca respondí (además de obviamente no ser el autor del Topic). Ahora mismo no recuerdo el topic, pero probé con otros y no pasa lo mismo. ¿Este problema fue notificado? Quizás tenga relación con este punto : " Se ha corregido y vuelto a activar el plugin de Best Answer, para que los elijan qué respuesta es la mejor para resolver un problema. (pulsad la V a la izquierda del post, dónde el autor...) "
×
×
  • Create New...