Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

No detecta los colliders Durante una animacion

Iniciado por Miguel Torrealba, Septiembre 16, 2015, 05:20:18 AM

Tema anterior - Siguiente tema
Estoy haciendo una animacion En donde un un objeto ataca a otro (Animacion) , entonces el objeto que es atacado se supone que cuando colisiona con el objeto que lo ataca Se produce otra animacion.Pero he hay donde surge el problema, cuando Hice el script de colision con el otro personaje Hice la prueba de colision y fue todo bien, Entonces cuando agregue al script las cosas del animator para que hiciera las transiciones pasa algo raro en el juego , se supone que en el juego hay un carro que se mueve pero cuando le agrego el componente animator se detiene osea no se translada , y entonces en el inspector cuando quito el componente animator si se mueve, y entonces revise para ver que habia hecho mal y vi que todo estaba bien en el codigo.En resumen el problema es que cuando pongo el componente animator a funcionar se reproducen las animaciones pero el carro no se mueve se queda parado,Alguien que por favor me ayude con este problema por favor. P.D El carro tiene el componente Rigidbody con gravedad 0 , y el objeto que lo ataca tiene un box colider y lo marque como is trigger y al caro tambienEspero Que puedan ayudarme gracias.........  

Septiembre 17, 2015, 11:15:29 PM #1 Ultima modificación: Enero 01, 1970, 01:00:00 AM por Antonio
Es posible que tengas el componente Animator con la opción Root motion activada. Esta opción lo que hace es anular el desplazamiento general del transform, en su lugar, lo mueve tomando el desplazamiento que haya en la animación. Si tus animaciones, son animaciones en el lugar de origen (que corren, ruedan, derrapan y tal, pero no se mueven del punto inicial), entonces tendría que quitar la opción Root motion del Animator para poder aplicar el movimiento por código (como ya lo tienes hecho).

Me parece que esa puede ser la razón de tu problema.

Si ya solucione el problema, pero ahora tengo otro que quisiera que me ayudaras , es la primera vez que trabajo con corutinas y no se como es, pero quisieras que me explicaras como hago para que se reproduzca una corutina en cierto tiempo y despues se repita una y otra vez ??, porque lo estado intentando por dias pero el problema es que se pone como en loop despues de la primera ejecucion (La estoy llamando en update) y no se a que se debe esto. Aqui te dejo el codigo.using UnityEngine;
using System.Collections;
public class PerroScript : MonoBehaviour {    public float tiempoMax;
    public float tiempoMin;
    public Animator anim;    
    void Start ()
    {
        anim = GetComponent<Animator> ();
    }
    void Update ()
    {
        StartCoroutine (PerroAtaca());
    }
    
    IEnumerator PerroAtaca()
    {
    if (anim.GetBool ("EstaQuieto") == true) {                        yield return new WaitForSeconds (Random.Range(tiempoMin,tiempoMax)); //Perro sale en tiempo aletorio
                        anim.SetBool ("EstaQuieto", false);    // ataca
                        yield return new WaitForSeconds (5); // Esperar a que la animacion salte
                        anim.SetBool ("EstaQuieto", true); //posicion normal
                    }
    }
} En la primera ejecucion va bien y si espera el tiempo , pero a la segunda hace un looping muy feo y rapido. P.D En el animator tengo el check del boleano EstaQuieto en true Espero que me ayudes gracias..

No deberías esperar un tiempo al final de la animación de EstaQuieto true? antes de que vuelva a empezar el loop al volverse a llamar?

Si ya lo he hecho y va bien , pero cuando se ejecuta el codigo por segunda vez hace un looping osea que lo ejecuta rapidisimo una y otra vez , entonces quiero saber si existe alguna funcion o alguna forma de parar la corutina y volverla a iniciar para que asi valla bien.

Septiembre 18, 2015, 11:01:23 PM #5 Ultima modificación: Enero 01, 1970, 01:00:00 AM por Antonio
Si lo pones en Update, estará ejecutando esa llamada en todos los frames, de modo que, efectivamente, la 1º parece que funciona bien porque esperará un tiempo (por ejemplo, ¿2 segundos?) y después se ejecuta, pero es que en el siguiente frame, vuelves a llamar la función, que ordena que se active sus acciones al pasar otros 2 segundos, por lo que se activará tras 2 segundos y un frame, y así con el siguiente y el siguiente frame.... Ciertamente dará ese fallo de repetición.

Deberías intentas aplicar o un contandor en el update, para que la coorutina no se esté ejecutando de forma continua, o usar funciones como InvokeRepeating (http://docs.unity3d.com/ScriptReference/MonoBehaviour.InvokeRepeating.html
 Contador
void TiempoMeta = 0;

void Update ()
{
    if (Time.time >= TiempoMeta)
    {
        StartCoroutine (PerroAtaca());
        TiempoMeta = Time.time + tiempoMax;
    }
}
Invoke

void Start ()
{
    anim = GetComponent <Animator>();
    InvokeRepeating("OrdenarAtaque", 0, tiempoMax);
}

void Update ()
{
       
}

void OrdenarAtaque ()
{
    StartCoroutine (PerroAtaca());
}
 

Dios gracias por los datos ya lo solucione . Con la funcion que me dijiste  Gracias.

Etiquetas: