Noticias

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

Temas recientes

unir joints con rigidbodys

Iniciado por nomoregames, Enero 08, 2020, 03:20:57 PM

Tema anterior - Siguiente tema
Enero 08, 2020, 03:20:57 PM Ultima modificación: Enero 09, 2020, 10:47:17 AM por nomoregames
Hola a todos, tengo una duda y espero que me ayudéis a resolverla .
 
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 

Enero 09, 2020, 11:09:03 PM #1 Ultima modificación: Enero 09, 2020, 11:11:10 PM por J Montes
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.
 
 

Enero 10, 2020, 05:38:49 PM #2 Ultima modificación: Enero 10, 2020, 05:39:51 PM por nomoregames
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 

Etiquetas: