Noticias

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

Resetear las fisicas de la bola(Resuelto)

Iniciado por ramunda, Septiembre 05, 2017, 12:46:13 AM

Tema anterior - Siguiente tema
Septiembre 05, 2017, 12:46:13 AM Ultima modificación: Septiembre 05, 2017, 10:32:56 AM por ramunda
Buenas noches , tengo un dilema con una bola de un juego tipo "arkanoid" que estoy montando.
 
Todo va bien excepto cuando la bola vuelve a la plataforma , allí deberían resetearse las fisicas que le aplico en el start.
 
Para ello uso la función de el Rigidbody2D y lo pongo en kinematico, creía que con esto bastaria....pero no , cada vez que renace la bola va mas rápida, evidentemente esta duplicando la fuerza asignada en el start....pero no se porque!
 
Espero que puedan ayudar.
 
Alla va el script:
 
 
 

using UnityEngine;
using System.Collections;
public class BallScript : MonoBehaviour {
private bool ballIsActive;
private Vector3 ballPosition;
private Vector2 ballInitialForce;
public GameObject playerObject;
public AudioClip hitSound;
AudioSource audio;
private Rigidbody2D rb;
void Start ()
{
   rb = GetComponent<Rigidbody2D>();
   ballIsActive = false;
   ballInitialForce = new Vector2 (50.0f,300.0f);
   ballPosition = transform.position;
   audio=GetComponent<AudioSource>();
}
 
void Update ()
{
   
   if (Input.GetButtonDown ("Jump") == true)
   {
      
      if (!ballIsActive)
      {
         ///reseteamos la fuerza?
         rb.isKinematic = false;
         rb.AddForce (ballInitialForce);
         ballIsActive = !ballIsActive;
      }
   }
   if (!ballIsActive && playerObject != null)
   {
           ballPosition.x = playerObject.transform.position.x;
      transform.position = ballPosition;
   }
}
   
void OnCollisionEnter2D(Collision2D collision)
{
   if (ballIsActive)
   {
      audio.PlayOneShot (hitSound);
}
   if (collision.gameObject.tag == "mata")
   {
      if (ballIsActive)
      {   
         
         Debug.Log ("muere");
         ballIsActive = !ballIsActive;
         ballPosition.x = playerObject.transform.position.x;
         ballPosition.y = -4.5f;
         transform.position = ballPosition;
         rb.isKinematic = true;
         playerObject.SendMessage ("TakeLife");
      }
   }
}
}
   
 

 
 

Cita de: ramunda date=1504565173Todo va bien excepto cuando la bola vuelve a la plataforma , allí deberían resetearse las fisicas que le aplico en el start.
   


no tendria que rebotar? si es el Arkanoid el que pienso que es...
 
fijate que en dentro del onCollision cuando moris la bola tiene su velocity, "quizas" cuando decidis ponerlo en kinematico esa velocity se conserva, cuando le das devuelta para lanzar la bola con el ADD force "puede que" le agregue mas fuerza del que traia... y a eso que le cambias de golpe la posicion... no se ...que se yo una suposicion. Proba agregar esto:
 

if (ballIsActive)
{   
  Debug.Log ("muere");
  ballIsActive = false;   //no es necesario el !, ya estas en ballIsActive!!
  ballPosition.x = playerObject.transform.position.x;
  ballPosition.y = -4.5f;
 
  //por pasos primero anula la velocidad
  rb.velocity = Vector2.zero;   //<<<-----
 
  //luego movelo
  //como estas modificando el transform directamente podes hacer MovePosition
  rb.MovePosition(ballPosition);  
 
  playerObject.SendMessage ("TakeLife");
}

 
 
 
y en:
 

if (!ballIsActive)
{  
  rb.velocity = Vector2.up * velocidad; //elegi una velocidad constante
  ballIsActive = true; //otra vez no es necesario invertir
}

 
 
 
No se en concreto en tu caso que será pero con probar no perdes nada.
 
Para un juego de este tipo te diria que uses el physicsMaterial (por default para todo objeto, en opciones de proyecto) tiene que ser tal que todo rebote, es decir que podes en vez de darle un fuerza darle una velocidad directamente y todo deberia comportarse bien. Un esquema podria ser.
 

if(!bolaActiva){
  if( input )
  {
bolaActiva = true;  
Rb_Bola.velocity = velocidad * Vector2.up;    
  }
}else{

if(condicionPerder)
{
   bolaActiva = false;
   bola.position = plataformaPos;
   Rb_Bola.velocity = Vector2.zero;
}
}

 
saludos

Cita de: lightbug date=1504575875no tendria que rebotar? si es el Arkanoid el que pienso que es...
   
   
      fijate que en dentro del onCollision cuando moris la bola tiene su velocity, "quizas" cuando decidis ponerlo en kinematico esa velocity se conserva, cuando le das devuelta para lanzar la bola con el ADD force "puede que" le agregue mas fuerza del que traia... y a eso que le cambias de golpe la posicion... no se ...que se yo una suposicion. Proba agregar esto:
   
   

if (ballIsActive)
{   
  Debug.Log ("muere");
  ballIsActive = false;   //no es necesario el !, ya estas en ballIsActive!!
  ballPosition.x = playerObject.transform.position.x;
  ballPosition.y = -4.5f;
 
  //por pasos primero anula la velocidad
  rb.velocity = Vector2.zero;   //<<<-----
 
  //luego movelo
  //como estas modificando el transform directamente podes hacer MovePosition
  rb.MovePosition(ballPosition);  
 
  playerObject.SendMessage ("TakeLife");
}

   
       
   
   
      y en:
   
   

if (!ballIsActive)
{  
  rb.velocity = Vector2.up * velocidad; //elegi una velocidad constante
  ballIsActive = true; //otra vez no es necesario invertir
}

   
       
   
   
      No se en concreto en tu caso que será pero con probar no perdes nada.
   
   
      Para un juego de este tipo te diria que uses el physicsMaterial (por default para todo objeto, en opciones de proyecto) tiene que ser tal que todo rebote, es decir que podes en vez de darle un fuerza darle una velocidad directamente y todo deberia comportarse bien. Un esquema podria ser.
   
   

if(!bolaActiva){
  if( input )
  {
bolaActiva = true;  
Rb_Bola.velocity = velocidad * Vector2.up;    
  }
}else{

if(condicionPerder)
{
   bolaActiva = false;
   bola.position = plataformaPos;
   Rb_Bola.velocity = Vector2.zero;
}
}

   
      saludos
   


Llightbug has dado en el clavo e lleno!!!, el problama era cuando moria, no se reseteabaj la velocidad!!, se la llevaba con ella, era justamente eso ponerle el vector 2 a 0, eres um genio!, y si por supuesto le tengo un physisc material a la bola que es bounce friction0 bounce 0 y rebota bien :), lo del vector2 up, lo probe pero el problema es que se va recta hacia arriba y eso impide que coja angulos de rebote osea que sube i baja como un ascensor.
 
Al ponerle esto: ballInitialForce = new Vector2 (50.0f,300.0f); me coje 50 de la x / 300 de la y y sale un pelin torcida asi rebota bien de echo con un 100 basta.
 
 
 
Muchisimas gracias!!!!!!
 
Un abrazo.

Cita de: ramunda date=1504600331Llightbug has dado en el clavo e lleno!!!, el problama era cuando moria, no se reseteabaj la velocidad!!, se la llevaba con ella, era justamente eso ponerle el vector 2 a 0, eres um genio!, y si por supuesto le tengo un physisc material a la bola que es bounce friction0 bounce 0 y rebota bien :), lo del vector2 up, lo probe pero el problema es que se va recta hacia arriba y eso impide que coja angulos de rebote osea que sube i baja como un ascensor.
   
   
      Al ponerle esto: ballInitialForce = new Vector2 (50.0f,300.0f); me coje 50 de la x / 300 de la y y sale un pelin torcida asi rebota bien de echo con un 100 basta.
   
   
       
   
   
      Muchisimas gracias!!!!!!
   
   
      Un abrazo.
   


Ah bueno mejor. Lo del vector2 up lo decia simplemente a modo de ejemplo podes usar el vector que quieras, incluso podrias tener un gizmo que lo represente entonces sabes antes de darle play para donde saldrá. podria ser por ej:
 

//a 45° siempre
Rb_Bola.velocity = velocidad * Vector3.Normalize(  (Vector2.up + Vector3.right) );
//o si queres algo mas aleatorio ponele valores (inventados aca) random al right
//de 20° a 60°
Rb_Bola.velocity = velocidad * Vector3.Normalize(  (Vector2.up + Random.Range(valorQueLoHace20,valorQueLoHace60) * Vector3.right) );

 
Saludos

Cita de: lightbug date=1504627368Ah bueno mejor. Lo del vector2 up lo decia simplemente a modo de ejemplo podes usar el vector que quieras, incluso podrias tener un gizmo que lo represente entonces sabes antes de darle play para donde saldrá. podria ser por ej:
   
   

//a 45° siempre
Rb_Bola.velocity = velocidad * Vector3.Normalize(  (Vector2.up + Vector3.right) );
//o si queres algo mas aleatorio ponele valores (inventados aca) random al right
//de 20° a 60°
Rb_Bola.velocity = velocidad * Vector3.Normalize(  (Vector2.up + Random.Range(valorQueLoHace20,valorQueLoHace60) * Vector3.right) );

   
      Saludos
   


Brutal!, muchisimas gracias de nuevo esto le da un nuevo enfoque a la cosa.
 
Gracias
 
 

Etiquetas: