Jump to content
Doctor

Ayuda con scripts de agarre

Recommended Posts

Un saludo a todos... veamos, quizás alguien pueda echarme un cable, tengo un script que me está dando quebraderos de cabeza. Básicamente se trata de lo siguiente: Objeto con etiqueta "Agarrable" es atraído hacia Puntogravity (colocado frente al arma) con la intención de que quede frente al jugador, el problema es que es atraído pero luego cae, no se queda en suspendido junto al gameobject Puntogravity. Tengo que decir que es una mezcla de diferentes scripts que he visto para poder conseguir lo que quería.
 

//(variables instadas)
var Camara : Transform; 
var Puntogravity : Transform;
private var hit2 : RaycastHit;

//(cuerpo dentro del sistema de armas, obviamente se trata de la Gravitygun del HL2)


if(apuntarModo == apuntarModo.Agarrar) //no hacer caso a esto, está dentro de los diferentes modos de las armas y hasta aquí funciona bien.
{
var fwd:Vector3;
aiming = false;
fwd =transform.TransformDirection(Vector3.forward);
Debug.DrawRay (Camara.transform.position, fwd * 5, Color.red);
	if (Physics.Raycast (Camara.transform.position, fwd, hit2, 15)) 
		{
		if (hit2.collider.tag == "Agarrable")
		{
			if (hit2.rigidbody.useGravity == true) //si no está siendo agarrado, cogerlo
				{
				hit2.rigidbody.useGravity = false; //Gravedad off
				hit2.rigidbody.transform.position = Puntogravity.position; //Ir a <==== AQUÍ FALLA coge pero no retiene en la posición
				}
			else if (hit2.rigidbody.useGravity == false) //Si ya está siendo agarrado, soltarlo.
				{
				hit2.rigidbody.useGravity = true;  //Gravedad on
				}

		}
	}
}



Gracias de antemano.

Edited by Doctor

Share this post


Link to post
Share on other sites

Desactiva useGravity del rigibody.Ademas para mantener la posicion de agarre deberias emparentar el objeto a tu mano.

Edited by GSG3D

Share this post


Link to post
Share on other sites

Buenas GSG3D,

Al ordenar "hit2.rigidbody.useGravity = false", una vez en el juego, he podido comprobar que desactiva la gravedad del objeto (en este caso un cubo) con la etiqueta "Agarrable", y por otro lado, el gameobject Puntogravity es hijo del arma, que a su vez es hijo de la maincamera que a su vez es hijo del Player (Si te refieres a emparentar el objeto como que sea "hijo de") y por si acaso, pensando que quizás pudiera ser eso, le di un render para comprobar que se moviera con el Player, y obviamente lo hace. Básicamente el objeto agarrable va hasta el gameobject pero en lugar de quedarse en ese punto... cae al suelo (lentamente eso si, por el tema de la gravedad)... la gravedad del objeto agarrable se activa y desactiva perfectamente, y por eso me está dando dolores de cabeza el script.

Share this post


Link to post
Share on other sites

No vi lo de useGravity (lo veo desde el celular) y lo de emparentar donde lo implementas, porque podrias usar eso, en vez de comprobar la gravedad, por ejemplo si tienes emparentado un objeto el modo agarre esta activado, y viceversa.

Edited by GSG3D

Share this post


Link to post
Share on other sites

¡GSG3D tu idea ha sido perfecta! ¡Muchísimas gracias! En efecto emparentando el rigidbody (cubo) con Puntogravity se mueve con el personaje, también he cambiado useGravity por isKinetic para mantenerlo quieto en frente, por otro lado, como no sabía otra manera de que dejase de ser hijo de Puntogravity, he creado un gameobject llamado Instanciador para que al soltar el cubo, este sea hijo del nuevo gameobject y caiga donde lo deje pero pueda recuperarlo más tarde y cogerlo tantas veces quiera (si hay una manera mejor de haceresto, por favor que alguien me diga XD). En definitiva, ¡funciona! y queda tal que así:

var Camara : Transform; 
var Puntogravity : Transform;
private var hit2 : RaycastHit;
var Instanciador : Transform; //Este es el nuevo gameobject del cual será hijo cuando soltamos el objeto

if(apuntarModo == apuntarModo.Agarrar)
			{
			var fwd:Vector3;
			aiming = false;
			fwd =transform.TransformDirection(Vector3.forward);
			Debug.DrawRay (Camara.transform.position, fwd * 5, Color.red);
			if (Physics.Raycast (Camara.transform.position, fwd, hit2, 15)) 
				{
				if (hit2.collider.tag == "Agarrable")
					{
					if (hit2.rigidbody.transform.parent != Puntogravity) //Si no es hijo de....
						{
						hit2.rigidbody.transform.position = Puntogravity.position;  //cambiar posición (traer)

						hit2.rigidbody.transform.parent = Puntogravity;  //Hacer hijo de Puntogravity

						hit2.rigidbody.isKinematic = true; //Kinematic ON
						}
					else if (hit2.rigidbody.transform.parent == Puntogravity)	//si no es hijo de...					
						{
						hit2.rigidbody.transform.parent = Instanciador;  //Hacer hijo de Instanciador
						hit2.rigidbody.isKinematic = false;  //Kinematic OFF
						}

					}
				}
			}

 

Edited by Doctor

Share this post


Link to post
Share on other sites

Pues nuevamente tienes razón, cambiar el "......transform.parent = Instanciador;" por "hit2.rigidbody.transform.parent = null" y funciona perfectamente.

De todas maneras, una vez todo a funcionado he realizado algunos cambios para evitar algunas fallas, y quedaría así. ¡Una vez más, muchas gracias GSG3D!

var Tieneobjeto : boolean = false;  //variable añadida para comprobar si tiene o no

if(apuntarModo == apuntarModo.Agarrar)
			aiming = false;
			{
			if(Tieneobjeto == true) //Si tiene un objeto, al pulsar soltarlo y me evito que a veces coja y suelte a la vez
			 	{
			 	hit2.rigidbody.transform.parent = null;
				hit2.rigidbody.isKinematic = false;
				weaponAnim.Play(animsuelta);
				aSource.PlayOneShot(soundSuelta);
				Tieneobjeto = false;
			 	}
			else
				{
				var fwd:Vector3;
				fwd =transform.TransformDirection(Vector3.forward);
				Debug.DrawRay (Camara.transform.position, fwd * 5, Color.red);
				if (Physics.Raycast (Camara.transform.position, fwd, hit2, 15)) 
					{
					if (hit2.collider.tag == "Agarrable")
						{
						if (hit2.rigidbody.transform.parent != Puntogravity)
							{
        	        		hit2.rigidbody.isKinematic = true;
        	        		Invoke("Agarrar", 0.2); //Primero el isKinematic true, con retardo el resto para evitar que el objeto se instancie mal
							}
						}
					else if (hit2.collider.tag != "Agarrable")  //El objeto no es agarrable
						{
						weaponAnim.Play(animnohay);
						aSource.PlayOneShot(soundNohay);
						
						}
					}
				}
			}

function Agarrar() 
	{  
	weaponAnim.Play(animcoge);
	aSource.PlayOneShot(soundCoge);
    hit2.rigidbody.transform.position = Puntogravity.position;
    hit2.rigidbody.transform.parent = Puntogravity;           
    Tieneobjeto = true;
   }

 

Edited by Doctor

Share this post


Link to post
Share on other sites

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