Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - francoe1

#91
Proyectos / procedural building path
Febrero 01, 2020, 07:28:47 PM
@gonzalitosk8 podés subir las imágenes a cualquier hosting y compartir los links. Éxitos! 
 
 
#92
Scripting / Ejes de rotación cambiados (SOLUCIONADO)
Febrero 01, 2020, 07:26:37 PM
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. 
#93
Proyectos / procedural building path
Enero 31, 2020, 09:11:59 PM
La idea está bien, la herramienta aún tiene mucho trabajo por delante, pero el núcleo parece bien encaminado.
 
Cosas que agregaria.
 


  1.    Posibilidad de crear muros fijando su ANCHO y ALTO


  2.    Posibilidad de biselar borders.


  3.    Simple sistema de auto guías.


  4.    Manteniendo Shift que la línea esté en un ángulo recto


  5.    Trabajar con curvas bezier.


  6.    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
#94
Cita de: Jhonatan00_00 date=1580467329Buenos días Igor, el tema de la rotación ya está solucionado y también que rote suavemente, solo necesito saber como desactivar-activar la animación del Animator de una parte del cuerpo por script para que no se mezcle la animacion del Animator con la del Script.
   
   
      Estoy viendo por Internet que es algo muy común y que existen comandos para hacer lo que necesito, porque a veces uno necesita que su personaje saque un arma y siga apuntando a un enemigo mientras corre por ejemplo. En el momento en el que saca el arma, la animación de ese brazo se desactiva y lo que actúa es la animación por script, pero usan un comando para desactivar el Animator, ¿cual es?. Aún no tengo ni idea 
   
      Saludos.
   


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
#95
Scripting / incremento con while
Enero 31, 2020, 08:55:30 PM
Cita de: nomoregames date=1580464668Por favor, procurad que el tono de esta conversación no suba a más. El objetivo de este foro no es la discusión sobre lo que esta bien o mal, sino, a partir de los conocimientos de el resto poder adquirir los tuyos propios. Sin ay quien esta más o menos informado, y todo el mundo tiene derecho a equivocarse. No queremos convertir esto en un campo de guerra, sino en una oportunidad, para abrirse de mente y aprender sobre nuestros errores.
   
   
      Buenos días .
   
   


       
   




Es normal, me estresa un poco algunas cosas. Pero siempre intentaré tener respeto.
#96
Scripting / incremento con while
Enero 31, 2020, 01:06:52 AM
Cita de: Jhonatan00_00 date=1580416077Buenas tardes, yo desde lo poco que se de programación puedo decir que hagamos lo que hagamos el PC siempre va a estar constantemente haciendo comprobaciones, es mas, todas las funciones que nos proporciona un engine o un lenguaje de programación son operaciones como la que yo he dicho antes pero simplificadas, para hacerlo mas sencillo, pero comprobaciones al fin de al cabo con sus If detrás solo que no los ves. De hecho, yo he programado muchísimas cosas (primero en Div Game Studio 2, después en Blitz3D y por último en Unity) sin saber muchos comandos del lenguaje y usando instrucciones básicas porque todo empieza con 0 y 1 y todo empieza con If, Else y poco mas... Las instrucciones son esas cosas simplificadas en un comando, pero están ahí detrás igualmente y no van a consumir mas recursos a no ser que uses la misma comprobación mas veces de las que sean necesarias.
   
   
      En este último código que ha puesto Francoe1 ya hay montones de comprobaciones por cada frame lo quiera o no y tampoco entiendo por que a los programadores mas avanzados les gusta tanto crear variables para llamar a las cosas como quieren y no por su nombre, por ejemplo, en lugar de poner Input.GetKeyDown(KeyCode.F) y ya está, primero crea una variable para llamar a KeyCode.F como Key (lo que es mas trabajo tanto para el programador como para el PC y es mas complicado) y después usa esa variable para un If que no es una operación matemática ni nada complejo.
   
   
      Yo pienso que la solución mas sencilla y práctica, si funciona, es la mejor, aunque es bueno saber comandos para facilitar muchas operaciones matemáticas (sobre todo), pero para esto tan simple creo que no es necesario tanto jaleo.
   
   
      Un saludo.
   
   
       
   


No esperaba que conteste semejante brutalidad.
 
1 - Es muy raro ver lógicas basadas en bloques de IF, la programación no solo se basa en comparaciones lógicas.
 
2 - Crear variables para ser utilizada es una costumbre "buena" para ahorrar memoria. Esto es algo que con los años vas aprendiendo, es común ver string dentro de un bloque Update sin estar conscientes de que se está creando un nuevo objeto por cada iteración.
 
3 - La idea no es discutir, si no, darte información para que armes tu propio camino a una solución. 

La programación no es algo "simple" aunque lo parezca, cuando comienzas crees que se trata únicamente de operaciones lógicas simples, luego empiezas a estudiar múltiples casos y soluciones te das cuenta el ¿por qué? de dichas implementaciones.
 
"hagamos lo que hagamos el PC siempre va a estar constantemente haciendo comprobaciones"

Esta frase deja mucho que decir sobre tu conocimiento, para entender qué tipos de comprobaciones, formas y orden se deben seguir tendrás que estudiar varios años, como muchos de los que estamos acá, C# es un lenguaje compilado intermedio, esto quiere decir que todo lo que programes se pasa a MSIL para ser interpretado. MSIL tiene muchas pautas para lograr un funcionamiento óptimo, las vas aprendiendo con el tiempo, con los errores y los fracasos.

Tu frase es recíproca, la magia o el conocimiento te lleva a saber distinguir qué maneras son las óptimas para trabajar.
 
 
 
 
#97
Scripting / incremento con while
Enero 30, 2020, 08:47:54 PM
Cita de: Jhonatan00_00 date=1580389244Buenas tardes, estoy leyendo por encima todos los comentarios y como siempre termino abrumado con todo lo que saben en este foro, pero creo que lo que intentas hacer es mucho mas sencillo que todo lo que te están explicando y se soluciona sin usar while (que está para otros casos).
   
   
      Según como yo lo he entendido, tu problema es que Unity no tiene nada que detecte mientras la tecla está pulsada, tan solo cuando la pulsas una vez o cuando dejas de pulsarla y lo que pretendes hacer es que cuando está la tecla pulsada una variable sume para hacer algo que tengas en mente con esa variable y es muy facil de resolver:
   
   
      - Creas una variable booleana que te devolverá true o false y la puedes llamar por ejemplo Tecla_Pulsada.
   
   
      - Cuando oprimas la tecla que tu quieras, por medio de un If (. . .) indicas que la booleana que has creado antes sea true y con else que sea false.
   
   
      - De nuevo en otro If (. . .) indicas que cuando la booleana sea true, la variable a sumar empiece a hacerlo, si la booleana es false, no sumará nada a la variable. Por tanto mientras la tecla esté pulsada esa variable que habias creado va a sumar y en cuanto sueltes la tecla dejará de hacerlo.
   
   
      No se si he entendido bien cual era tu problema...
   
   
      Un saludo.
   


Cuando todos empezamos a programar creamos este tipo de lógicas, esto crea algo que llamamos código espagueti.

No hay una forma 100% correcta para realizarlo con el sistema actual de inputs de UNITY,  es lamentable que se requiera un IF que sea comprobado constantemente para detectar un evento de teclado.
 
Los BOOL-FLAG no siempre son buena idea, es decir, de alguna manera el FLAG se asigna con un valor, esto quiere decir que el evento que esperamos se está realizando pero desconocemos de qué manera tratarlo.
 
¿Es necesario incrementar una variable?

No, claramente este es el error de inicio al intentar solucionar el problema.
 
¿Entonces cómo lo hago?

Simple, al detectar el evento KeyDown guardamos una referencia de tiempo de ejecución, esto puede ser DataTime.Now, o Time.time de unity, luego al detectar el evento KeyUp restamos el valor del tiempo actual con el tiempo guardado, esto nos va a dar un valor que no dependerá del FrameRate actual.
 
CODIGO
 

public class DetectKeyTime : MonoBehaviour
{
    public Action<float> EventFinish;
    public KeyCode Key = KeyCode.F;
    private float m_lastTime { get; set;}    
   
    private void Update()
    {
        if (Input.GetKeyDown(Key))
            m_lastTime = Time.time;
        if (Input.GetKeyUp(Key))
            EventFinish?.Invoke(Time.time - m_lastTime);
    }
}

 
Esto estaría correcto, pero aún eliminar la función Update y tener un Sistema de eventos para los inputs evitando así que cada instancia del componente realice la misma comprobación. 
#98
Scripting / Deformidades_en_padre
Enero 30, 2020, 08:24:38 PM
Cita de: nomoregames date=1580405566Hola a todos, esta, es entre muchas otras, una de mis principales dudas sobre los componentes hijo y padre....
   
   
      pero para no atosigar a nadie, las iré publicando a medida que se solucionen las anteriores.
   
   
      La pregunta es simple.
   
   
      Cuando tienes padres dentro de padres, es decir padres_hijo, ocurre que al rotar alguno de estos padres hijo, este, se deforma,
   
   
      como puedo evitarlo???
   
   
       
   
   
      gracias de antemano  
   


Esto se debe a la escala del objeto padre. 
 
Siempre, si es posible deberias trabajar con escala 1.
#99
@Jhonatan00_00 pudiste solucionar tu problema?
#100
Fíjate que deje un link con el código que utilizé para llegar a ese resultado. 
#101
Te dejo el código más un video demostrativo de la implementación que te estamos comentando.
 
 
 
#102
@Jhonatan00_00 te estás complicando demasiado por algo simple.
 
1º Deberías resolver el problema de la dirección relativa, esto es simple, unity tiene un función TransformDirection que permite transformar direcciones locales a direcciones globales.

Sabiendo esto te darás cuenta que para que la dirección del AXIS sea relativa a la cámara deberias transformar su dirección.
 

Vector3 axis = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
axis.Normalize();
axis = cameraTransform.trasformDirection(axis);

 
Ya puedes utilizar axis como vector de dirección relativo a la camara.
 
