Noticias

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

Aumentar velocidad X segundos al colisionar con un objeto

Iniciado por Wazabee, Abril 21, 2017, 12:12:17 PM

Tema anterior - Siguiente tema
Abril 21, 2017, 12:12:17 PM Ultima modificación: Abril 21, 2017, 12:14:27 PM por Wazabee
Hola a tod@s,
 
Estoy aprendiendo a lidiar con Unity bajo JavaScript y me cuesta un poco conseguir que mi proyecto se comporte como necesito. Me gustaría que mi personaje aumente de tamaño al colisionar con un objeto y, al colisionar con otro que aumente la velocidad durante un periodo de tiempo limitado. Lo del tamaño ya lo tengo pero, por desconocimiento, no consigo dar con la sentencia adecuada para conseguir aumentar la velocidad durante, pongamos, 10 segundos. Mi personaje se mueve bajo los Scripts de control en tercera persona del Asset Store ( que están en C# y que no domino en absoluto) y mi Script de colisiones es en JavaScript que conozco un poco más pero tampoco demasiado ya que estoy estudiándolo por mi cuenta y, como aquel que dice, acabo de empezar. Os paso el Script que tengo a ver si me podéis echar un cable:
 

#pragma strict
function Start () {

}
function Update () {

}
 
function OnCollisionEnter(collision: Collision) {          //      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");
    }                                                  //     }
}
function OnTriggerEnter (collider:Collider) {
        if (collider.gameObject.tag=="cubo-tamaño") {
            //print ("Esto es un trigger");
            transform.localScale += new Vector3(1.5F, 1.5, 1.5);
            Destroy(collider.gameObject);
        }
       
/* Esta es la parte que no consigo sacar. Sé que está mal, pero no sé por qué ni cómo hacerlo para que funcione como yo quiero ya que mis conocimientos son algo limitados.
Entiendo que, si para cambiar el tamaño de mi personaje uso la sentencia "transform.localScale" quizá para cambiar la velocidad podría ser "transform.Translate",
pero seguramente me equivoco y es por eso que os pido ayuda. */
        if (collider.gameObject.tag=="cubo-velocidad") {                  
            transform.Translate += (new Vector3.forward *Time.deltaTime);
            Destroy(collider.gameObject);
        }
}

 
Esto es lo que he hecho para el tamaño y la velocidad y, a riesgo de repetirme, la sentencia del "transform.Translate" la he hecho sin saber qué es lo que estoy haciendo...
 
Saludos y Muchas gracias de antemano.

Translate ... hace un movimiento de traslación ...
 
podes usar addForce ... agrega una fuerza ... al rigibody (el objeto debe tener uno para que funcione) para agregarle una aceleración ... durante X segundos ...
 
https://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html
 
 
 
 
 
  

Hola, primero que si pasas de C# a JS y viceversa cambia relativamente muy poquito no es la gran cosa, te digo por si ves un ejemplo en un lenguaje podes pasarlo al otro teniendo algunas consideraciones.
 
Me da gracia el "Podria ser tambien" ya que lo unico que hiciste fui cambiarle el nombre al argumento, tecnicamente podria ser de cuatrillones de combinaciones mas jajaj. Otra cosa porque usas el OnCollision y el OnTrigger? usa uno solo.
 
Tenes que repensar el metodo, cuando chocas con X etas en el modo X, cuando chocas con Y estas en modo Y, de eso solo se encarga los OnColiision u OnTrigger los que quieras usar, un tipico error es que ponen codigo que necesita actualizarse en estas funciones cuando lo mejor es usar Update. En tu update lo que haces es verificar en que modo estas y aplicas el efecto deseado. Fijate que estas aumentando la velocidad solo cuando entra al cubo y no cuadro a cuadro. Si los efectos son mutuamente excluyentes, es decir que no podes tener dos a la vez lo mejor es usar un switch. Si no, un conjunto de bools podrian hacer el truco.
 
Un pseudocodigo alienigena podria ser:
 

enum Modo {normal, agrandar,acelerar};
Modo modoActual;
OnCollisionEnter(col)
{
if(col == cubo-agrandar)
{
   modoActual = Modo.agrandar;
}else{
   modoActual = Modo.acelerar;
}
}
Update()
{
switch(modoActual)
{
   case Modo.agrandar:
      AgrandarObjeto();   //puede ser instantaneo, por tiempo, como quieras...
                     //sifuera instantaneo aca impones que el modo sea normal de vuelta, sino la func AgrandarObjeto lo hace
      break;
   case Modo.acelerar():
      AcelerarObjeto();   //dura un cierto tiempo, una vez pasado el tiempo la funciom/corrutina AcelerarObjeto pone todo a normal
      break;
   
   case Modo.normal:
      //HAcerCosasNormales() o un simple break
      break;
}
//Resto del codigo

}

 
Un saludo
 
 

Abril 21, 2017, 06:56:37 PM #3 Ultima modificación: Abril 21, 2017, 08:11:04 PM por Wazabee
Bueno, gracias a los dos por echarme una mano, pero al final lo estoy intentando hacer de otro modo. La idea ahora es acceder a la variable del Script "ThirdPersonCharacter" desde mi Script "Colisiones" ( que estan en carpetas distintas) via GetComponent (UnityStandardAssets.Characters.ThirdPerson.ThirdPersonCharacter) y ahí ya cambiar la velocidad. Lo que no tengo muy claro cómo hacerlo para que sea sólo durante un periodo de tiempo determinado y no de forma permanente. Supongo que será combinando un contador de tiempo y un boolean o algo así, pero no sé muy bien cómo...Seguiré investigando a ver si saco algo en claro.
 
Sobre lo de "Podría ser también" era una aclaración para mi mismo porque tuve un montón de problemas para que me funcionara esa función y, al final, de esos dos modos tiraba bien y lo de por qué uso OnCollision y OnTrigger es porque el ejercicio que estoy haciendo me lo requiere...
 
De nuevo gracias a los dos
 
Saludos
 
 

Etiquetas: