Noticias

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

¿Como hago que las colisiones sean mas eficiente?

Iniciado por brok, Noviembre 23, 2015, 01:28:51 AM

Tema anterior - Siguiente tema
Pue eso. ¿Como hago que las colisiones sean mas eficiente? este es mi script
using UnityEngine;
using System.Collections;

public class  ColisionPlayer: MonoBehaviour
{
    public float sinkSpeed = 0.5f;
    public LayerMask LayerCol;
    AudioSource GolpeSonido;
    public ParticleSystem particulas;
    Player player;
    Ray GolpeRay;
    RaycastHit GolpeHit;
   
    void Start()
    {


       
        GolpeSonido = GetComponentInParent<AudioSource>();
        player = GetComponentInParent<Player>();
       
    }
     
   
    void OnTriggerEnter(Collider colision)
    {
        GolpeRay.origin = transform.position;
        GolpeRay.direction = transform.forward;

        if (Physics.Raycast(GolpeRay, out GolpeHit, LayerCol) && colision.gameObject.CompareTag("Enemigo"))

        {
            vidaAI vidaAi = GolpeHit.collider.GetComponent<vidaAI>();
           
            if (vidaAi != null)
               
                vidaAi.QuitarVIdaAI(20, GolpeHit.point);
                GolpeSonido.Play();
                Player.damaged = true;
                particulas.transform.position = GolpeHit.point;
                particulas.Play();
                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;

    }


}
Este otro es el del player.
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;
    public SphereCollider colisionplayerPuno;
    public SphereCollider colisionplayerPata;
    public GameObject colisionAI;
    void Awake()
    {
        sliderAI.gameObject.SetActive(false);
    }




    void Start ()
    {
        colisionAI.GetComponentInChildren<ColisionPlayerAI>();
        if (colisionAI != null) { }
        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("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);
        Golpes();
    }

   public void Golpes()
    {
        if (Input.GetButton("Fire2"))
        {
            Anim.SetBool("patada", true);
            colisionplayerPata.isTrigger = true;
        }
        else
        {
            Anim.SetBool("patada", false);
            colisionplayerPata.isTrigger = false;
        }


        if (Input.GetButton("Fire1"))
        {
            Anim.SetBool("punetazo", true);
            colisionplayerPuno.isTrigger = true;
        }
        else
        {
            Anim.SetBool("punetazo", false);
            colisionplayerPuno.isTrigger = false;
        }
    }

}
Y este el de la vida.
using UnityEngine;
using System.Collections;

public class vidaPlayer : MonoBehaviour
{
   
    public static int vida;
    public int MaxHealt = 100;
    public int MinHealt = 0;
   
    void Start()
    {
       
        if (vida == 0)vida = MaxHealt;
       
        ApplyCure(0);
    }
   
    public void ApplyCure(int Value)
    {
        vida += Value;
        vida = Mathf.Clamp(vida, MinHealt, MaxHealt);
    }

   public void QuitarVidaPlayer(int Value, Vector3 hitPoint)
    {
       
        vida -= Value;
        vida = Mathf.Clamp(vida, MinHealt, MaxHealt);
       
    }
       
     
}
Que la vida algunas veces no se recarga bien y no es independiente de cundo ataco o otro enemigo en el slider.

Yo probaria a aumentar el collider de las piernas y brazos asi detectara la collision un poco antes de que este llege y dara una mejor apariencia Pero solo el collider no la apariencia (Mesh).Un saludo

Visita http://www.programacionwh.com encontraras tutoriales y muchas cosas .


Tambien puedes visitar mi canal de YouTube https://www.youtube.com/channel/UClSCTn0wPN1iFjED0yaoJUA



Noviembre 23, 2015, 02:22:49 PM #2 Ultima modificación: Noviembre 23, 2015, 02:28:48 PM por brok
Si esta a 0.5 el radio es una esfera de colision grande para el modelo deberia colisionar bien.

Pero está como de lado, por qué no la centras?

Noviembre 23, 2015, 06:03:11 PM #4 Ultima modificación: Noviembre 23, 2015, 06:32:18 PM por brok
esta el centro y no es eso es
Physics.Raycast
Lo pongo asin el codigo y colisiona perfectamente sinenvargo no funciona el Destroy del objeto del Script vidaAI.
using UnityEngine;
using System.Collections;

public class  ColisionPlayer: MonoBehaviour
{
    public float sinkSpeed = 0.5f;
    public LayerMask LayerCol;
    AudioSource GolpeSonido;
    public ParticleSystem particulas;
    Player player;
    RaycastHit GolpeHit;
    public GameObject objeto;
    vidaAI vidaAi;
   
    void Start()
    {

       
        vidaAi = objeto.GetComponent<vidaAI>();
        GolpeSonido = GetComponentInParent<AudioSource>();
        player = GetComponentInParent<Player>();
       
    }
     
   
    void OnTriggerEnter(Collider colision)
    {
       
        if (colision.gameObject.CompareTag("Enemigo"))

        {
           
           
            if (vidaAi != null)
               
                vidaAi.QuitarVIdaAI(20, GolpeHit.point);
                GolpeSonido.Play();
                Player.damaged = true;
                particulas.transform.position = GolpeHit.point;
                particulas.Play();
                StartCoroutine(SliderEnemigoTrue());
           

        }


    }
 

Ahora lo he puesto asin y funciona bien las colisiones hasta que llego al segundo enemigo y me lanza el tipico errorMissingReferenceException: The object of type 'vidaAI' has been destro*** but you are still trying to access it.
Your script should either check if it is null or you should not destroy the object.si ya lo he puesto en no nulo porque me sale el error
using UnityEngine;
using System.Collections;

public class ColisionPlayer : MonoBehaviour
{
    public float sinkSpeed = 0.5f;
    public LayerMask LayerCol;
    AudioSource GolpeSonido;
    public ParticleSystem particulas;
    Player player;
    Ray GolpeRay;
    RaycastHit GolpeHit;


    void Start()
    {



        GolpeSonido = GetComponentInParent<AudioSource>();
        player = GetComponentInParent<Player>();

    }


    void OnTriggerEnter(Collider colision)
    {
       

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

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

            if (vidaAi != null)

                vidaAi.QuitarVIdaAI(20, GolpeHit.point);
                GolpeSonido.Play();
                Player.damaged = true;
                particulas.transform.position = GolpeHit.point;
                particulas.Play();
                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;

    }


}
 [/quote]
y me salta a esta linea del script vidaAI
Death += () => { Destroy(gameObject); };
 

esa función anónima no está devolviendo nada, tiene que hacer return con un valor para sumarlo.

Te estas equivocando muchísimo, esta todo mal diseñado, y jamás funcionara, ni mucho menos de forma Optima.Rediseña todo el proyecto, en ves de pegar 3 script diferentes con mucha incoherencia, haz un diseño, lo subes al foro y yo te ayudare un poco, pero de esta manera, nadie puede brindar ayuda, esta todo muy desordenado, malas implementación, errores.UN Saludo!

Bueno yo no soy programador y estoy aprendiendo
Que bajonazo francoe1 tio solo lo hago para entretenerme y aprender, estoy enfermo tengo trastorno bilpolar y de la personalidad multiple, no tengo estudios y soy pensionista demasiado digo yo que hago.


La leche! Pues podías haber puesto otra foto en el profile.



Etiquetas: