Noticias

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

Ayuda con Coroutines

Iniciado por brok, Diciembre 07, 2015, 12:01:03 PM

Tema anterior - Siguiente tema
Diciembre 07, 2015, 12:01:03 PM Ultima modificación: Diciembre 07, 2015, 12:21:22 PM por brok
Mi problema es el siguiente, quiero que cuando golpee el enemigo haga la animación de golpe estoy tratando de parar las Coroutines desde otro script pero no me funciona ¿que puedo hacer? el estado del enemigo en sus animaciones corre muy ligero y hace las animaciones aleatorias y repetitivas, hasta y bien me conviene pero problemas es es parar Coroutines cuando golpeo, por favor necesito orientación, gracias.Dejo los script:
using UnityEngine;
using System.Collections;

public class PlayerAI : MonoBehaviour
{


    Animator ani;
    float distancia = 1.5f;
    float distanciaS = 0.5f;
   
    public Transform target;
    Rigidbody masa;

    void Start()
    {
        ani = GetComponent<Animator>();
        masa = GetComponent<Rigidbody>();
        masa.centerOfMass = new Vector3(0, 0, 0);
    }


    void Update()
    {

        Movimientos();

    }

    void Movimientos()
    {
       
        if (distancia > distanciaS)
        {
            transform.LookAt(target);

        }
        if (distancia >= distanciaS)
        {
           
            Vector3 targetHeading = target.position - transform.position;
            Vector3 targetDirection = targetHeading.normalized;


            transform.rotation = Quaternion.LookRotation(targetDirection);
            transform.eulerAngles = new Vector3(0, transform.eulerAngles.y, 0);


        }

        if (Vector3.Distance(transform.position, target.position) >= distanciaS)
        {
            ani.SetFloat("andar", 1.0f);


            if (Vector3.Distance(transform.position, target.position) <= distancia)
            {
                ani.SetFloat("andar", 0.0f);
            }
           
        }
        StartCoroutine(Golpes());


    }
    public IEnumerator Golpes()
    {
       
        StartCoroutine(patada1());
        yield return new WaitForSeconds(1.0f);
        StartCoroutine(patada2());
        yield return new WaitForSeconds(1.0f);
        StartCoroutine(puno1());
        yield return new WaitForSeconds(1.0f);
        StartCoroutine(puno2());
        yield return null;

    }
   
   IEnumerator patada1()
    {
       
        yield return new WaitForSeconds(2.0f);

        ani.SetInteger("estado", 1);
       
        yield return null;

    }
   IEnumerator patada2()
    {
       
        yield return new WaitForSeconds(4.0f);

        ani.SetInteger("estado", 2);
       
        yield return null;

    }

   IEnumerator puno1()
    {
       
        yield return new WaitForSeconds(6.0f);

        ani.SetInteger("estado", 3);
       
        yield return null;
    }
   IEnumerator puno2()
    {
       
        yield return new WaitForSeconds(8.0f);

        ani.SetInteger("estado", 4);
       
        yield return null;


    }
   

   

}
  
using UnityEngine;
using System.Collections;

public class ColisionPlayer : MonoBehaviour {

    AudioSource GolpeSonido;
    //public ParticleSystem particulas;
    //Player player;
    //RaycastHit GolpeHit;
    Animator Anim;
    public PlayerAI palyerAI;
    void Start()
    {

        GolpeSonido = GetComponentInParent<AudioSource>();
        //player = GetComponentInParent<Player>();
        Anim = GameObject.FindGameObjectWithTag("Enemigo").GetComponent<Animator>();
       

    }


    void OnTriggerEnter(Collider colision)
    {


        if (colision.gameObject.CompareTag("Enemigo"))

        {
            //vidaAI vidaAi = colision.GetComponent<vidaAI>();

            //if (vidaAi != null)
                //vidaAi.QuitarVIdaAI(10, GolpeHit.point);
            GolpeSonido.Play();

            //Player.damaged = true;
            //player.sliderAI.value = vidaAi.getPorcentageVida();
            //particulas.transform.position = GolpeHit.point;
            //particulas.play();
            //StartCoroutine(SliderEnemigoTrue());
            StartCoroutine(Dano());
           
        }
       

    }


    //IEnumerator SliderEnemigoTrue()
    //{

    //    yield return new WaitForSeconds(0.0f);
    //    //player.sliderAI.gameObject.SetActive(true);
    //    yield return new WaitForSeconds(3f);
    //    //player.sliderAI.gameObject.SetActive(false);

    //    yield return null;

    //}
    IEnumerator Dano()
    {
        yield return null;
        StopCoroutine(palyerAI.Golpes());
       
        Anim.SetInteger("estado", 5);
        yield return new WaitForSeconds(2.0f);
       
    }
}
   

He modificado el código y ahora hace la animación de golpeado pero de vez en cuando por hay me conformo porque el player le ocurre lo mismo, intento detener la courutine cuando la vida del player es 0 y la vida del enemigo es 0 pero no me funciona, ¿como tengo que parar una courutina?
using UnityEngine;
using System.Collections;

public class PlayerAI : MonoBehaviour
{


    Animator ani;
    float distancia = 1.0f;
    float distanciaS = 0.5f;
    public SphereCollider colisionplayerPunoDe;
    public SphereCollider colisionplayerPataDe;
    public SphereCollider colisionplayerPunoIz;
    public SphereCollider colisionplayerPataIz;
    public Transform target;
    Rigidbody masa;
    public vidaPlayer vidaplayer;
    vidaAI VidaAI;
    void Start()
    {
        VidaAI = GetComponent<vidaAI>();
        ani = GetComponent<Animator>();
        masa = GetComponent<Rigidbody>();
        masa.centerOfMass = new Vector3(0, 0, 0);
        colisionplayerPunoDe.isTrigger = false;
        colisionplayerPunoIz.isTrigger = false;
        colisionplayerPataDe.isTrigger = false;
        colisionplayerPataIz.isTrigger = false;
    }


    void Update()
    {
        if (vidaplayer.vida <= 0)
        {
            StopCoroutine(Golpes());
        }
        else
        {
            StartCoroutine(Golpes());
        }

        if (VidaAI.vida_Ai <= 0)
        {
            StopCoroutine(Golpes());
        }
        else
        {
            StartCoroutine(Golpes());
        }
        Movimientos();

    }

    void Movimientos()
    {
       
        if (distancia > distanciaS)
        {
            transform.LookAt(target);

        }
       

        if (Vector3.Distance(transform.position, target.position) >= distanciaS)
        {
            ani.SetFloat("andar", 1.0f);
           

            if (Vector3.Distance(transform.position, target.position) <= distancia)
            {
                ani.SetFloat("andar", 0.0f);
               
            }
           
        }
        if (Vector3.Distance(transform.position, target.position) >= distanciaS)
        {
           
           
        }
       
       
    }
    void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            StartCoroutine(Dano());
           
           
        }
       
       
    }
    public IEnumerator Golpes()
    {
       
        StartCoroutine(patada1());
        yield return new WaitForSeconds(1.0f);
        StartCoroutine(patada2());
        yield return new WaitForSeconds(1.0f);
        StartCoroutine(puno1());
        yield return new WaitForSeconds(1.0f);
        StartCoroutine(puno2());
        yield return null;

    }
   
   IEnumerator patada1()
    {
       
        yield return new WaitForSeconds(2.0f);

        ani.SetInteger("estado", 1);
        colisionplayerPataDe.isTrigger = true;
        colisionplayerPataIz.isTrigger = true;

        yield return null;

    }
   IEnumerator patada2()
    {
       
        yield return new WaitForSeconds(4.0f);

        ani.SetInteger("estado", 2);
        colisionplayerPataDe.isTrigger = true;
        colisionplayerPataIz.isTrigger = true;

        yield return null;

    }

   IEnumerator puno1()
    {
       
        yield return new WaitForSeconds(6.0f);

        ani.SetInteger("estado", 3);
        colisionplayerPunoDe.isTrigger = true;
        colisionplayerPunoIz.isTrigger = true;
        yield return null;
    }
   IEnumerator puno2()
    {
       
        yield return new WaitForSeconds(8.0f);

        ani.SetInteger("estado", 4);
        colisionplayerPunoDe.isTrigger = true;
        colisionplayerPunoIz.isTrigger = true;
        yield return null;


    }

    IEnumerator Dano()
    {
        ani.SetInteger("estado", 0);
        ani.SetFloat("andar", 0f);
        ani.SetBool("golpe", true);
        yield return new WaitForSeconds(2.0f);
        yield return null;

    }


}
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;

public class vidaAI : MonoBehaviour {
   
    public int vida_Ai;
    public int MaxVida = 100;
    public int scoreValue = 10;
    public Slider sliderAI;
    Animator Anim;
    public AudioClip voz;
    AudioSource source;
    PlayerAI playerAi;

    void Start ()
    {
        playerAi = GetComponent<PlayerAI>();
        source = GetComponent<AudioSource>();
        Anim = GetComponent<Animator>();
        if (vida_Ai == 0)
           vida_Ai = MaxVida;
           
    }
    void Update()
    {
        sliderAI.value = vida_Ai;
    }

    public int getPorcentageVida()
    {
        return 100 * vida_Ai / MaxVida;
    }
   
   
   public  void QuitarVIdaAI(int Value, Vector3 hitPoint)
    {
       
            vida_Ai -= Value;

        StartCoroutine(MuerteEnemigo());


    }
   public IEnumerator MuerteEnemigo()
    {
       
        if (vida_Ai <= 0)
        {
           
            Anim.SetFloat("andar", 0f);
            Anim.SetBool("golpe", false);
            Anim.SetInteger("estado", 0);
            Anim.SetTrigger("muerteEnemigo");
            source.clip = voz;
            source.Play();
           
            yield return new WaitForSeconds(8f);

            Application.LoadLevel(Application.loadedLevel);
           
           
            yield return null;
            if (vida_Ai <= 0)
            {
                vida_Ai = MaxVida;
            }
        }

       

       
    }

}
 


Y eso es lo que estoy haciendo pero no se para.
Dejo el juego copilado y las funtes por si alguien me ayuda.Juego y Fuentes

Diciembre 07, 2015, 10:36:18 PM #4 Ultima modificación: Diciembre 07, 2015, 10:37:07 PM por kaito
Quizás no sea cosa de las corrutinas, sino del componente Animator. Crea una transición para salir inmediatamente de la animación cuando el valor de una variable/parametro sea -1.

Cita de: kaito date=1449524178" data-ipsquote="" data-cite="kaito" class="ipsQuoteQuizás no sea cosa de las corrutinas, sino del componente Animator. Crea una transición para salir inmediatamente de la animación cuando el valor de una variable/parametro sea -1.
¿Como hago eso? estoy perdido.

Transiciones de Animaciones: http://docs.unity3d.com/es/current/Manual/class-Transition.htmlAunque lo mejor sería crear un parámetro tipo Trigger en lugar de int, que se llame por ejemplo 'SarlirAnimacion'. Parametros de Animaciones: http://docs.unity3d.com/es/current/Manual/AnimationParameters.html 

Cita de: kaito date=1449558858" data-ipsquote="" data-cite="kaito" class="ipsQuote">Transiciones de Animaciones: http://docs.unity3d.com/es/current/Manual/class-Transition.htmlAunque lo mejor sería crear un parámetro tipo Trigger en lugar de int, que se llame por ejemplo 'SarlirAnimacion'. Parametros de Animaciones: http://docs.unity3d.com/es/current/Manual/AnimationParameters.html]http://docs.unity3d.com/es/current/Manual/AnimationParameters.html 
Todo eso se utilizarlo pero no entiendo muy bien la idea donde colocarlo pero muchas gracias kaito.

Cita de: kaito date=1449558858" data-ipsquote="" data-cite="kaito" class="ipsQuote">Transiciones de Animaciones: http://docs.unity3d.com/es/current/Manual/class-Transition.htmlAunque lo mejor sería crear un parámetro tipo Trigger en lugar de int, que se llame por ejemplo 'SarlirAnimacion'. Parametros de Animaciones: http://docs.unity3d.com/es/current/Manual/AnimationParameters.html]http://docs.unity3d.com/es/current/Manual/AnimationParameters.html 
Ya lo intente pero sin exito.

Diciembre 08, 2015, 04:57:52 PM #9 Ultima modificación: Diciembre 08, 2015, 05:03:56 PM por brok
He conseguido que cuando las vidas de ambos este a cero funcionen como deben, las animaciones de golpe funcionan mejor, ahora me falta la animación de daño que cuando colisione con el enemigo se accione pero pongo OnCollisioonEnter y esta costantemente en acción pero no ejecuta la animación es un booleano, ¿que puedo hacer para que funcione?
using UnityEngine;
using System.Collections;

public class PlayerAI : MonoBehaviour
{

   
    private Animator ani;
    float distancia = 1.5f;
    float distanciaS = 1.0f;
    public SphereCollider colisionplayerPunoDe;
    public SphereCollider colisionplayerPataDe;
    public SphereCollider colisionplayerPunoIz;
    public SphereCollider colisionplayerPataIz;
    public Transform target;
   
    public vidaPlayer vidaplayer;
    private vidaAI VidaAI;
 
    void Start()
    {
       
        VidaAI = GetComponent<vidaAI>();
        ani = GetComponent<Animator>();
       
        colisionplayerPunoDe.isTrigger = false;
        colisionplayerPunoIz.isTrigger = false;
        colisionplayerPataDe.isTrigger = false;
        colisionplayerPataIz.isTrigger = false;
    }


