Jump to content
UnitySpain

Centauro5legs

Registrados
  • Content Count

    66
  • Joined

  • Last visited

Community Reputation

1 Neutral

About Centauro5legs

  • Rank
    Usuario
  • Birthday 07/05/1995

Profile Information

  • Especialidad
    Diseñador

Recent Profile Visitors

758 profile views
  1. Bien, esto es complicado de explicar, así que me tomare mi tiempo: Como ya saben, y si no saben yo les explico, en Unity 3D hay dos modos de hacer Scripts de Movimiento, el primero es moviemto a tu personaje con un Script, y usar animaciones en la que el personaje se encuentra caminando sobre su mismo sitio, sin desplazarse realmente, y el segundo es usar animaciones en las que el personaje se despasa de su punto de origen, y dejar que sean las animaciones las que muevan al personajes, y vía script solo controlamos en AnimatorControler. Mi proyecto es de este segundo tipo. En general el proyecto funciona correctamente, el problema yace en que mi personaje principal esta formado por varias partes; estas serian "Cuerpo, Casco, Peto, Calzas, Botas, Guantes, Cinturón, Armas y Extras". Todas con el mismo esqueleto, y todas compartiendo las mismas animaciones. Esto lo hago de este modo, porque el personaje tiene la capacidad de cambiar su equipamiento. El problema es que, si a todas estas partes les pongo un CharacterController, al mover al personaje, los CharacterControllers se empujan entre si, y todo se me desacomoda, y si solo le pongo un CharacterControler a uno de ellos, cuando este colisiona con algo, todos los demás siguen su camino y el personaje se me desacomoda. Además de que por la estructura del juego, me resulta mas fácil que todas las piezas se encuentren dentro de un mismo GameObject, que sea el que lo mueva todo, pero de ser así, los "hijos" se moverán gracias a sus animaciones, mientras que el padre se quedara en su sitio, sin poder detectar colisiones. La solución a este problema, fue colocar todas las piezas dentro de un GameObject, y a ese GameObject añadirle el CharacterController y con el siguiente código corregir la posición; private void CorrecionDeTransformaciones() { transform.position = transform.GetChild(0).transform.position; transform.rotation = transform.GetChild(0).transform.rotation; transform.localScale = transform.GetChild(0).transform.localScale; for (int i = 0; i < transform.childCount; i++) { transform.GetChild(i).localPosition = Vector3.zero; transform.GetChild(i).localRotation = Quaternion.identity; transform.GetChild(i).localScale = Vector3.one; } } Como ven, la solución fue sencillamente igualar la posición, rotación y escala del Padre al de el primero de los hijos, y después devolver la posición, rotación y escala de todos los hijos, a "ceros". Y hasta cierto punto funciona bien. El problema es que cuando el personaje se topa con una pared, empieza a vibrar muy bruscamente. Me imagino que lo que pasa, es que el CharacterControler devuelve al personaje a su posición anterior, y luego mi script lo hace avanzar. La función anteriormente mostrada la ejecuto en un "LateUpdate()", pero me imagino que para que este código funcione correctamente, sin "convulsiones", es necesario que se ejecute justo después de las colisiones del "CharacterControler". ¿Alguien sabe como corregir este problema?, ¿En que evento llamar mi función? o ¿Cómo adaptar mi código? De antemano, gracias por leer.....
  2. Actualice a la versión mas reciente (2019.3.a04), yo estaba en la (2019.3.a03), y el proyecto se bugeo, y ya no abrió. Entonces cree un proyecto nuevo, he importe todos los Assets del viejo proyecto, y se salvo. Al parecer el problema si era el .Net, porque en la configuración del 2019.3.a03 tenia el .Net 4.0, y ahora en el 2019.3.a04 tengo el .Net 2.0. Pero ahora tengo otro problema, cuando abro un Script de Unity en Visual Studio 2017, sale el siguiente mensaje; "Se encontró una excepción que puede ser causada por una extensión". Y el Visual Studio no me reconoce las funciones, métodos ni tipos de datos nativos de Unity, aunque Unity si reconoce y reproduce correctamente los scripts. Es decir, Visual Studio no me hace los autocomplete, por lo demás, esta funcionando correctamente. Alguien sabe que pasa, y como corregirlo?
  3. Ayuda!!!.... estaba trabajando en un proyecto, pero debido aun fallo en mi computadora, me mude a otra distinta, y aprovechando, actualice el Unity a la versión mas reciente (la 2019). Y ahora TODOS mis scripts fallan, todos arrojan el mensaje "No MonoBehavior script in this file", incluso si creo un Script nuevo, sin ningún tipo de modificación, arroja el mismo error. Además, si abro el Visual Studio (2017, para ser mas exactos) para editar los scripts, aparece el mensaje; "Se detecto una excepción que puede estar causada por una extensión", y no me detecta las Clases de Unity. Alguien sabe que pasa y como puedo solucionarlo. Y antes de que lo digan, El nombre de archivo de mis scripts es el mismo que el de su clase, y a su vez tienen su referencia a la clase "MonoBehavior".
  4. Ok, tengo un problema. Tengo el siguiente Script: using UnityEngine; using System.Collections; public static class DataParticle { public static GameObject ItemCurativo; //[01] public static GameObject PociónRoja; //[02] public static GameObject PociónAzul; //[03] public static GameObject PociónVerde; //[04] public static GameObject PociónAmarilla; //[05] public static GameObject PociónMorada; //[06] public static GameObject PociónNaranja; //[07] public static GameObject PociónCeleste; //[08] public static GameObject PociónBlanca; //[09] public static GameObject PociónNegra; //[10] public static GameObject Comida; //[11] public static GameObject Bebida; //[12] public static GameObject GetItemCurativo (){ return ItemCurativo; } public void SetItemCurativo(GameObject Entrada){ ItemCurativo = Entrada; } } Hasta aquí todo bien, no provoca error, y puede llamarlo desde otros Scripts sin tener que inicializarlo ni anclarlo a un objeto en la escena, que es lo que deseo. El problema es que no me deja cargar mis prefabs en las variables GameObject en el inspector. En teoría, seleccionando el Script en Unity, te permitiría inicializar las variables. Pero no me deja, muestra un mensaje que dice; "No Monobehaviour scripts in the file". Saben como solucionar el error?.
  5. Ok, no se donde mas publicar esto, así que lo publicare aqui. Hace tiempo, ya casi 2 años, subí un asset a la asset store. En ese momento no tenia una cuenta de PayPal, pero segun tenia entendido, una vez hecha la cuenta de Asset Store Publisher, y vinculada con PayPal, Unity te paga tus ventas a finales de cada mes. La cosa es que pasaron unos dos o tres meses, y mi asset no se vendia, asi que me desilusione, y ya no me moleste en hacer esa cuenta de PayPal. Pero recientemente me voy enterando de que ese Asset se ha estado vendiendo en estos últimos años, y con las tonterias ya son casi 100 Dolares los que se han juntado. (100 Dolares en 2 año no es mucho, pero los quiero). Ya hice la cuenta de PayPal, y ya la vincule con mi cuenta de Asset Store Publisher, mi pregunta es, ¿A finales de este mes me pagaran ese dinero que se ha estado acumulando,? o ya mejor lo doy por vencido.
  6. Ya lo corregir, la solución queda de este modo; //Rotacion transform.Rotate(0, Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime, 0); //Obtiene los valores de entrada motion = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); if (controller.isGrounded) { //Calcula el Movimiento motion = transform.TransformDirection(motion); motion *= speed; //Corre if (Input.GetKey(KeyCode.AltGr)) { if (DataUsuario.GetEstadoAnimación().Contains("Rápido")) motion *= 2.0f; segundos = 0; } //Salta if (Input.GetButton("Jump")) { motion.y = jumpForce; } } //Gravedad motion.y -= gravity * Time.deltaTime * 2; //Se mueve controller.Move(motion * Time.deltaTime); Si no notan la diferencia, al final quite el ultimo "else". El problema era que como la "Gravedad" no se activaba por completo al aterrizar, no acababa de "aterrizar" correctamente.
  7. Primero que nada, para quien no lo sepa, el CharacterControler cuenta con una función llamada "isGrounded", la cual devuelve un "True" si el CharacterControler toca el piso, y "False" sino. Pues simplemente no me funciona, para no hacer el cuento largo, si CharacterControler esta tocando el piso, "IsGrounded" devuelve trues y false aleatoriamente, en cambio, si no esta tocando el piso, si devuelve únicamente "false". Mi Script de Movimiento es el siguiente; //Rotacion transform.Rotate(0, Input.GetAxis("Mouse X") * rotateSpeed * Time.deltaTime, 0); //Obtiene los valores de entrada motion = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")); if (controller.isGrounded) { //Calcula el Movimiento motion = transform.TransformDirection(motion); motion *= speed; //Corre if (Input.GetKey(KeyCode.AltGr)) { if (DataUsuario.GetEstadoAnimación().Contains("Rápido")) motion *= 2.0f; segundos = 0; } //Salta if (Input.GetButton("Jump")) { motion.y = jumpForce; } }else{ //Gravedad motion.y -= gravity * Time.deltaTime * 2; } //Se mueve controller.Move(motion * Time.deltaTime); Y funciona bien, pero necesito que el "IsGrounded" funcione bien, para que mi Script de Animacion funcione correctamente. Alguien sabe que puede provocar el fallo?
  8. Ok, esto es complicado. Digamos que tengo 3 archivos FBX. Los tres tienen el mismo modelo, con el mismo esqueleto y el mismo riggin, pero diferentes animaciones. Digamos que son "En Espera", "Caminar" y "Saltar". Ahora bien, quiero mezclar las tres animaciones en un solo FBX para no gastar demasiado espacio de memoria. Abrí los archivos en diferentes ventanas de Maya, para copiar y pegar los keyframes, pero me salta un error que dice que no hay nada copiado. Si arrastro un FBX a maya, mientras ya tenga otro FBX abierto, se sobrescriben, cuando lo que yo quiero es que cada animación comience después de la anterior. Hay alguna función en Maya y/o Unity para fusionar varios FBX en uno solo. O hay que configurar maya para que pueda copiar información de una ventana de maya a otra.
  9. Ya lo corregir, solo había que cambiar el el "_SrcBlend" de "One" a "SrcAlpha", desactivar el "_ALPHAPREMULTIPLY_ON" y activar el "_ALPHABLEND_ON". Quedo del siguiente modo for (int i = 0; i < transform.childCount; i++) { Material[] m = transform.GetChild(i).GetComponent<Renderer>().materials; for (int j=0; j < m.Length; j++) { m[j].shader = Shader.Find("Standard"); m[j].SetFloat("_Mode", 2f); m[j].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha); m[j].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); m[j].SetInt("_ZWrite", 0); m[j].DisableKeyword("_ALPHATEST_ON"); m[j].EnableKeyword("_ALPHABLEND_ON"); m[j].DisableKeyword("_ALPHAPREMULTIPLY_ON"); m[j].SetFloat("_Glossiness", 0f); m[j].renderQueue = 5000; } }
  10. Ok, esto es complicado, hice un script que debería, primero convertir los materiales de un objeto en "Standard/Transparent", y después reducir su alpha, para hacer que se desvanezca. El problema, es que si bien si se cambia a "Transparent" y se desvanece, pero no se llega a volver totalmente trasparente, sino que se queda grisaseo, ademas aunque cambio le doy un "Glossiness" (Brillo) 0, sigue reflejando la luz. Y si yo pauso el juego, y modifico manualmente el material (Aunque no modifique el alpha), inmediatamente se corrige. ¿Alguien sabe porque pasa esto, y como corregirlo?? private float[] a; private Color32[] c; void Start(){ c = new Color32[transform.childCount]; a = new float[transform.childCount]; for (int i = 0; i < transform.childCount; i++) { Material[] m = transform.GetChild(i).GetComponent<Renderer>().materials; for (int j=0; j < m.Length; j++) { m[j].shader = Shader.Find("Standard"); m[j].SetFloat("_Mode", 3f); m[j].SetFloat("_Glossiness", 0f); m[j].DisableKeyword("_ALPHATEST_ON"); m[j].DisableKeyword("_ALPHABLEND_ON"); m[j].EnableKeyword("_ALPHAPREMULTIPLY_ON"); m[j].SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One); m[j].SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha); m[j].SetInt("_ZWrite", 0); m[j].renderQueue = 5000; } } } void Update(){ for (int i = 0; i < transform.childCount; i++) { Material[] m = transform.GetChild(i).GetComponent<Renderer>().materials; c[i] = new Color32(c[i].r, c[i].g, c[i].b, (byte)a[i]); a[i] -= Time.deltaTime; for(int j =0; j<m.Length; j++) m[j].SetColor("_Color", c[i]); if(a[0]<=0) Destroy(gameobject); } }
  11. Hay 2 formas; 1) Con una funcioncon "Is Playin" que viene en el componente animation La segunda es guardando el nombre de el clip en reproducción dentro de un string; Sin embargo es muy inportante entender que el primero te devuelve el NOMBRE DEL ESTADO DE ANIMACIÓN, y el segundo devuelve el NOMBRE DEL CLIP
  12. Como lo dice el Titulo, como podría mediante un script, cambiar el tipo de material de "Opaco" a "Transparente". Es decir, permitir que se transparente.
  13. Como podría saber el nombre de la animación en curso, de un Animator a través de un Scrip.
  14. Ya quedo, el problema estaba en que no había activado la opcion de Bake Animation en Maya...
  15. Ok, este es un problema que espero tenga una solución simple, pero es difícil de explicar; Tengo un Modelo el cual esta formado por 5 partes; Cuerpo, Cabello, Ojos, Parpados Superiores y Parpados Inferiores. E cuerpo esta riggieado y animado, los ojos y el cabello están emparentados al joint de la cabeza, y los parpados a su vez están emparentados a los ojos. Los ojos y el cabello no tienen animación, solo dejan que el joint de la cabeza los mueva, y esto funciona bien, pero los parpados SI tienen animación, la cual obviamente es parpadear, fruncir el seño, etc.... simplemente su animación consta en rotar sobre su eje.... mi problema es que la animación de los parpados no se exporta. Trate de corregirlo dentro de Unity, creando una animación solo para los parpados, pero no me deja, porque lo considera como si estuviera riggieado. ¿Hay alguna configuración especial que tenga que hacer, para que este tipo de animación se exporte al FBX?
×
×
  • Create New...