Noticias

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

Problema con gancho

Iniciado por gokudera2, Agosto 08, 2016, 03:17:35 PM

Tema anterior - Siguiente tema
Buenas tardes tengo un problemilla a ver si me podeis echar una mano ya que he probado de todo y no se cual puede ser el problema, os pongo un poco en situacion:
 
Tengo un personaje que puede usar un gancho si doy click izquierdo lanza un gancho a esa posicion y el personaje se mueve a donde se ha enganchado tanto una parte del escenario como diferentes personajes que pueden haber, si doy click derecho a una parte del escenario el gancho es devuelto pero si doy a un personaje/objeto suelto es atraido hacia mi, el problema esta en que no detecta el click derecho hace lo mismo que el click izquierdo, pero si lanzo el gancho con el click izquierdo y cuando llega al objetivo le doy a click derecho si que hace lo que tendria que hacer, he cambiado mil veces el codigo tanto de una parte como de otra y no se que puede ser os pongo el codigo a ver si encontrais que da el problema vais a ver codigo desorganizado pero es por eso de tanto buscar el problema.
 

//Script para ver donde apunta el raton.
using UnityEngine;
using System.Collections;
public class DispararCuerda : MonoBehaviour {
public GameObject gancho;
private GameObject auxGancho;
public Camera m_camera;
public Transform dirClick;
private Transform auxdirClick;
private Vector3 localClick;
private Vector3 posRaton;
private Quaternion mirarDir;
// Use this for initialization
void Start () {
 
}
// Update is called once per frame
void Update () {
   posRaton = Input.mousePosition;
   posRaton.z = Vector3.Distance(m_camera.transform.position, transform.position);
   posRaton = m_camera.ScreenToWorldPoint(posRaton);
   if(auxGancho == null){
      if(Input.GetMouseButtonDown() || Input.GetMouseButtonDown(1) ){
         auxdirClick = Instantiate(dirClick, posRaton, Quaternion.identity) as Transform;
         localClick = (auxdirClick.transform.position - transform.position).normalized;
         mirarDir = Quaternion.LookRotation(localClick);
         auxGancho = Instantiate(gancho, transform.position, mirarDir) as GameObject;
         Destroy(auxdirClick.gameObject);
      }
   }
}
}


//script encargado de lanzar y recoger gancho
using UnityEngine;
using System.Collections;
public class Gancho : MonoBehaviour {
// Use this for initialization
public float lanzamientoVel;
public float tamCuerda;
public float fuerzaCuerda;
public float peso;
 
private GameObject player;
private GameObject Objeto;
private Rigidbody rigidbody;
private SpringJoint efectoCuerda;
private float distanciaPlayer;
private bool atraer;
private bool enganchar;
private bool tirarCuerda;
public static bool colisionCuerda;
 
void Start ()
{
   player = GameObject.FindGameObjectWithTag("Gancho");
   rigidbody = GetComponent<Rigidbody>();
   efectoCuerda = player.GetComponent<SpringJoint>();
   tirarCuerda = true;
   colisionCuerda = false;
   atraer = false;
}
 
void Update ()
{
   distanciaPlayer = Vector3.Distance(transform.position, player.transform.position);
   if(Input.GetMouseButtonDown() && distanciaPlayer <= 1)
   {
      tirarCuerda = true;
   }
   else if(Input.GetMouseButtonUp())
   {
      this.transform.parent = null;
      tirarCuerda = false;      
   }
   if(Input.GetMouseButtonDown(1) && distanciaPlayer <= 1)
   {
      atraer = true;
      Debug.Log (atraer);
      tirarCuerda = true;
   }
   else if(Input.GetMouseButtonUp(1))
   {
      atraer = false;
      this.transform.parent = null;
      tirarCuerda = false;
   }
   if(tirarCuerda)
      tirarGancho();
   else
      RecogerGancho();
   //LineRender
   GetComponent<LineRenderer>().SetPosition(, player.transform.position);
   GetComponent<LineRenderer>().SetPosition(1, transform.position);
}
void OnTriggerEnter(Collider coll)
{
   
   if (coll.tag != "Gancho" && coll.tag != "Escenario" && enganchar == false)
   {
         enganchar = true;
         colisionCuerda = true;
         Objeto = coll.gameObject;
   }
   else if(coll.tag != "Gancho" && enganchar == false)
   {
      enganchar = true;
      colisionCuerda = true;
      Objeto = coll.gameObject;
   }
}
public void tirarGancho()
{
   if(distanciaPlayer <= tamCuerda)
   {
      if(!colisionCuerda)
      {
          transform.Translate(, , lanzamientoVel*Time.deltaTime);
      }
      else
      {
         efectoCuerda.connectedBody = rigidbody;
         efectoCuerda.spring = fuerzaCuerda;
         efectoCuerda.damper = peso;
         this.transform.parent = Objeto.transform;
         if (atraer == true) {
            atraerJugador ();
         }
      }
   }
   if(distanciaPlayer > tamCuerda)
   {
      tirarCuerda = false;
   }
   if (distanciaPlayer >= 21)
   {
      RecogerGancho ();
   }
}
 
public void atraerJugador()
{
   if (Objeto.tag == "Escenario" || Objeto.tag == null) {
      tirarCuerda = false;
      RecogerGancho ();
   } else {
      efectoCuerda.spring = ;
      Objeto.transform.position = Vector3.MoveTowards (Objeto.transform.position, player.GetComponent<Collider> ().transform.position, 25 * Time.deltaTime);
   }
   if (distanciaPlayer <= 0.9f) {
      Destroy (gameObject);
   }
   if (distanciaPlayer > tamCuerda) {
      tirarCuerda = false;
   }
   if (distanciaPlayer >= 21)
   {
      RecogerGancho ();
   }
}
public void RecogerGancho()
{
   transform.position = Vector3.MoveTowards(transform.position, player.transform.position, 25*Time.deltaTime);
   colisionCuerda = false;
   enganchar = false;
   if(distanciaPlayer <= 2)
   {
      Destroy(gameObject);
   }
}
}

 
Los inputs vacios ahi va un 0 pero no se porque no se ve.

Agosto 08, 2016, 08:44:49 PM #1 Ultima modificación: Agosto 08, 2016, 09:38:45 PM por pioj
A ver, separemos.
 
Tu quieres.
 
Pulsar boton izquierdo para que lanze el gancho
 

  •    Mantener el boton izquierdo para que lleve al jugador hasta el gancho


  •    Si no se mantiene pulsado , el jugador se queda colgando?? o se suelta el gancho???


Si se queda colgando, es decir entonces boton izquierdo seria ir hacia el gancho y boton derecho para soltarlo?? en caso de haberle dado a  un enemigo, boton izquierdo para ir tu hacia el y boton derecho para que el vaya hacia a ti???
 
O la cosa va de otra manera??Es que no acabo de entenerder como es el sistema,si pudieras hacer un "esquema" por partes de su funcionamiento en el juego mejor por que no acabo de ver como funcionaria

Agosto 08, 2016, 09:10:18 PM #2 Ultima modificación: Agosto 08, 2016, 09:40:02 PM por pioj
 lo esquematizo porque sabia que iba a pasar esto por mi forma de explicarme xD
 

  •    El pj usa un gancho tanto el click derecho como el izquierdo lanza el gancho.


  •    Cuando sueltas el boton el gancho automaticamente vuelve al personaje tanto si ha llegado al destino como si no.


  •    El click izquierdo mueve el personaje hacia donde esta enganchado.


  •    El click derecho atrae lo que se ha enganchado menos el escenario.


Ahora explicar el problema que es lo mas complicado:
 

  •    Lo que yo quiero que haga funciona perfectamente el problema esta en los inputs que hace lo que le da la gana.


  •    Si pulso el boton derecho el gancho cuando llega al objetivo actua como si estubiera pulsando el izquierdo y no el derecho


  •    Para hacerlo funcionar tengo que pulsar el izquierdo y cuando llega al objetivo pulsar el derecho entonces asi si que me lo hace


  •    vamos que es como si el input derecho actuara cuando esta el input del izquierdo y lo quiero independientes, un input una funcion.


Espero que mas o menos se me entienda ahora lo que quiero decir.

A lo mejor digo una burrada, pero... en el getmousebutton()  y getmousseup() no tendrías que ponerle 0? Nunca he probado si no le pones nada, pero a lo mejor siempre se te mete en el if por eso... Es lo primero que probaría.

Cita de: Tizon date=1470683925A lo mejor digo una burrada, pero... en el getmousebutton()  y getmousseup() no tendrías que ponerle 0? Nunca he probado si no le pones nada, pero a lo mejor siempre se te mete en el if por eso... Es lo primero que probaría.
   


No te preocupes hombre que eso es lo de menos, si esta puesto en 0 lo que no se es porque aqui no se muestra, lo indique al final de los dos codigos culpa mia porque casi no se ve, pero si, yo cuando lo vi a traves de aqui pense lo mismo y mire en el codigo para asegurarme que habia puesto el 0 xD

Es que es lo primero que me ha llamado la atención en el código... 

Agosto 08, 2016, 11:20:06 PM #6 Ultima modificación: Agosto 08, 2016, 11:20:39 PM por hammer
Diria que el primer Input.GetMouseButtonDown, tendria que ser Input.GetMouseButton. El input.GetMouseButtonDown solo detecta en el frame que se pulsa el boton pero no si esta pulsado, para detectar si se mantiene pulsado es input.GetMouseButton
 
Aun asi no te funcionara por que tienes el bloque if else mal planteado, a la que piensas un poco frame a frame sobre lo que puede pasar lo veras,revisara por ejemplo el distanceplayer <=1, fijate que en el caso de que sea distanceplayer sea >=1 y no se cumpla el else if de GetMouseButtonUp no se va a cumplir ninguno,
 
Tendrias que ser aun mas esquematico, tienes que pensar en todas las posibilidades frame a frame como si fueras el jugador y lo que puede pasar o no para reconstruir el bloque if-else intentando delimitar las sentencias lo mas posibles.Recomiendo que tengas encuenta a la hora de escribirlas con que boton se hizo el disparo y alguna variable para saber si el gancho a llegado a su destino o no y cual a sido, enemigo o no, asi controlaras el estado actual del gancho y podras saber a que otros estados puedes cambiar
 
Sin saber todas absolutamente todas las posibilidades no puedo ponertelo

Vale ya lo he solucionado pero la verdad no se cual es el verdadero motivo lo que hice fue hacer el booleano publico y ponerlo a true desde el script que detecta la posicion del raton en su input, si lo pongo ahi va perfecto si lo pongo en el otro lado haciendo pruebas es como si no detectara el input derecho ya que tengo varios debugs y si los coloco ahi nunca llegan a saltar pero desde el otro lado si me los reconoce no se si es porque un script se ejecuta antes que el otro y por eso no hace nada ni idea.
 
Aunque ya esta solucionado bueno por dejarlo claro mas que nada lo del Input.GetMouseButton fue lo primero que probe y hasta que no soltara el boton la cuerda se quedaba estirada aunque no estubiera fijada a nada y lo de distancia player es para que solo se puede tirar la cuerda una vez y no la puedas volver a tirar mientras la estas recogiendo tienes que esperar a que vuelva.
 
Si alguien quiere y/o necesita el script completo y funcional que lo diga y lo pongo aqui sin problemas pero ya ponerlo bonito os encargais vosotros xD

Etiquetas: