Noticias

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

Crear Array para almacenar valores en variables Collision.

Iniciado por MatiasMartin, Agosto 16, 2015, 08:44:23 PM

Tema anterior - Siguiente tema
Hola. Paso a contarles. Tengo mi juego de carrera y la idea es que corra un cronometro por cada vuelta, es decir: Empieza en cero, cuando pasa la meta ese cronometro se para, empieza el segundo hasta que pasa la meta, este se para y luego se suman todos los valores para tener un resultado.

Bueno, hice los cronometro en float con array, cada uno con su respectivo bool array para saber cuando estan funcionando. La cosa es que pude hacer que el primer cronometro empiece con la carrera, una vez cruzada la meta con un OnColliderEnter hago que el primer cronometro termine y con un if en el Update, si el cronometro 1 termino y el cronometro 2 esta en false, arranca el 2...

Ahí surgio el problema, si en el OnColliderEnter pongo otro if, el segundo cronometro no arranca. Entonces pense hacerlo de nuevo con Array pero no anda. Paso el codigo y espero haberme explicado bien :S :S 

La idea es hacer un array aqui:

void OnCollisionEnter(Collision[] coll = new Collision[2]){
        if (coll[0].gameObject.name == "Auto") {
            Debug.Log ("Completaste la primer vuelta");
            checkpoint[0] = true;
        }
    }     Es posible hacer esto o hay alguna otra forma? Desde ya muchas gracias. 


Creo que en los parámetros del método con un "Collision[] col" es suficiente. No entiendo ese "= new Collision[2]"

Vuelvo a preguntar. "Eso" es una idea vaga que no funciono.  El parametro que dice Adriel ya lo probe de esta manera:

void OnCollisionEnter(Collision[] coll){
        if (coll[0].gameObject.name == "Auto") {
            Debug.Log ("Completaste la primer vuelta");
            checkpoint[0] = true;
        }
    }    

Y el error que me sale es el siguiente:

Script error: OnCollisionEnter
This message parameter has to be of type: Collision

Agosto 16, 2015, 09:02:35 PM #4 Ultima modificación: Agosto 16, 2015, 09:03:03 PM por adriel0000
Esto pasa probablemente por que el parámetro del Método no puede ser Array y solo puede guardar una colisión. Entonces deberías crear otra variable Array que almacene las colisiones, y luego luego cada ver que entra una colisión pues "Variablecolisiones.Add(coll);" De todas formas tu código no tiene sentido, ¿Qué quieres hacer realmente?

Lo que intento hacer es lo siguiente. Tengo un "Auto" que avanza por una pista circular y cuando pasa sobre un plano "Meta" para un cronometro(CheckPoint) que mide cuantos segundos se tarda en dar una vuelta, para automáticamente parar ese cronometro y empezar el siguiente. El código lo metí en la "Meta" y cada vez que el auto pase por ella ocurre lo que dije. Lo que pasa es que al almacenar cada colisión en la variable "coll", una vez pase por la meta detiene todos los CheckPoint(Los pone a false) impidiendo que empiece el segundo y así sucesivamente. 
[quote author=adriel0000" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="15991" data-ipsquote-contentcommentid="101686 date=1439751755]Esto pasa probablemente por que el parámetro del Método no puede ser Array y solo puede guardar una colisión. Entonces deberías crear otra variable Array que almacene las colisiones, y luego luego cada ver que entra una colisión pues "Variablecolisiones.Add(coll);" De todas formas tu código no tiene sentido, ¿Qué quieres hacer realmente?[/quote]Podrías indicarme como se haría esto? Mas que nada en el OnColliderEnter() Ahí no se como meter la variable que declaro arriba. Desde ya muchas gracias. Si sabes otro método también te agradecería si me lo podes comentar. Saludos. 

Pues no entiendo por que lo haces así... No son necesarios los array. Podrías hacer esto: int checkPoint = 0;void OnTriggerEnter(Collider col){if(col.gameObject.tag == "meta"){checkPoint += 1;}} De esta manera cada vez que pasa por la meta, la variable checkPoint aumenta en 1 y sabes cuantas veces ha colisionado...

Mil gracias. Lo mantuve en el gameObject "Meta" por comodidad. Se que lo ideal es ponerlo en el Player, en mi caso "Auto"... pero como tengo el medidor de tiempo en "Meta" me convenia hacerlo ahí ya que estoy aprendiendo y quiero recordar después como lo hice.

Acá dejo el codigo por si a alguien le sirve: 
 using UnityEngine;
using System.Collections;public class MedirTiempo : MonoBehaviour {    public GUIText GuiTiempo1;
    public GUIText GuiTiempo2;
    public GUIText GuiTiempoTotal;    float[] tiempos = {0, 0};
    int checkpoint = 0;    // Use this for initialization
    void Start () {
        //Posicion original: transform.position = new Vector3(0.4f,0.4f, 0);
        GameObject.Find ("Tiempo").transform.position = new Vector3(0.4f,0.1f, 0);
        GameObject.Find ("CheckPoint1").transform.position = new Vector3(0.25f,0.04f, 0);
        GameObject.Find ("CheckPoint2").transform.position = new Vector3(0.55f,0.04f, 0);
        GuiTiempoTotal.enabled = false;
    }
    
    // Update is called once per frame
    void Update (){
        if (checkpoint == 0) {
            tiempos[0] += Time.deltaTime;
        }
        GuiTiempo1.text = tiempos[0].ToString ("f1");        if (checkpoint == 1){
            tiempos[1] += Time.deltaTime;
        }
        GuiTiempo2.text = tiempos [1].ToString ("f1");
        if (checkpoint == 2){
            Debug.Log("Haz finalizado la carrera");
            GuiTiempoTotal.enabled = true;
        }
        GuiTiempoTotal.text = "Tu tiempo fue: " + (tiempos
  • + tiempos [1]).ToString("f1") + " Segundos";
    }    void OnCollisionEnter(Collision coll){
        if (coll.gameObject.name == "Auto") {
            Debug.Log ("Completaste la primer vuelta");
            checkpoint++;
        }
    }    
}Saludos y gracias. 

Etiquetas: