Unity Spain

Post Antiguos => General (Antiguo) => Mensaje iniciado por: Wazabee en Mayo 14, 2017, 06:16:30 PM

Título: Ayuda comparación de resultados
Publicado por: Wazabee en Mayo 14, 2017, 06:16:30 PM
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
Título: Ayuda comparación de resultados
Publicado por: Harsel en Mayo 14, 2017, 07:45:28 PM
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.
Título: Ayuda comparación de resultados
Publicado por: Wazabee en Mayo 15, 2017, 07:01:01 PM
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!