Noticias

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

Duda movimiento de cámara

Iniciado por RakelPi314, Abril 09, 2016, 02:55:02 PM

Tema anterior - Siguiente tema
Abril 09, 2016, 02:55:02 PM Ultima modificación: Abril 10, 2016, 11:35:28 AM por pioj
Hola! alguien me puede ayudar con un problemilla de novata que  me esta volviendo loca?La idea es poner un muñeco de zbrush que estoy haciendo y con botones en la UI mover la cámara en distintas posiciones, cabeza, torso etc. y  así poder ver las partes con zoom , cuando llegue cerca sacar un panel de UI tipo PopUp con imágenes de las técnicas que uso para cada parte y cosas así simples. Tengo casi todo echo menos lo de que se mueva suave con el Lerp entre posiciones.Cuando llamo a la función PosicionCabeza() desde un botón, solo avanza un poquito,  no consigo entender la forma de que llegue al destino sin usar el método Update , no se si es que soy tonta o es que es muy difícil : ( , entiendo por lógica que debería ir al Update, pero no consigo entender como, estoy empezando con c#  y es un infierno, :****(Antes que nada quiero agradecer cualquier ayuda, ya que entiendo que es tiempo y el tiempo es muy valioso, ya me he apuntado a unos cursos de Edx, me he comprado 1 libro, y ahora estaba mirando de comprar un curso de Udemy que parece muy bueno, pero al final llegue a la conclusión que tenía que haber una comunidad española o de habla hispana de Unity 3D y antes de gastarme mas dinero, que no tengo necesitaba consejo de gente que ya supiera del tema, y por desgracia no conozco a nadie, si alguien puede recomendarme alguna forma de aprender mejor o mas rápido lo agradecería muchísimo también.Gracias y Paz!
//Este Script lo tengo a la cámara.
 public float velocidadCamara;
 public Transform objetoPosicionCabeza;          //aqui pongo un emptyObject (objetoPosicionCabeza) solo para marcar la posición de donde se moverá la cámara
   
public void PosicionCabeza ()
{
        transform.position = Vector3.Lerp(this.transform.position, objetoPosicionCabeza.position,  Time.deltaTime * velocidadCamara); // Pensaba que la cámara se movería todo el trayecto del punto A al B con suavidad...  
    }
 

Se mueve sólo un poco porque sólo llamas la función una vez y necesitas llamarla tantas veces como sea necesario hasta que llegue a la posición deseada, puedes o usar la función en Update o usar corrutinas, te recomiendo usar corrutinas porque lo llamas desde un botón y no vas a tener el problema de múltiples llamadas a la corrutina, en la documentación sale un ejemplo muy bueno, busca corrutinas unity y empieza por ahí.

Muchísimas gracias Juanma,ahora ya se por donde seguir, al final anoche llegue a la conclusión de que tenia que crear un bucle while moviendo la cámara hasta que llegara a la posición deseada,pero me perdí en mis pensamientos, y decidí abordarlo esta mañana con energía y moral renovada, se puede llamar a la corrutinas como si fuera una función publica? me cuesta mucho entender estas cosas.Sin usar corrutinas como sería en el Update? no consigo entender la lógica de como mover la cámara distintas posiciones dentro del Update, pero por lo que me has dicho voy a estudiarme las corrutinas entender que hacen y entender como aplicarlas.Gracias por la ayuda. 

Hola,No me voy a meter con las corrutinas, dado que aún soy principiante y no las domino.El Update si que se lo suficiente para responderte. La opción Update es llamada a cada Frame, por lo que el código será llamado a cada Frame y no necesitas ningún bucle. Al ejecutar el Time.deltaTime, lo que haces es calcular el tiempo pasado desde el último Frame y calcular la posición de la cámara según el tiempo transcurrido.Así pues con colocar el código en el Update, tendrías suficiente, ya se encarga el sistema de llamarlo y el Time.deltaTime * velocidadCamara de regular su velocidad para que sea constante y no realice saltos por las diferencias de fps.

Debes estudiar la API de Unity antes que nada, porque así sabrías la funcionalidad de la funcion Update() que se ejecuta cada frame.
Por lo cual tú código funcionaria si estaría dentró de la misma,  por ende modificaria el Time.deltaTime para mover tu plataforma.
Una vez que entiendas esto pasa a las courotinas.

Como ya te han dicho la función Update es llamada cada vez, entonces con poner la función PosicionCabeza dentro del Update ya valdría, luego verás que no basta con eso, tienes que tener algo (un booleano por ejemplo) que controle cuándo se tiene que ejecutar esta función, también verás que siempre que se mueve la cámara el código es parecido, un Lerp pero cambia la posición final, entonces yo lo que haría es:Botón -> bool movimientoCamaraActivo = true -> fijar objetivo (objetoPosicionCabeza) -> Lerp hasta objetivo -> Cuando llegue o esté muy cerca el bool = false.Lo de fijar objetivo y poner el bool en true lo haría en una función que llamaría desde el botón, el resto en el Update.

Abril 10, 2016, 01:23:48 PM #6 Ultima modificación: Abril 10, 2016, 02:10:57 PM por RakelPi314
[quote author=Tizon" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="35603" data-ipsquote-contentcommentid="129405 date=1460276282] Gracias! [/quote]

Hola  creo que ya lo entiendo todo, al menos la lógica.Ahora voy a intentar pasar esto a código que creo que se como se hace, muchísimas gracias a todos por vuestro tiempo y paciencia :D, algún libro / curso que recomendarme? me cuesta mucho plantear problemas como ese y tal vez haciendo ejercicios o simplemente con estudiar la API de Unity 3D como me han comentado avanzaría mas rápido, y podría aprender de una forma mas ordenada, de todas formas vuelvo a insistir en agradeceros vuestro tiempo, esfuerzo y conocimientos.Saludos!

Etiquetas: