Noticias

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

sencilla serpiente de bolas

Iniciado por Igor, Octubre 26, 2017, 08:20:02 PM

Tema anterior - Siguiente tema
quiero hacer un especie de gusano/serpiente hecho de esferas, ...sencillo, no? 
 
imaginense 40 esferas seguidas
 
la primera esfera(la cabeza) avanza y va girando cuando le apetece.... 
 
cual piensan que es la mejor manera de hacer que el resto de las esferas le sigan en fila por el mismo camino que a tomado la primera(la cabeza), simulando una serpiente al estilo del clasico juego del nokia, jeje, pero en tresD y con movimiento suave...
 
hacer un lerp de la posicion no crea el efecto deseado.... puesto que se pierde la "curva" original que ha hecho la cabeza al ir avanzando y girando.... he pensado en ir almacenando todas las posicion de la cabeza en el tiempo, y usarlas para "colocar" luego las otras bolas... 
 
pero entonces podria pasar que los deltaTimes de la "grabacion" no sean los "actuales" osea que las posiciones del resto de las esferas iria como dessincronizada, como con "tirones" o a golpes...
 
consejos???
 
que me estoy perdiendo?

asi deberia funcionar, de pronto te falta algo en el codigo, se puede ver?

El patron de movimiento que describes se logra en programas 3D con spline IK, hasta donde se unity no soporta spline IK PERO si se pueden configurar IK tools en unity y por ende se deberia poder configurar un spline IK (si investigas bastante).
 
 

no, estaba bien, sorry, lo de que daba tirones era porque soy tonto ...habia que ponerlo en fixedUpdate 
 
ya va bien, era para hacer un boss para el juego 
 
hola, gracias @juguefre ya lo he solucionado

Cita de: Igor date=1509042002cual piensan que es la mejor manera de hacer que el resto de las esferas le sigan en fila por el mismo camino que a tomado la primera(la cabeza), simulando una serpiente al estilo del clasico juego del nokia, jeje, pero en tresD y con movimiento suave...
   


Como ya lo solucionaste(estaba escribiendo y no me di cuenta) subo aquí mi "idea/consulta", a ver, se podría haber realizado así?:
 
En todo momento la esfera "n - 1" siga en dirección a la esfera "n", si querés suavizarlo podés jugar con un slerp (casi necesario para lo que querés), dependiendo del t podés modificar la dirección (entre anterior y nueva de cada esfera), un t=1 te dará un movimiento mucho mas "directo", un t cercano a cero será un movimiento mucho mas fiel al camino original, a cambio de perder velocidad. La cuestión es jugar con este parámetro.
 
Una imagen vale más:

haiba!! que no habia visto tu resouesta @lightbug
 
 
 
lo solucione guardando las posiciones eln el tiempo.....
 
con un monton de Vector3
 
 
 
asi:
 
 
 

using UnityEngine;
using System.Collections;
public class bossWorm : MonoBehaviour {
public GameObject spher;

private GameObject[] spheres;
private Vector3[] positions;
private int timeIndex = 0;

private float rotX = 0f;
private float newRotX = 0f;
private float rotY = 0f;
private float newRotY = 0f;

private float timeRelease = 0f;
private float speed = 140f;



// Use this for initialization
void Start () {
   spheres = new GameObject[40];
   for (int i = 1; i < 40; i++) {
      spheres = (GameObject)Instantiate(spher,transform.position, transform.rotation);
      spheres.transform.parent = transform;
   }
   spheres[0] = spher;
      
   positions = new Vector3[800];
   for (int i = 0; i < 800; i++) {
      positions = transform.position;
   }
   
}


// Update is called once per frame
void FixedUpdate () {
   
   
   positions[timeIndex] = transform.position;
   timeIndex++;
   if (timeIndex>799) {
      timeIndex -= 800;
   }
   timeRelease -= Time.deltaTime;
   if (timeRelease < 0) {
      timeRelease = Random.Range(0.5f,3f);
      newRotX = Random.Range(-30,30);
      newRotY = Random.Range(-30,30);
      
   }
   if (transform.position.y < -200) {
      newRotX = -45;
   }
   if (transform.position.y > 200) {
      newRotX = 45;
   }
   rotX = ((rotX * 9)+newRotX)*0.1f;
   rotY = ((rotY * 9)+newRotY)*0.1f;
   
   
   transform.position += transform.forward * speed * Time.deltaTime;
   float angX = transform.eulerAngles.x + (rotX * Time.deltaTime);
   if (angX < 180) {   
      if (angX > 50) {
         angX = 50;
      }
      if (angX < -50) {
         angX = -50;
      }
   } else {
      if (angX < 310) {
         angX = 310;
      }
   }
   float angY = transform.eulerAngles.y + (rotY * Time.deltaTime);
   transform.eulerAngles = new Vector3(angX, angY, 0f);
   
   
   
   
   for (int i = 1; i < 40; i++) {
      int val = timeIndex - (i*20);
      if (val<0) {
         val += 800;
      }
   
      spheres.transform.position = positions[val];
      spheres.transform.LookAt(spheres[i-1].transform.position);
   }
   
}

}

 
 
 
como usarlo:
 
crear un empty GameObject:
 
crear un Sphere (creo que era de diametro 40, nose, probar, y tambien con la variable speed)
 
meter el Sphere dentro del Empty
 
añadir al Empty este script
 
añadir la Sfera al script...
 
 