2º Ahora deberias tener un look target, esto seria, posición actual del jugador más dirección
 

Vector3 lookTarget = playerTransform.position + axis;

 
Con esto puedes empezar a crear la lógica de ángulos que comentamos arriba, para comparar los ángulos deberias sacar la diferencia entre playerTransform.forward y axis.
 

Vector3 angleDiff = axis - playerTransform.forward;

 
Ahora tenes los 3 valores necesarios para la lógica.. 
 

if(Mathf.Abs(angleDiff.y) < 5)
  playerTransform.Translate(axis * speed * Time.deltaTime);
playerTransform.rotation = Quaternion.Lerp(playerTransform.rotation, Quaternion.Look(lookTarget, Vector3.up), 15 * Time.deltaTime);

 
 
#103
Scripting / Retroceso
Enero 20, 2020, 04:59:23 PM
 
 

https://www.instagram.com/p/B7g_aQ6JGcm
 
Esto es algo que subí hace unos días a instagram.
 
Para que la cámara funcione correctamente tenes tener múltiples axis disponibles, por lo que la mejor idea es ir anidando la camara.
 
1 Nivel - Rotación X

2 Nivel - Rotación Y

3 Nivel - Rotación Z

4 Nivel - Retroceso

5 Nivel - Respiración

6 Nivel - Movimientos de Pasos.
 
De esta manera lo resolvi fácil y el movimiento queda fluido, existe otra técnica que es un poco más compleja, pero al final termina realizando los mismo cálculos. 
 
Recuerda siempre rotar y mover los niveles en su espacio local.
#104
Scripting / incremento con while
Enero 15, 2020, 10:48:19 PM
Para esta práctica necesitas 2 "eventos", MouseUp y MouseDown.
 

private void Update()
{
if (Input.GetMouseButton(0)) // Si fuera DOWN se ejecutaria 1 vez. De esta menera detecta si el mouse esta siendo presionado.
{
}
if (Input.GetMouseButtonUp(0))
{
}
}

 
Teniendo esto ahora necesitarás un factor, número del 0 al 1 que será utilizado para multiplicar el valor máximo que desees.

Para esto la forma más simple y de alguna manera "segura" es utilizando Time.deltaTime para incrementar una variable.
 
Dentro de el bloque IF del mouse "DOWN".
 

time_amount += Time.deltaTime;

 
Dentro de el bloque IF del mouse UP
 

OnFinishEvent(time_amount);
time_amount = 0;

 
La función OnFinishEvent es donde ejecutaras la mecanica necesario, multiplicando time_amount normalizado * el maximo valor permitido.
#105
El "efecto" que estas buscando es el mismo que el de Super Mario 64, lamento comentarte que existen múltiples problemas matemáticos a solventar, primero vamos a diferenciar los dos tipos.. 
 


  1.    La dirección del jugador en el eje FORWARD es relativa a la camara.


  2.    La dirección del jugador en el efe FORWARD es absoluta a la camara.


En la forma (1) vas a tener que ver la diferencia angular absoluta sobre el eje Y entre la cámara y el jugador.
 

float diff = Mathf.Abs(cam.angle.y - player.angle.y);

 
Teniendo la diferencia puedes crear el comportamiento necesario para compensar la rotación con el movimiento.
 

player.angle.y = Mathf.Lerp(player.angle.y, cam.angle.y, lerp_time);
if (diff < 2)
MovePlayer();

 
Esta explicación es la que te dimos anteriormente, a diferencia que se intenta crear un valor "factor" para que la rotación no sea constante.
 
 
 
En la forma (2) vas a tener que ver la diferencia angular absoluta sobre el eje Y entre la cámara y el "Joystick Target" -
 
¿Que es "Joystick target"?

Esto es un Vector que predice la posición futura del jugador en función al valor del joystick y la posición actual.

 
 

Vector3 joystickTarget = player.position + joystick.axis;

 
¡Importante! - los AXIS del Joystick siempre se deben normalizar, para evitar una velocidad 1.5 en los movimientos diagonales.
 
 
 
Ahora deberias tomar la diferencia angular entre el FORWARD del player y el valor de joystickTarget.
 

Vector3 angle_joystick = (josytickTarget - player.position).normalized;
Vector3 angle_diff = angle_joystick - player.forward;

 
Y a partir de acá se vuelve a repetir los pasos para la forma (1).
 
Esto no soluciona el problema al 100% en Super Mario 64 la cámara se "AUTO AJUSTA" detrás del jugador mientras este se mueve, por lo cual faltaría la implementación de la compensación de la cámara.
 
¿Los saltitos de rigidbody solo son perceptibles en la ventana "GAME" o tambien se ven dentro de "INSPECTOR"?

Debería de sacarte esta duda por que podria ser un error en el comportamiento de seguimiento de la cámara, tal como para las físicas se utiliza FixedUpdate para la actualización de la posición y rotación de la cámara se recomienda utilizar LateUpdate.  
 
 
 
Los códigos no funcionan son solo ejemplos.