Noticias

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

Funcionamiento de bucle

Iniciado por real3dvision, Septiembre 25, 2015, 07:58:49 AM

Tema anterior - Siguiente tema
Buenos días,Soy un novato en esto de Unity, y aunque tengo algo de experiencia en programación lo cierto es que me está costando un poco...A modo de práctica del tema de los bucles, he realizado un script que pretende hacer que un cubo suba durante un tiempo que le indico, baje el tiempo que le marco, y repita eso las veces que yo quiera. Por supuesto no funciona...o al menos no en la manera que me gustaría. Os cuento:- Por un lado echo de menos alguna instrucción que me permita al cumplir la condición final del script salir del modo de ejecución de Unity. Creo recordar que en basic existía el "end".- Por otra parte, mi cubo al que le he metido el script no se mueve. Al ejecutar el script varían las coordenadas del position del transform pero el cubo esta "quieto, parado".-Y por último, no entiendo la lógica de funcionamiento del script. Porque tal como lo he escrito debería ejecutar el procedimiento subir, luego el procedimiento bajar y al volver al void update, repetir esto tres veces. Pero no es eso lo que hace.Si en algo me pudieseis explicar os lo agradecería.Un saludo.using UnityEngine;
using System.Collections;public class Movimiento_Cubo_1_m1 : MonoBehaviour {
    
    private Transform thisTransform;
    public float velocidad=5;    // Use this for initialization
    void Start () 
    {
        thisTransform = transform;    }
    
    // Update is called once per frame
    void Update () {
        {
            for (float contador=0; contador<2;contador++)
            {
                subir();
                bajar();
                Debug.Log ("round"+ contador);
            }        }
    
    }
    void subir(){
        for (float contador1_Cubo_1=0; contador1_Cubo_1 < 1; contador1_Cubo_1+= Time.deltaTime) 
        {
            thisTransform.Translate (Vector3.up * velocidad * Time.deltaTime);            Debug.Log ("subir" + contador1_Cubo_1);
        }    }
    void bajar(){
        for (float contador2_Cubo_1=1;contador2_Cubo_1 > 0;contador2_Cubo_1-= Time.deltaTime)
        {
            thisTransform.Translate (Vector3.down * velocidad * Time.deltaTime);
            Debug.Log ("bajar" + contador2_Cubo_1);
        }
    }
} 

Se que cuando alguien entra en el mundo de Unity quiere ya crear un videojuego, pero hay una serie de conceptos básicos y particulares que si los desconoces de entrada no podrás adaptarte mentalmente a los conceptos que se explican. En parte hay que cambiar la orientación de base que tiene la mayoría de la gente.Empieza por aquí:http://docs.unity3d.com/es/current/Manual/UnityBasics.html" rel="external nofollow">http://docs.unity3d.com/es/current/Manual/UnityBasics.html 

Buenos días,

Muchas gracias por tu consejo. Lo cierto es que ya llevo un tiempo mirando manuales y tutoriales (de hecho, se puede ver que el código tiene pretensiones...je,je). Y por supuesto que no pretendo hacer un videojuego, lo que me sucede es que para ir ganando en conocimientos me pongo ciertos desafíos que combinan conocimientos, y es ahí donde surgen los problemas ya que no hay manuales que te expliquen problemas particulares o de filosofía del funcionamiento, por ejemplo, de un bucle entre procedimientos. Por eso, que si puedes ayudarme en alguna de las dudas....Está claro que no pretendo que se me explique de p a  pa (normalmente no recurro a foros si no llego a un punto en el que estoy atascado) pero si se me pudiese dar alguna pista para poder yo avanzar.

Muchas gracias.


Pues no sé que tutoriales habrás hecho, pero pretendes hacerlo todo en un Update, cuando el update, como bien dice el comentario por defecto se ejecuta una vez por frame.O sea, tienes que pensar en lo que se hace cada frame, no hacerlo todo de golpe. Por eso esos bucles de subir/bajar sobran. Solo con los translate tal como los tienes.Eso sí, piensa que si haces subir y bajar en el mismo frame, pues no se va a mover nada o va a parpadear como un loco. Tendrás que hacer subir y cuando haya unos cuantos, pues bajar.Y si pones Debug.Log en los Updates te va freir el editor (piensa en 1 update x 60 frames x 1 segundo) y tienes unos cuántos.  