Octubre 28, 2017, 01:02:23 PM #6 Ultima modificación: Octubre 29, 2017, 02:20:34 AM por lightbug
Ah ok, igual como me quedaron mis dudas me puse a implementarlo hace unos momentos, está probablemente lejos de ser ideal para un juego estilo "viboritas" pero el movimiento funcionó como lo predije, si modificas el "t" y lo bajas respeta mucho más el camino pero te descontrola todo, con un T grande empieza a tomar atajos, aquí el código:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class viborita : MonoBehaviour {
public float m_speed = 10;
public float m_space = 1;
public int m_bodyCount = 5;
[Range(0.1f,0.9f)]
public float m_t = 0.5f;
 
public class Body
{
   public Vector3 m_dir;
   public Transform m_transform = null;
}
 
List<Body> m_bodyList = new List<Body>();
Transform m_headTransform;
void Awake () {
   
   GameObject head = GameObject.CreatePrimitive (PrimitiveType.Sphere);
   m_headTransform = head.transform;
   m_headTransform.position = transform.position;
   for (int i = 0; i < m_bodyCount + 1; i++) {
      
      GameObject newBodyObj = GameObject.CreatePrimitive (PrimitiveType.Sphere); //new GameObject ("Body" + i);
      newBodyObj.transform.position = transform.position - Vector3.up * m_space * i;
      Body newBody = new Body ();
      newBody.m_transform = newBodyObj.transform;
      newBody.m_dir = Vector3.up;
      m_bodyList.Add (newBody);
   }
}

void Update () {
   bool input = Input.GetAxisRaw ("Vertical")!= 0 || Input.GetAxisRaw ("Horizontal")!= 0;
   m_headTransform.position += (Vector3.up * Input.GetAxisRaw ("Vertical") + Vector3.right * Input.GetAxisRaw ("Horizontal")).normalized * m_speed * Time.deltaTime;
 
   for (int i = 0; i < m_bodyList.Count; i++) {
      
      Vector3 dir;
      if (i == 0) {
         dir = m_headTransform.position - m_bodyList .m_transform.position;
      else
         dir = m_bodyList [i - 1].m_transform.position - m_bodyList .m_transform.position;            
      
      
            m_bodyList .m_dir = Vector3.Lerp (m_bodyList .m_dir, dir, m_t);
     
      if (input)
         m_bodyList .m_transform.position += m_bodyList .m_dir * m_speed * Time.deltaTime;
      
   }
}
}

 

 
Si querés probarlo se lo pones a un GameObject vacío delante de una camara y listo (se mueve en up y right). Si le pones el "space" en cero se juntan todas las esferas.

wow, jeje, te quedo muy chulo y sin necesidad de guardar 800 Vectores...., jeje
no se me habia ocurrido hacer lerp de las direcciones en vez de de las posiciones....

Cita de: Igor date=1509190544wow, jeje, te quedo muy chulo y sin necesidad de guardar 800 Vectores...., jeje
   
   
      no se me habia ocurrido hacer lerp de las direcciones en vez de de las posiciones....
   


Jaja, si reemplazas el ".+= transform.position...."  por una velocity o una fuerza queda bien si fuera rigidbody dinámico.
 
Olvidé normalizar los vectores, ahí lo corregí.
 
Aca te dejo un build bien enchulada con un slider super sexy -->   Build bien enchulada

Cita de: lightbug date=1509238111Aca te dejo un build bien enchulada con un slider super sexy -->   Build bien enchulada
   


no me funciona....
 
sera por mi windows XP ?
 
 

Cita de: Igor date=1509271187no me funciona....
   
   
      sera por mi windows XP ?
   
   
       
   


Tenés XP?!! ojala no te ande nada, por rata jajaja ... la verdad ni idea, acá funciona bien.

Cita de: lightbug date=1509281993Tenés XP?!! ojala no te ande nada, por rata jajaja ... la verdad ni idea, acá funciona bien.
   


jejeje, si, jeje, ...tranquilo.... para poder ayudar mejor a un par de personas de este foro con las que colaboro, y por miedo a que me "troleeis" (bulling) mucho(jeje)  .... tenia pensado pasarme a windows7.... mañana mismo iba a iniciar el proceso....
 
Podre ponerme Unity 5
 
Yuju! jeje
 
ah! la serpiente era en realidad un gusano gigante de arena... para una escena de "desierto" en mi juego de naves(en seccion proyectos), ...un gusano como los que salen en las novelas "Dune"... y le hice unas particulas muy chulas(y muy low, para equipos(pc) viejos y malos como el mio)para cuando entra o sale del suelo... enseguida hare una actualizacion con algunas cosillas...  ... y podreis ver.... tatatachan!
 
La **** Serpiente de las Bolas!!!
 
jeje

Cita de: lightbug date=1509281993ojala no te ande nada, por rata jajaja
   


AAAAH JAJAJAJAJAJAJAJA y lo mas extraño es que el equipo le aguanta win7 sin cambiarle partes.

Cita de: juguefre date=1510244094AAAAH JAJAJAJAJAJAJAJA y lo mas extraño es que el equipo le aguanta win7 sin cambiarle partes.
   


Jajaj igual cuando yo me pasé no tuve que modificar nada del hardware, en 7 volaba todo, la verdad que me costó pasarme por desconfianza pero fue bueno. Ni hablar de W10, acá arranca más rapido que cualquier distro de linux casi (salvo esas distros hippies)
 
 
 
 

Noviembre 09, 2017, 10:28:00 PM #14 Ultima modificación: Noviembre 09, 2017, 10:39:14 PM por Igor
Cita de: juguefre date=1510244094AAAAH JAJAJAJAJAJAJAJA y lo mas extraño es que el equipo le aguanta win7 sin cambiarle partes.
   


jejeje
 
acabo de completar la instalacion...
 
w7 funcionando....
 
...ahora falta todo lo demas...
 
...pero estoy por comprar otro PC porque este no tira ni cuesta abajo.... me parece que los telefonos moviles se rien de la potencia de mi pc... 

Etiquetas: