Jump to content
Wazabee

Ayuda comparación de resultados

Recommended Posts

Hola a tod@s,

Estoy estancado en un proyecto y necesito ayuda. En mi escenario, el personaje tiene que hacer un recorrido y, al final de éste, recoger un objeto. Al hacerlo, el personaje vuelve al punto de partida y debe hacer de nuevo el recorrido para volver a recoger el objeto. Hasta ahí no hay problema. El tema está en que una vez hecho esto, si el tiempo que tarda en hacer el recorrido por segunda vez es inferior al tiempo invertido la primera vez, se debe mostrar en consola un mensaje de felicitación y es ahí donde me he quedado bloqueado y no encuentro la forma de solucionarlo. El problema (creo) está en la función "OnTriggerEnter". Adjunto el código para ver si me podéis echar un cable:

 

#pragma strict

//Variables OBJETOS CON EFECTOS TEMPORALES

var scriptPersonaje : UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter;
var contador : float;
var contador_switch : boolean;
var reloj : float;
var tiempoinvertido : float;
var record : float;

//Variables RAYCAST

var hit : RaycastHit;

//Variables MUERTE

var onGround: boolean = true; // nos dice cuando el personaje está en caida
var firstY : float; // Posición inicial del personaje
var lastY : float; // La última posición del personaje en que tocaba suelo 
var hFall : float;
var character: CharacterController;
var salud : int = 20;



function Start () {
    firstY = transform.position.y;
    

}

function Update () {

    //RAYCAST
        
    if (Physics.Raycast(transform.position, transform.forward, hit, 5)){
        if (hit.collider.gameObject.tag=="interruptores"){
            print ("Estoy tocando el interruptor. Pulsa 'E' para recogerlo");
            if(Input.GetKeyDown("e")) {
                print ("He cogido el interruptor");
                Destroy(hit.collider.gameObject);
            }
        }
    }
    reloj = reloj + Time.deltaTime;

    //ITEMS DE TIEMPO LIMITADO
    if (contador_switch){                           // Esta variable controla el tiempo que los items de tamaño y velocidad están activos
        contador = contador + Time.deltaTime;
        if(contador>5){
            contador = ;
            contador_switch = false;
        }
    }

    else {
        scriptPersonaje = GetComponent (UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter); 
        scriptPersonaje.m_MoveSpeedMultiplier = 1;          
        transform.localScale = new Vector3 (1f, 1f, 1f);
    }
}

// FUNCIONES DE COLISIONES 

function OnCollisionEnter(collision: Collision) { 
    
    // COLISIONES CON ITEMS Y LÍMITES DEL ESCENARIO
                                                           
                                                           //      Podría ser también:
                                                          //  function OnCollisionEnter  (hit:Collision){
    if (collision.gameObject.tag== "cubo") {             //   if (hit.gameObject.tag== "cubo") {
        print ("Estoy Chocando Con El Cubo");           //    print ("Estoy Chocando Con El Cubo");
    }                                                  //     }

    if (collision.gameObject.tag== "limite"){
        print ("No creo que deba ir por ahí");
    }

    // COLISIONES PARA CONTROLAR CUANDO ESTAMOS EN EL SUELO

    if (collision.gameObject.tag=="suelo") {        //Cada vez que tocamos el suelo grabamos nuestra última posición
        lastY = transform.position.y;
        hFall = firstY - lastY;
        if (hFall > 4){
            print ("GAME OVER");                    // Si caemos de una altura de más de 4 unidades, palmamos
            transform.position = new Vector3 (31.43, 2.248855, 140);  // RESPAWN
            print ("YOU'VE BEEN RESPAWNED");
        }        
    }

    if (collision.gameObject.tag=="plataformas") {        //Cada vez que tocamos el suelo grabamos nuestra última posición
        lastY = transform.position.y;
        hFall = firstY - lastY;
        if (hFall > 2){                                 // Si caemos de una altura de más de 2 unidades nuestra salud disminuirá 5 puntos                    
            salud -= 5;                            //NO FUNCIONA BIEN POR LAS FÍSICAS DE UNITY
            print (salud); 
        }        
    }
}

function OnTriggerEnter (collider:Collider) {
    
    // COLISIONES CON ITEMS NORMALES E ITEMS DE TIEMPO LIMITADO
        
        if (collider.gameObject.tag=="cubo-tamaño") {           //Al recoger este item aumentamos nuestro tamaño 0,5 unidades
            //print ("Esto es un trigger");
            contador_switch = true;
            transform.localScale += new Vector3(1.5F, 1.5, 1.5);
            Destroy(collider.gameObject);
        }
        
        if (collider.gameObject.tag=="cubo-velocidad") {        //Al recoger este item multiplicamos la velocidad X3
            contador_switch = true;
            scriptPersonaje = GetComponent (UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter);
            scriptPersonaje.m_MoveSpeedMultiplier = 3;
            Destroy(collider.gameObject);
        }
        if (collider.gameObject.tag=="Item") {
            print ("Estoy recogiendo mi Item");
            //Destroy(collider.gameObject);
            //print ("You spent " + Time.time + " seconds to finish this level"); // La diferència d'un comptador a l'altre és mínima
            print ("Has tardado " + reloj + " segundos en hacer el recorrido");
            print ("YOU'VE BEEN RESPAWNED");
            tiempoinvertido = reloj;            // Igualamos el valor del reloj al tiempoinvertido
            //print (tiempoinvertido);
 /*
 EL PROBLEMA ESTÁ POR AQUÍ (CREO). ENTIENDO QUE, SEGÚN LO QUE TENGO ESCRITO, LA VARIABLE "record" SIEMPRE SERÁ IGUAL A LA VARIABLE "tiempoinvertido" Y AL RELOJ.
 LA COSA ESTÁ EN QUE NO SÉ CÓMO HACERLO PARA DISTINGUIR ENTRE "record" Y "tiempoinvertido" Y QUE FUNCIONE COMO YO QUIERO
 */           
            record = reloj;                     
            if(record < tiempoinvertido){
                print("NUEVO RECORD " + record);
            }
            reloj = ;
            transform.position = new Vector3 (31.43, 2.248855, 140);

        }      
}

    function OnCollisionExit (collisionInfo : Collision) {

        //COLISIONES DE CONTROL CUANDO DEJAMOS DE TOCAR EL SUELO

    if (collisionInfo.gameObject.tag=="suelo") {            //Cuando saltamos no estamos en el suelo, por lo tanto OnGround = false
        // print ("Estoy en el suelo"); 
        onGround = false;
        firstY = transform.position.y;       
    }

    if (collisionInfo.gameObject.tag=="plataformas") {    //Cuando saltamos no estamos en el suelo, por lo tanto OnGround = false    
        onGround = false;
        firstY = transform.position.y;
    }
} 

Saludos y muchas gracias de antemano

Share this post


Link to post
Share on other sites

Si lo que quieres es mostrar lo de "NUEVO RECORD *record* " simplemente ponlo antes de iguales variables o nunca se cumplirá.

            tiempoinvertido = reloj;            // Igualamos el valor del reloj al tiempoinvertido   
                             
            if(record > tiempoinvertido){
                print("NUEVO RECORD " + tiempoinvertido);
                 record = tiempoinvertido;
            }
			transform.position = new Vector3 (31.43, 2.248855, 140);

Es decir, si suponemos que el record son 10 segundos, si el tiempo actual invertido es menor que el record, muestra el valor actual, que será el tiempo invertido y establece un nuevo record.

Edited by Harsel

Share this post


Link to post
Share on other sites

Muchas gracias por tu ayuda Harsel. Aunque no es exactamente lo que buscaba, tu respuesta me ha sido muy útil para dar con la solución. Al final la cosa ha quedado así:

function OnTriggerEnter (collider:Collider) {
  
		if (collider.gameObject.tag=="Item") {
            print ("Estoy recogiendo mi Item");
            //Destroy(collider.gameObject);
            //print ("You spent " + Time.time + " seconds to finish this level"); // La diferència d'un comptador a l'altre és mínima
            print ("Has tardado " + reloj + " segundos en hacer el recorrido");
            print ("YOU'VE BEEN RESPAWNED");
            record = reloj;                     //Guardamos el tiempo que hemos tardado en hacer el recorrido                 
            //print (tiempoinvertido);
                           
            if(record <= tiempoinvertido){          //Comparamos el valor "record" con el valor "tiempoinvertido". Si el primero es menor o igual al
                print("NUEVO RECORD " + record);    // segundo mostramos el NUEVO RECORD
            }
             
            tiempoinvertido = reloj;            // Almacenamos el tiempo que tardamos igualando el valor de "reloj" al "tiempoinvertido"
            transform.position = new Vector3 (31.43, 2.248855, 140);
            reloj = ;
        } 
}

En la función Start le he dado un valor alto a la variable "record" de manera que la primera vez no salte el mensaje del Nuevo Record.

Muchas gracias!

Share this post


Link to post
Share on other sites

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