Jump to content
UnitySpain
Sign in to follow this  
nomoregames

ANSWERED unir joints con rigidbodys

Recommended Posts

Hola a todos, tengo una duda y espero que me ayudéis a resolverla :35_thinking:.

Si jugasteis <dark messiah of might and magic>, sabréis que existía una flecha que cuando lanzabas soltaba una cuerda por la que podías subir.

Pues bien... estoy tratando de hacer algo similar,mediante este código

 public GameObject objetivo;

    public GameObject objeto_a_clonar;
    

    


   

    void Start()
    {
       Vector3 distancia = objeto_a_clonar.transform.position - objetivo.transform.position;
        float cantidad_replicas = distancia.y / objeto_a_clonar.transform.localScale.y;
        cantidad_replicas = Mathf.Round(cantidad_replicas);
        
        while (cantidad_replicas > 0)
        {
            Instantiate(objeto_a_clonar, new Vector3(objeto_a_clonar.transform.position.x,
                objeto_a_clonar.transform.position.y - objeto_a_clonar.transform.localScale.y * cantidad_replicas,
                objeto_a_clonar.transform.position.z),

                Quaternion.identity);
            cantidad_replicas -= 1;
            print(cantidad_replicas);
        }
        
      
       
    }

creo una serie de esferas que se empiezan a instanciar (el objeto a clonar)en la posición de el "gancho" o flecha, hacia abajo hasta que llegar a una altura similar a la de el jugador.

 

aquí viene mi duda, como hago para que cada esfera se una (mediante joints), con la esfera que tiene justo encima suyo

 

 

Gracias de antemano :11_blush:

Share this post


Link to post
Share on other sites

Yo nunca lo he hecho y no tengo ejemplos, pero tendrás que crear y configurar cada uno de los componentes involucrados asociados a los GameObjects que estás creando. Depende de si tu prefab ya tiene RigidBody (necesita uno), tendrás que añadirlo o no, y las Joints necesarias y cualquier otro componente u GameObject auxiliar.

Yo lo que haría sería pausar el juego con las esferas creadas (o hacer una prueba), y en el editor añadir las joints que sean necesarias, anotando todos los componentes que se han añadido y los valores.

Luego te toca hacer eso por código. Recuerda que para añadir un componente a un GameObject se usa https://docs.unity3d.com/ScriptReference/GameObject.AddComponent.html , así que:

            GameObject newCopy = (GameObject) Instantiate(objectToClone,
                 new Vector3(objeto_a_clonar.transform.position.x,
                objeto_a_clonar.transform.position.y - objeto_a_clonar.transform.localScale.y * cantidad_replicas, objeto_a_clonar.transform.position.z),
                Quaternion.identity);

           RigidBody rigidBody = newCopy.AddComponent<RigidBody>();
           SpringJoint springJoint = newCopy.AddComponent<SpringJoint>();

           // Y aquí te pegas la paliza de configurar rigidBody y springJoint (sugiero que pruebes en el editor primero).

No sé si hace falta algo más para que funcione tu cuerda de esferas, y tampoco sé si usar esferas unidas por muelles invisibles es la forma de hacer lo que buscas... este tipo tiene un tutorial interesante (él usa cápsulas en lugar de esferas y queda bien), pero tampoco sé si es el "way to go" correcto.

 

Edited by J Montes

Share this post


Link to post
Share on other sites

Me a costado mi esfuerzo, pero finalmente aquí esta el script

 public GameObject objetivo;

    public GameObject objeto_a_clonar;

    public float ofset_entre_cuerdas = 2;

    public GameObject hand;

    void Start()
    {
        objetivo = GameObject.FindGameObjectWithTag("Player");
        
       
        
        float cantidad_direccion_replica = 1f;
        objeto_a_clonar.transform.name = ("tramo") + transform.childCount ;


        Vector3 distancia = objeto_a_clonar.transform.position - objetivo.transform.position;
        float cantidad_replicas = distancia.y / (objeto_a_clonar.transform.localScale.y + ofset_entre_cuerdas);
        cantidad_replicas = Mathf.Floor(cantidad_replicas);


        while (cantidad_replicas > 0)
        {
            var instantiate = Instantiate(objeto_a_clonar, new Vector3(objeto_a_clonar.transform.position.x,
                  objeto_a_clonar.transform.position.y - (objeto_a_clonar.transform.localScale.y + ofset_entre_cuerdas) * cantidad_direccion_replica,
                  objeto_a_clonar.transform.position.z),
                  Quaternion.identity);
            instantiate.transform.parent = this.transform;
            instantiate.transform.name = ("tramo") + transform.childCount;

            instantiate.gameObject.AddComponent(typeof(FixedJoint));

           Transform tramo_cuerda_a_agarrar = gameObject.transform.Find("tramo" + (transform.childCount - 1) );

            Rigidbody tramo_RB = tramo_cuerda_a_agarrar.GetComponent<Rigidbody>();

            FixedJoint this_joint = instantiate.transform.GetComponent<FixedJoint>();

            this_joint.connectedBody = tramo_RB;



            cantidad_direccion_replica += 1;
            cantidad_replicas -= 1;

        }

        Destroy(gameObject.transform.Find("tramo1" ).GetComponent<FixedJoint>());
        gameObject.transform.Find("tramo1" ).GetComponent<Rigidbody>().isKinematic = true;
    }

Es... algo tosco, pero muy robusto, cualquier sugerencia para mejorarlo es bienvenida

Y gracias J Montes por la info :27_sunglasses::91_thumbsup:

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...