    void Update()
    {
       
        StartCoroutine(Corrutinas());
       

       

    }
   
    IEnumerator Corrutinas()
    {
        if (vidaplayer.vida <= 0)
        {
           
            StopCoroutine(Golpes());
           
            ani.SetFloat("andar", 0f);
            ani.SetBool("golpe", false);
            ani.SetInteger("estado", 0);
            yield return new WaitForSeconds(8.0f);
        }
        else
        {
            StartCoroutine(Golpes());
           
        }
        if (VidaAI.vida_Ai <= 0)

        {
            yield return null;
            StopCoroutine(Movimientos());
           
            StopCoroutine(Golpes());
           
            ani.SetFloat("andar", 0f);
            ani.SetBool("golpe", false);
            ani.SetInteger("estado", 0);
            ani.SetTrigger("muerteEnemigo");
            yield return new WaitForSeconds(8.0f);
        }
        else
        {
            StartCoroutine(Golpes());
            StartCoroutine(Movimientos());
           
        }
       
    }
    IEnumerator Movimientos()
    {
       
        if (distancia > distanciaS)
        {
            transform.LookAt(target);

        }
       

        if (Vector3.Distance(transform.position, target.position) >= distanciaS)
        {
            ani.SetFloat("andar", 1.0f);
           

            if (Vector3.Distance(transform.position, target.position) <= distancia)
            {
                ani.SetFloat("andar", 0.0f);
               
            }
           
        }

        yield return null;
    }
   
           
       
       
       
       
   
    public IEnumerator Golpes()
    {
        yield return null;
        patada1();
        yield return new WaitForSeconds(2.0f);
        patada2();
        yield return new WaitForSeconds(4.0f);
        puno1();
        yield return new WaitForSeconds(6.0f);
        puno2();
        yield return new WaitForSeconds(8.0f);

    }
   
   void patada1()
    {


        if (Vector3.Distance(transform.position, target.position) >= distancia)
        {
            ani.SetInteger("estado", 1);
           
            colisionplayerPataIz.isTrigger = true;
            if (Vector3.Distance(transform.position, target.position) <= distancia)
            {
                ani.SetFloat("andar", 0.0f);
                ani.SetInteger("estado", 0);
                colisionplayerPataIz.isTrigger = false;
            }
        }
       
           

       

    }
   void patada2()
    {

        if (Vector3.Distance(transform.position, target.position) >= distancia)
        {
            ani.SetInteger("estado", 2);
           
            colisionplayerPataDe.isTrigger = true;
            if (Vector3.Distance(transform.position, target.position) <= distancia)
            {
                ani.SetFloat("andar", 0.0f);
                ani.SetInteger("estado", 0);
                colisionplayerPataDe.isTrigger = false;
            }
        }
       
           
       

       

    }

   void puno1()
    {


        if (Vector3.Distance(transform.position, target.position) >= distancia)
        {
            ani.SetInteger("estado", 3);
           
            colisionplayerPunoDe.isTrigger = true;
            colisionplayerPunoIz.isTrigger = true;
            if (Vector3.Distance(transform.position, target.position) <= distancia)
            {
                ani.SetFloat("andar", 0.0f);
                ani.SetInteger("estado", 0);
                colisionplayerPunoDe.isTrigger = false;
                colisionplayerPunoIz.isTrigger = false;
            }
        }
       
       
    }
   void puno2()
    {

        if (Vector3.Distance(transform.position, target.position) >= distancia)
        {
            ani.SetInteger("estado", 4);
           
            colisionplayerPunoDe.isTrigger = true;
            if (Vector3.Distance(transform.position, target.position) <= distancia)
            {
                ani.SetFloat("andar", 0.0f);
                ani.SetInteger("estado", 0);
                colisionplayerPunoDe.isTrigger = false;
            }
        }
       
       


    }

    void Dano()
    {
        StopCoroutine(Movimientos());
        StopCoroutine(Golpes());
        ani.SetBool("golpe", true);
    }
    void OnCollisionEnter(Collision colision)
    {
        if (colision.gameObject.CompareTag("Player"))
        {
            Dano();
            ani.SetTrigger("desactivar");
        }
        else
        {
            ani.SetBool("golpe", false);
        }
    }
}
   
 
Tengo el animator asin

Ya lo he solucionado se lo he puento en el OnTriguerEnter de la colisiones opustas y funciona.

Etiquetas: