Jump to content
Sign in to follow this  
MatiasMartin

Crear Array para almacenar valores en variables Collision.

Recommended Posts

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. 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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?

Edited by adriel0000

Share this post


Link to post
Share on other sites

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. 

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?

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. 

Share this post


Link to post
Share on other sites

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...

Share this post


Link to post
Share on other sites

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 [0] + tiempos [1]).ToString("f1") + " Segundos";
    }

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

Saludos y gracias. 

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...