De nuevo, te agradezco tu comentario. Es verdad que a veces no es fácil filtrar unos buenos tutoriales.Los debug.log los he metido para comprobar como funcionan los contadores durante la ejecución del bucle.He hecho la prueba de cargarme los bucles, pero no logré nada. Creo que el problema es que la ejecución es tan rápida dentro del frame que no se aprecia. Poruq esi anulo uno de los translate el otro funciona. y el cubo se desplaza.Entonces llegamos al problema, sé que el void update está pensado para realizarse cada frame, el tema es como hago un bucle que se ejecute independientemente en cada frame, o por ejemplo cada 10 frames por decir algo. O lo que tu dices de no hacer subir y bajar en el mismo frame.Muchas gracias. 

No te tomes a mal la pregunta, te aseguro que es una pregunta tan seria como el propio tema, pero ... en serio dices que llevas tiempo mirando manuales y tutoriales, y que para ir ganando en conocimientos te pones ciertos desafios que combinan conocimientos ???? jajajajajajajajajajajajavale, tengo que confesar que es mas seria mi pregunta que el propio tema xDDD dices que te desafias a ti mismo para adquirir conocimientos, y no quieres crear un videojuego ... pero creas un tema que se titula "Funcionamiento de bucle" y pides que te ayuden con bucles entre procedimientos porque no hay manuales que te expliquen problemas particulares o de filosofia del funcionamiento jajajajajajajajajajajajahay que agradecerle a @iRobb que te deje un enlace de por donde empezar, es una ayuda; pero si aceptas otros enlaces de ayuda, yo te diria los siguientes :http://www.elguille.info/NET/cursoCSharpErik/index.htm" rel="external nofollow">http://www.elguille.info/NET/cursoCSharpErik/index.htmhttp://www.csharpya.com.ar/" rel="external nofollow">http://www.csharpya.com.ar/y solo son dos escogidos al azar de la primera pagina de resultados con nuestro amigo google, pero si esos dos no te acaban de gustar puedes escoger entre las miles de paginas de internet. lo que tienen en comun esas dos paginas es que no veras nada de unity, pero al menos aprenderas una base de programacion y no diras cosas como "bucles entre procedimientos ! socorro ! no existen manuales para problemas especificos !"es perfecto querer ponerse desafios, buena filosofia para aprender ... pero que tal el primer desafio que te pusieras es aprender lo mas basico de la programacion ? de lo contrario es como querer empezar la casa por el tejado (no tendras ni casa ni tejado). y cuando sepas lo basico de la programacion veras que no necesitas un manual que te explique problemas particulares ... al menos no algo taaaaaaan basico como bucles.
Cita de: real3dvision date=1443186078" data-ipsquote="" data-cite="real3dvision" class="ipsQuoteCreo que el problema es que la ejecución es tan rápida dentro del frame que no se aprecia. Poruq esi anulo uno de los translate el otro funciona. y el cubo se desplaza.Entonces llegamos al problema, sé que el void update está pensado para realizarse cada frame, el tema es como hago un bucle que se ejecute independientemente en cada frame, o por ejemplo cada 10 frames por decir algo. O lo que tu dices de no hacer subir y bajar en el mismo frame.Muchas gracias.
Crees que el problema es que la ejecucion es tan rapida dentro del frame que no se aprecia ? mmm no esta mal que lo creas, es cierto, pero lo dices como si fuera una conclusion tuya, algo a lo que hayas llegado gracias a uno de tus desafios y retos personales de los que te pones. eso ... o que te lo ha dicho antes @iRobb y simplemente aceptas sin mas (bien que haces, porque es cierto).De buen rollo te lo digo, despues tu puedes hacer lo que quieras ... aprende (y por aprender no significa solo leer, si no entender y practicar) un poco de programacion basica, con los dos links que te he puesto vas sobrado de entrada, y despues veras que lo que quieres hacer es una chooooooorrada

Septiembre 25, 2015, 07:19:30 PM #6 Ultima modificación: Septiembre 25, 2015, 07:55:40 PM por Oak Human Flesh
[quote author=real3dvision" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="26410" data-ipsquote-contentcommentid="113513">De nuevo, te agradezco tu comentario. Es verdad que a veces no es fácil filtrar unos buenos tutoriales.Los debug.log los he metido para comprobar como funcionan los contadores durante la ejecución del bucle.He hecho la prueba de cargarme los bucles, pero no logré nada.Las Instrucciones que se pueden aplicar para corrección de tiempo de los cálculos en la función Update son por ejemplo estas:

Bye Bye



Septiembre 25, 2015, 08:02:20 PM #7 Ultima modificación: Septiembre 25, 2015, 08:09:59 PM por Oak Human Flesh
Como pedir?  Por cierto podrías usar las herramientas del foro para pegar código?. .. esto debido a que nos ahorras tiempo a los que usamos teléfonos o tabletas para informarnos de temas interesantes. 

Bye Bye



Septiembre 25, 2015, 09:36:41 PM #8 Ultima modificación: Septiembre 25, 2015, 09:40:01 PM por real3dvision
Queee loooocoo Por cierto podrías usar las herramientas del foro para pegar código?. .. esto debido a que nos ahorras tiempo a los que usamos teléfonos o tabletas para informarnos de temas interesantes. [/quote]Inserté el código como imagen, la próxima vez lo haré usando lo del icono "source".Aprendiendo...Un saludo y de nuevo muchas gracias.

No es necesario que uses el el botón de fuente,  hay un boton llamado code <>Ve este linkComo incluir código correctamente 

Bye Bye



[quote author=Arthure date=1443189705" data-ipsquote="" data-cite="Arthure" class="ipsQuote">No te tomes a mal la pregunta, te aseguro que es una pregunta tan seria como el propio tema, pero ... en serio dices que llevas tiempo mirando manuales y tutoriales, y que para ir ganando en conocimientos te pones ciertos desafios que combinan conocimientos ???? jajajajajajajajajajajajavale, tengo que confesar que es mas seria mi pregunta que el propio tema xDDD dices que te desafias a ti mismo para adquirir conocimientos, y no quieres crear un videojuego ... pero creas un tema que se titula "Funcionamiento de bucle" y pides que te ayuden con bucles entre procedimientos porque no hay manuales que te expliquen problemas particulares o de filosofia del funcionamiento jajajajajajajajajajajajahay que agradecerle a @iRobb que te deje un enlace de por donde empezar, es una ayuda; pero si aceptas otros enlaces de ayuda, yo te diria los siguientes :http://www.elguille.info/NET/cursoCSharpErik/index.htm">http://www.elguille.info/NET/cursoCSharpErik/index.htmhttp://www.csharpya.com.ar/]http://www.csharpya.com.ar/y solo son dos escogidos al azar de la primera pagina de resultados con nuestro amigo google, pero si esos dos no te acaban de gustar puedes escoger entre las miles de paginas de internet. lo que tienen en comun esas dos paginas es que no veras nada de unity, pero al menos aprenderas una base de programacion y no diras cosas como "bucles entre procedimientos ! socorro ! no existen manuales para problemas especificos !"es perfecto querer ponerse desafios, buena filosofia para aprender ... pero que tal el primer desafio que te pusieras es aprender lo mas basico de la programacion ? de lo contrario es como querer empezar la casa por el tejado (no tendras ni casa ni tejado). y cuando sepas lo basico de la programacion veras que no necesitas un manual que te explique problemas particulares ... al menos no algo taaaaaaan basico como bucles.Crees que el problema es que la ejecucion es tan rapida dentro del frame que no se aprecia ? mmm no esta mal que lo creas, es cierto, pero lo dices como si fuera una conclusion tuya, algo a lo que hayas llegado gracias a uno de tus desafios y retos personales de los que te pones. eso ... o que te lo ha dicho antes @iRobb y simplemente aceptas sin mas (bien que haces, porque es cierto).De buen rollo te lo digo, despues tu puedes hacer lo que quieras ... aprende (y por aprender no significa solo leer, si no entender y practicar) un poco de programacion basica, con los dos links que te he puesto vas sobrado de entrada, y despues veras que lo que quieres hacer es una chooooooorrada[/quote]Hola,Te agradezco los links , al igual que he agradecido los de @iRobb. El de el guille ya lo tenía controlado, y fue por donde empecé. Lo que sucede es que aprender así me resulta un poco "árido", mientras que irlo acompañando con Unity lo hace más digerible. El otro no lo conocía, y te aseguro, que le echaré un buen vistazo.En cuanto a lo demás, y te lo digo de buen rollo, es una lástima que en vez de usar toda esa verborrea para burlarte de mi y de mis dudas no la hubieras usado para demostrarme educadamente como lo harías tú... a alguien que sabe lo que tú sabes de programación no le costaría nada escribir una docena de  líneas de código para algo tan sencillo.Por otra parte, por un lado me dices que estoy empezando la casa por el tejado pero también que lo que planteo es algo básico, no sé aclarate...creo que el problema no es entender los bucles (de hecho, en mi script es lo único que funciona) sino como actuan según su lugar dentro del script.En cuanto a lo de mis "desafíos y retos personales", comprendo que para él que seguro desarrollo en una noche de insomnio la saga Assasin Creed sea dificil de valorar lo que supone pasarse unas buenas horas para hacer que un cubo se mueva arriba y abajo. Pero en fin eso va con cada persona...Una disculpa por usar los términos mal...es lo que tiene ser un pobre ignorante.Y por último decirte que cuando juzgues los conocimientos de alguien, no lo hagas en función a lo que no sabe sino a lo que ya ha aprendido.De cualquier manera muchas gracias.

Septiembre 25, 2015, 10:33:17 PM #11 Ultima modificación: Septiembre 25, 2015, 10:36:00 PM por Oak Human Flesh
Básicamente en cada momento que se hace un frame, debes Entregar instrucciones para calcular en tu caso una posición a la vez.Entonces, puedes modificar tu script para lograr que se mueva un tiempo determinado hacia arriba y otro tiempo hacia abajo, en cada uno de esos tiempos pasaran muchos frames (según la cantidad de frames por segundo de que haya sido capaz de ejecutar tu máquina). Por ejemplo si son 60FPS, la función Update se leyó 60 veces en un segundo y se crearon 60 imágenes con sus cálculos. En cada imagen un valor, por lo tanto al cálculo final en cada frame debes indicar un valor distinto de 0 para trasladar el objeto en algun eje, ya sea en distancia/frame o en distancia/tiempo.
Hacer uso de un temporizador no sería malo (como para efectuar el cambio entre tiempo para arriba y otro tiempo para abajo).
Por cierto el bucle se va ajecutar por completo en un frame, mientras mas bucles pongas dentro del Update, más tiempo se demorará en crearse la información requerida para ese frame, resultando en una demora para el render y un desastre al quere jugar.No se ha establecido un límite, esto es por que es variable y debe ser evaluado cada vez según las capacidades de cada máquina donde se pretende que corra el juego.
Los bucles deben ser muy bien pensados ya sea en programación o en nuestra vida o para defenderla.Bucle OODA

Bye Bye



A estas alturas tal vez esto ya esté sobrado, pero ahí vaSi pongo un bucle dentro de otro bucle, cual bucle termina su trabajo primero?Antes de salir del fin del primer bucle, obviamente debe haber terminado el bucle interno.Luego imaginar una malla de un objeto 3d en donde las ubicacines de sus vértices deben ser procesadas usando este método no esta mal.En palabras podría ser algo así,  por cada vértice asignar un valor a su eje x otro para el eje y, y otro para el eje z.Bucles dentro de otros con un resultado. .. la posición del vértice en sus tres ejes en un frame.Luego la malla si está compuesta por n vértices, entonces, para poder dibujarla en un frame se deben calcular todas las posiciones de cada uno de sus vértices, antes de que pase el frame, de ahi es muy usable un bucle dentro de otro, pero si la malla contiene demasiados poligonos crash, la capacidad del render es superada, entonces o no se ven o se queda esperando a que se calcule toda la malla.

Bye Bye



Hola,Te agradezco los links , al igual que he agradecido los de @iRobb. El de el guille ya lo tenía controlado, y fue por donde empecé. Lo que sucede es que aprender así me resulta un poco "árido", mientras que irlo acompañando con Unity lo hace más digerible. El otro no lo conocía, y te aseguro, que le echaré un buen vistazo.En cuanto a lo demás, y te lo digo de buen rollo, es una lástima que en vez de usar toda esa verborrea para burlarte de mi y de mis dudas no la hubieras usado para demostrarme educadamente como lo harías tú... a alguien que sabe lo que tú sabes de programación no le costaría nada escribir una docena de  líneas de código para algo tan sencillo.Por otra parte, por un lado me dices que estoy empezando la casa por el tejado pero también que lo que planteo es algo básico, no sé aclarate...creo que el problema no es entender los bucles (de hecho, en mi script es lo único que funciona) sino como actuan según su lugar dentro del script.En cuanto a lo de mis "desafíos y retos personales", comprendo que para él que seguro desarrollo en una noche de insomnio la saga Assasin Creed sea dificil de valorar lo que supone pasarse unas buenas horas para hacer que un cubo se mueva arriba y abajo. Pero en fin eso va con cada persona...Una disculpa por usar los términos mal...es lo que tiene ser un pobre ignorante.Y por último decirte que cuando juzgues los conocimientos de alguien, no lo hagas en función a lo que no sabe sino a lo que ya ha aprendido.De cualquier manera muchas gracias.[/quote]para una vez que intento ayudar ... jajajajajalo unico que te dije es que aprendieras programacion basica antes de quererte programar en unity, y por basica se entiende cosas tan "tontas" pero necesarias como condicionales, bucles (esas dos cosas son lo primero que te enseñan en cualquier manual, academia o instituto) ... mucha gente puede criticar mis maneras, pero toda la gente te dira, o al menos pensara, lo mismo que yo te estoy diciendo.incluso te he buscado dos paginas para empezar, y aun dices que no me costaria ayudarte ... pues chico, ya te he ayudado bastante; otra cosa es que para ti, que alguien te de referencias de paginas por donde empezar no sea suficiente y asocies la ayuda exclusivamente a que alguien te escriba codigo (creo que lo tienes jodido asi).por otra parte, tal vez no me costaria nada escribir una docena de lineas chapuceras ... pero me rio si crees que eso te serviria de ayuda, y aunque no me costara no veo la razon de molestarme cuando tu eres el primer interesado y no te molestas en aprender minimo una base.entiendo que es mas pesado estudiar programacion basica, incluso aburrido si quieres decirlo asi, y unity es mas entretenido e incluso emocionante porque puedes ver un cuadro moverse ... bueno, en tu caso no lo ves moverse porque no te has molestado antes en aprender minimamente una base de programacion (a eso me referia con empezar la casa por el tejado)como tu dices, me acostumbrare a juzgar segun lo que haya aprendido una persona y no en funcion a lo que no sabe; con frases  como "lo dificil no es entender los bucles sino como actuan segun su lugar dentro del script" ya das a entender lo mucho que has aprendido ... por cierto, los conceptos basicos de programacion (como son los bucles) funcionan exactamente igual en unity que en linea de comandos, igual que en C# o javapero mucha suerte con tu aprendizaje, me gusta tu metodologia; supongo que no hubiera hecho falta molestarme en buscar y linkearte un par de paginas porque esos conceptos los tienes mas que asimilados.

[quote author=Oak Human Flesh" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="26410" data-ipsquote-contentcommentid="113658 date=1443217594]A estas alturas tal vez esto ya esté sobrado, pero ahí vaSi pongo un bucle dentro de otro bucle, cual bucle termina su trabajo primero?Antes de salir del fin del primer bucle, obviamente debe haber terminado el bucle interno.Luego imaginar una malla de un objeto 3d en donde las ubicacines de sus vértices deben ser procesadas usando este método no esta mal.En palabras podría ser algo así,  por cada vértice asignar un valor a su eje x otro para el eje y, y otro para el eje z.Bucles dentro de otros con un resultado. .. la posición del vértice en sus tres ejes en un frame.Luego la malla si está compuesta por n vértices, entonces, para poder dibujarla en un frame se deben calcular todas las posiciones de cada uno de sus vértices, antes de que pase el frame, de ahi es muy usable un bucle dentro de otro, pero si la malla contiene demasiados poligonos crash, la capacidad del render es superada, entonces o no se ven o se queda esperando a que se calcule toda la malla.[/quote]De nuevo te agradezco tus comentarios. Los leo con detenimiento y a ver si en no mucho tiempo puedo decirte un eureka!!Un saludo. 

Etiquetas: