Noticias

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

Colisionar solo con animacion

Iniciado por brok, Noviembre 19, 2015, 11:50:04 PM

Tema anterior - Siguiente tema
Noviembre 19, 2015, 11:50:04 PM Ultima modificación: Noviembre 20, 2015, 12:14:35 AM por brok
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;    } }

Noviembre 20, 2015, 04:18:33 AM #1 Ultima modificación: Noviembre 20, 2015, 04:18:54 AM por lordgunz04
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.

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.

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,  

Ya lo he echo pero me colisiona y me quita vida cuando hace la animacion y yo quiero que colisione y le quite vida.

Con esto solo consigo quitarle vida a mi mismo y el enemigo asi mismo esto es un caos.


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);
    }    } 

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;    }
}

Solucionado, gracias o todos.
Solucionado, gracias o todos.

Etiquetas: