Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: brok en Noviembre 19, 2015, 11:50:04 PM

Título: Colisionar solo con animacion
Publicado por: brok en Noviembre 19, 2015, 11:50:04 PM
Hola a todos, mi problema es el siguiente:-El personaje y enemigo cuando colisionan se quitan vidas.- Yo quiero que solo colisione cuando se active la animacion de patada o puñetazo.-Me dicen que se puede hacer mediante event.-¿Como se hace?using UnityEngine;
using System.Collections;public class  ColisionPlayer: MonoBehaviour
{    public delegate void Nocolision(GameObject g, Collider c);
    public static event Nocolision nocolision;
    Transform playerT;
    public float sinkSpeed = 0.5f;
    AudioSource PatadaSonido;
    Player player;
    Ray GolpeRay;
    RaycastHit GolpeHit;
        void Start()
    {
        playerT = GameObject.FindGameObjectWithTag("Player").transform;
        PatadaSonido = GetComponentInParent<AudioSource>();
        player = GetComponentInParent<Player>();
         
    }    
    void OnTriggerEnter(Collider colision)
    {        if (nocolision != null) nocolision(gameObject, colision);        GolpeRay.origin = transform.position;
        GolpeRay.direction = transform.forward;                if (Physics.Raycast(GolpeRay, out GolpeHit) && colision.gameObject.CompareTag("Enemigo") )            {
                vidaAI vidaplayerai = GolpeHit.collider.GetComponent<vidaAI>();
                
                if (vidaplayerai != null)
                vidaplayerai.QuitarVidaAI(20, GolpeHit.point);
                Player.damaged = true;
                PatadaSonido.Play();
                playerT.Translate(-Vector3.forward * sinkSpeed);
                StartCoroutine(SliderEnemigoTrue());        }
            
        
        
        
   }    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;    } }
Título: Colisionar solo con animacion
Publicado por: lordgunz04 en Noviembre 20, 2015, 04:18:33 AM
Asi lo aria yo. Usaría el Animation Event y cuando llegue a una parte de la animación por ejemplo cuando lance el golpe verifique un rayo corto si colisiona con el enemigo y si es asi le quite vida.
Título: Colisionar solo con animacion
Publicado por: brok en Noviembre 20, 2015, 03:19:46 PM
Pero lo que digo yo si es programando no con el Animator Event con el evento progamado
El problema que el enemigo es el mismo modelo que el personaje pero con la textura cambiada y me lanza un error en los eventos de animacion.
Título: Colisionar solo con animacion
Publicado por: ACarranza en Noviembre 20, 2015, 07:33:47 PM
entonces bien robustamente te diria que prendas los boxcolliders en la animacion que quieras y digamos en idle los apagues, algo asi de manera puramente robusta,  
Título: Colisionar solo con animacion
Publicado por: brok en Noviembre 20, 2015, 08:35:11 PM
Ya lo he echo pero me colisiona y me quita vida cuando hace la animacion y yo quiero que colisione y le quite vida.
Título: Colisionar solo con animacion
Publicado por: brok en Noviembre 20, 2015, 11:21:55 PM
Con esto solo consigo quitarle vida a mi mismo y el enemigo asi mismo esto es un caos.
Título: Colisionar solo con animacion
Publicado por: francoe1 en Noviembre 21, 2015, 02:27:01 PM
¿Como estas detectando la collision?
Título: Colisionar solo con animacion
Publicado por: brok en Noviembre 21, 2015, 02:51:11 PM
Con un gameobject vacio y un capsulecollider, por que con el metodo que me dijiste no me funcionaba bien,no colisinaba bien con los huesos.
Tengo el script de movimiento y el de colision con capsulecollider en trigger.
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using UnityEngine.EventSystems;
public class Player : MonoBehaviour {
    
    public Animator Anim;
    private float correr;
    public float speed = 2f;
    public float speed2 = 6f;
    public float gravity = 20.0F;
    public Slider sliderAI;
    public float jumpSpeed = 1.0F;
    public Image damageImage;
    public Slider playerSlider;
    public static bool damaged;
    public float flashSpeed = 5f;
    public int Salto = 2;
    public Color flashColour = new Color(1f, 0f, 0f, 0.1f);
    Vector3 moveDirection = Vector3.zero;
    
    void Awake()
    {
        sliderAI.gameObject.SetActive(false);
    } 
    void Start ()
    {
        
        Anim = GetComponent<Animator>();
        
    }
    
    // Update is called once per frame
    void Update () {                 if (damaged)
        {
            damageImage.color = flashColour;
        }
        else
        {
            damageImage.color = Color.Lerp(damageImage.color, Color.clear, flashSpeed * Time.deltaTime);
        }
        damaged = false;
                sliderAI.value = vidaAI.vida_AI;
        playerSlider.value = vidaPlayer.vida;
        transform.Translate(0, 0, (Input.GetAxisRaw("Vertical")) * speed * Time.deltaTime, Space.World);
        transform.Translate((Input.GetAxisRaw("Horizontal")) * speed * Time.deltaTime, 0, 0);        
     
                Anim.SetFloat("andar", Input.GetAxis("Horizontal"));        Anim.SetFloat("andar", Input.GetAxis("Vertical"));
        Anim.SetFloat("correr", correr);
 
        if (Input.GetAxis("Horizontal") == -1)
        {            Anim.SetFloat("andar", 2f);
        }        if (Input.GetAxis("Horizontal") == 1)
        {            Anim.SetFloat("andar", 2f);
        }
        if (Input.GetAxis("Vertical") == -1)
        {            Anim.SetFloat("andar", 2f);
        }        if (Input.GetButton("Jump"))
        {
            
            transform.Translate(0, 1, 3 * speed * Time.deltaTime);
            Anim.SetBool("salto", true);
            
        }        else
        {
            Anim.SetBool("salto", false);
        }        if (Input.GetButton("Fire2"))
            {
                Anim.SetBool("patada", true);             }
        else
            {
                Anim.SetBool("patada", false);
            }
        
        
        if (Input.GetButton("Fire1"))
        {
            Anim.SetBool("punetazo", true);
        }
        else
        {
            Anim.SetBool("punetazo", false);
        }
        if (Input.GetButton("Fire3"))
        {
            correr = 0.2f;
            transform.Translate(0, 0, (Input.GetAxisRaw("Vertical")) * speed2 * Time.deltaTime, Space.World);
        }
        else
        {
            correr = 0.0f;
        }
        CharacterController controller = GetComponent<CharacterController>();
        moveDirection.y -= gravity * Time.deltaTime;
        controller.Move(moveDirection * 10 * Time.deltaTime);
    }    } 
Título: Colisionar solo con animacion
Publicado por: brok en Noviembre 21, 2015, 04:15:13 PM
Si desactivo el trigger como en este script, solo quiero que se active cuando hace la animacion de patada o puñetazo pero asin se desactiva el trigger y no colisiona que estoy haciendo mal.using UnityEngine;
using System.Collections;public class  ColisionPlayer: MonoBehaviour
{
    public float sinkSpeed = 0.5f;
    CapsuleCollider colisionTrigger;
    AudioSource GolpeSonido;
    Transform playerT;
    Vector3 hitPoint;
    Player player;
    Ray GolpeRay;
    RaycastHit GolpeHit;
    
    void Start()
    {
        playerT = GameObject.FindGameObjectWithTag("Player").transform;
        GolpeSonido = GetComponentInParent<AudioSource>();
        player = GetComponentInParent<Player>();
        colisionTrigger = GetComponent<CapsuleCollider>();
        colisionTrigger.isTrigger = false;
    }
     
    
    void OnTriggerEnter(Collider colision)
    {
        GolpeRay.origin = transform.position;
        GolpeRay.direction = transform.forward;        if (Physics.Raycast(GolpeRay, out GolpeHit) && colision.gameObject.CompareTag("Enemigo"))        {
            vidaAI vidaAi = GolpeHit.collider.GetComponent<vidaAI>();
            
            if (vidaAi != null)
                colisionTrigger.isTrigger = true;
                vidaAi.QuitarVIdaAI(20, GolpeHit.point);
                GolpeSonido.Play();
                playerT.Translate(-Vector3.forward * sinkSpeed);
                Player.damaged = true;
                StartCoroutine(SliderEnemigoTrue());
                            
                    }
    }
    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;    }
}
Título: Colisionar solo con animacion
Publicado por: brok en Noviembre 21, 2015, 05:42:17 PM
Solucionado, gracias o todos.
Solucionado, gracias o todos.