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 - Centauro5legs

#1
Scripting / Ayuda identificando un evento
Febrero 21, 2020, 01:46:11 AM
Es un poco complicado explicar lo que quiero hacer, pero básicamente tengo un personaje que se mueve en base a sus animaciones. Es decir, el componente Animator le mueve, al "Preservar" sus transformaciones. Pero quiero que ese "movimiento" que hace en automático el Animator, pasárselo al padre. En teoría seria tan fácil como esto:
 

Update(){
  transform.parent.transform.position = transform.position;
  transform.parent.transform.rotation = transform.rotation;
  transform.localposition = vector3.zero;
  transform.localrotation = quaternion.identity;
}

 
Hasta cierto punto funciona, el problema es que da ciertos "lagasos", y a veces se ve como el personaje se retrocede. En especial en animaciones como correr o saltar, donde el personaje se desplaza mucho o cuando coliciona con una pared. Me imagino que esto pasa, porque el personaje se mueve, y a la mitad del desplazamiento entra el update y hace la corrección, lo que hace que todo se descuadre.
 
Creo que la solución seria hacer lo anterior, justo después de que el Animator mueva al personaje, pero antes de que se realicen las coliciones. En lugar de una vez por frame, que es lo que hace el Update.
 
Solo que no se que evento seria ese, intente con el UpdateFixed, el LastUpdate y el OnPostRender, y todos tienen el mismo fallo. Alguien puede darme un consejo?
#2
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.....
#3
Cita de: francoe1 date=1559578703Puede ser por lo que comenta @lightbug, fijate el Player Settings que versión de .NET tenes configurada, despues deberias borrar los archivos .vsproyect y .vs que tengas dentro de la carpeta raíz del proyecto, de este modo Unity recreará los archivos de visual studio y desaparecerán estos problemas.
   


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?
#4
Ayuda!!!.... estaba trabajando en un proyecto, pero debido aun fallo en mi com***dora, 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".
#5
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?.
 
 
#6
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.
#7
General (Antiguo) / [Ayuda] isGrounded no funciona
Febrero 19, 2018, 06:26:26 AM
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.
#8
General (Antiguo) / [Ayuda] isGrounded no funciona
Febrero 19, 2018, 03:41:36 AM
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?
#9
General (Antiguo) / Ayuda con Maya
Enero 10, 2018, 07:58:48 PM
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.
 
 
#10
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;
   }
}

 
 
#11
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 = new Color32(c.r, c.g, c.b, (byte)a);
   a -= Time.deltaTime;
         
        for(int j =0; j<m.Length; j++)
           m[j].SetColor("_Color", c);
   if(a[0]<=0)
          Destroy(gameobject);
}
}
#12
Hay 2 formas;
 
1) Con una funcioncon "Is Playin" que viene en  el componente animation
 



   
       
   
   
      animacion = GetComponent<Animation>();
   
   
      if(animacion.IsPlaying("Caminar"){
   
   
      print("Esta caminando");
   
   
      }
   
   
       
   

[/quote]
 
La segunda es guardando el nombre de el clip en reproducción dentro de  un string;
 



   
       
   
   
      public string GetAnimationStatus()
          {
              animacion = GetComponent<Animator>();
              AnimatorClipInfo[] informacion;
              informacion = animacion.GetCurrentAnimatorClipInfo(0);
   
   
      
              if (informacion.Length > 0)
                  return informacion[0].clip.name;
              else
                  return "Ninguno";
          }
   
   
       
   

[/quote]
 
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 
#13
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.
#14
General (Antiguo) / Pregunta rápida [Animación]
Agosto 29, 2017, 05:02:40 AM
Como podría saber el nombre de la animación en curso, de un Animator a través de un Scrip.
#15
Cita de: juguefre date=1502227027Todas las animaciones que tu hagas se deben poder exportar, algo debes estar haciendo mal, tal vez olvidaste hacer el bake de las animaciones? tal ves usas IK's y/o control handles y la animación esta en el control handle... no creo que sea algo complicado, algo has olvidado. En que programas estas trabajando?
   


Ya quedo, el problema estaba en que no había activado la opcion de Bake Animation en Maya...