Jump to content

Pere

Registrados
  • Content Count

    128
  • Joined

  • Last visited

  • Days Won

    23

Pere last won the day on November 9 2020

Pere had the most liked content!

Community Reputation

96 Excellent

1 Follower

About Pere

  • Rank
    Asiduo

Profile Information

  • Especialidad
    Coder

Recent Profile Visitors

1,084 profile views
  1. Bueno, Después del curso de Introducción a los ML-Agents: He empezado otro que trata temas más en profundidad, pero no me atrevo a llamar avanzado. No tan solo intentare tocar cosas nuevas sinó tocar mas en profundidad algunas de las vistas en el curso de iniciación, como la configuración del fichero .yaml y su importancia. Por ahora cuenta tan solo con lecciones: La importancia del fichero .yaml. En este explico como afectan las modificaciones del fichero de configuración al proceso de aprendizaje de los ML-Agents, intentado explicar para que se usa cada uno de los parámetros del fichero, pero dando más una explicación practica, que teórica, aunque sin dejar todo del lado esta segunda. La intención ha sido coger un proyecto sencillo y modificar el proceso de aprendizaje usando tan solo la configuración de este fichero, sin modificar el script o los permisos / castigos que recibe el agente. Usando Imitation Learning en un proyecto sencillo. Con el mismo proyecto, con un fichero .yaml ya optimizado en el apartado anterior, vemos cómo afecta el uso de Imitation Learning en el proceso de aprendizaje. Se da una explicación de lo que es el Imitation Learning y se explica cómo usarlo, crear los ficheros .demo y modificar de nuevo el .yaml para que acepte los ficheros creados como entrada. No todas las lecciones van a tener vídeo, y posiblemente la explicación de texto sea bastante más importante que en el primer curso. El primer vídeo es el que acompaña a la lección de Imitatión Learning: El proyecto esta disponible en la página del curso: https://cursos.uadla.com/curso/curso-intermedio-de-ml-agents/lecciones/imitation-learning/ No creo que consiga un ritmo de publicación de lecciones muy grande, ya que cada tema lleva mucho tiempo. Cada modificación del script, de los premios, del fichero .yaml necesita de un proceso de aprendizaje para ver como afectan las modificaciones, algunos se pueden descartar en los primeros minutos, pero otros necesitan de un tiempo de ejecución nada despreciable. Para crear estas dos lecciones habré ejecutado entre 100 y 150 procesos de aprendizaje, que posiblemente sumen más de 80 horas, tan solo para poder ver cómo cuadrar la teoría con la practica. Los ML-Agents son un mundo que esta casi más cerca del Machine Learning que del desarrollo de juegos, pero creo que ya podemos usarlo para crear NPC's que aparezcan en nuestros juegos.... o bueno, en vuestros juego, por que yo si estudio y hago vídeos no hago juegos 😞
  2. Pere

    Curso de MLAgents

    Bueno.... empiezo con el curso intermedio de ML-Agents https://cursos.uadla.com/curso/curso-intermedio-de-ml-agents/lecciones/la-importancia-del-fichero-yaml/ Esta vez sin vídeo, destripando el fichero de configuración .yaml. Vemos como con el mismo código y tan solo variando los parámetros del motor de Machine Learning obtenemos curvas de aprendizaje totalmente diferentes, y como cada curva aunque parezca que obtienen un mismo resultado, producen agentes que son igual de efectivos, pero que actúan de formas muy diferentes.
  3. Pere

    Curso de MLAgents

    Hola, He incoporado un vídeo nuevo a la serie. En este entreno dos agentes a la misma vez, el segundo agente tienen unas pequeñas modificaciones que hacen que se dedique a empujar y molestar al player. Es decir, no tan solo intenta llegar al premio, sino que tambien intenta impedirle al player llegar. Me ha sido mucho mas facil entrenar a un segundo agente que crear la logica de programación de un NPC que se dedicase a lo mismo. Empiezo a verle cosilla a esto de los MLAgents.
  4. Pere

    Curso de MLAgents

    Muchísimas gracias a ti! Seguiste el curso por la web? O YouTube?
  5. Pere

    Curso de MLAgents

    Dura un poquitín menos 🙂 La verdad es són 9 vídeo de menos de 10 minutos.... osea que no llega a las dos horas de contenidp, y si se quiere seguir los proyectos y crear los ejemplos yo creo que en un dia se puede hacer el curso entero.... o bueno, eso he intentado.
  6. Pere

    Curso de MLAgents

    Hola, he creado un pequeño curso de introducción a los MLAgents. En total son nueve vídeos, donde se crean dos proyectos y un minijuego. El primer proyecto es muy sencillo, para no perder tiempo en nada que no sea el funcionamiento / configuración de MLAgents. Como seguir estas cosas por las listas de reproducción de youtube se me hacen complicadas me he liado la manta a la cabeza y he creado una pequeña WEB donde se puede seguir el curso, como si de una academia online se tratara, y acceder a los scripts y ficheros necesarios. La URL del curso es: https://cursos.uadla.com/curso/introduccion-al-machine-learning-con-ml-agents-para-unity/ Si alguien lo sigue por aquí, por favor, que me comente si el sistema funciona correctamente y es como de de usar. Os dejo también el vídeo de presentación: Espero que os guste, la verdad es que es un tema que me ha gustado de siempre, espero tener tiempo para ir haciendo cursos para tratarlo en más detalle y con entornos más complejos. También hay que tener en cuenta que ahora los MLAgents empiezan a estar mas o menos maduros, y sí que veo que empiezan a ser una forma de entrenar NPC's que podemos usar en nuestros juegos.
  7. Hola Chime! Veo que estas empezando el canal, pero que videos mas buenos! De verdad, muy bien hechos, me encanta la edición. Me acabo de suscribir 🙂 i a esperar que vayas creando contenido!
  8. eiiii zeetlabs, justamente tengo un tutorial de como hacer un infinite runner, y en el segundo vídeo lo explico. Te lo intento explicar un poco aqui también: He creado un array de Vector2, como variable de la clase, pero que se pueda informar desde el editor. En este array informo las posiciones posibles. Despues en la funcion de movimiento, cuando pulsan una tecla utilizo algo parecido a: transform.position = Vector2.Movetowards(posicionactual, posicion a la que quiere ir, velocidad) Igualmente acabo de hacer una WEB que esta en pruebas, con el curso completo y tuenes el codigo del script utilizado, te dejo la URL: https://cursos.uadla.com/curso/como-crear-un-infinite-runner-2d-con-unity/lecciones/creando-el-protagonista-con-gimp-para-unity/ Por cierto, que el cursos es totalmente gratuito, hice la WEB por que seguirlo con listas de youtube es caotico y no tenia nunca claro como mostrar los scripts. Yo creo que la solución te puede cuadrar mucho, bueno, yo he acabado usando ese script y ese tipo de movimiento en unos cuantos Infinitte Runners que he hecho. Saludos!!!!
  9. Nada de cutre, estas soluciones sencillas que cumplen su objetivo lo que son es Brillantes!!!!! A mi me encantan!
  10. mmmmm, No uso un sprite mask, juego con el order in layer y el color de la camara. Mi camara tiene el color negro, y todos mis elementos son negros, menos la luz, que es blanca. La luz tiene un order in layer de 0, mientras que los elementos un order in layer de 1. Esto hace que la cuando coinciden la luz queda por debajo del elemento y así se puede ver. No sé si se entiende bien.... Pero se puede conseguir el efecto que quiere @nomoregames pero con un grave problema.... si sus elementos tienen varios colores no sirve. Muchas gracias @Igorpor poner un vídeo mío 🙂 Saludos.
  11. Ei, yo me vi en las mismas hace poco y acabe creando un script configurable para dialogos, muy sencillo de configurar. Se basa en un array de frases, cada frase es de un struct definido que he llamado _sentence. Cada _sentence esta compuesta por el texto, el personaje al que pertenece y si tiene que activar o desactivar el bocadillo que rodea al texto. Puedes tener multiples NPC's cada uno con frases diferentes, bocadillos o no, y activarlos o desactivarlos en la frase que quieras.... la verdad es que se me hace complicado de explicar como es y como funciona, casi que lo mejor es que le des un vistazo al vídeo que te dejo al final. El script vendría a ser este: public class DialogManager : MonoBehaviour { /* * El _dialogBox es opcional, es una caja * que rodea al texto, el script solo * la activa y desactiva. */ [System.Serializable] public struct _dialogBox { public int _character; //Personaje al que pertenece. public GameObject _box; //Objeto a activar / desacticar } /* * _sentence. El dialogo se construye en base a un array * de esta estructura */ [System.Serializable] public struct _sentence { public int _character; //Caracter al que pertence la frase. public string _2say; //Lo que tiene que decir. public bool _active; //Indica si se tiene que activar el marco de dialogo. public bool _deactive; //Se desactivara el marco de dialogo en la siguiente frase. } public TextMeshPro[] _textContainers; //Array de TextMeshPro en los que se muestra el texto public _sentence[] _sentences; //Array de frases que diran nuestros protagonistas public _dialogBox[] _dialogBoxes; //El marco que puede mostrarse rodeando las frases. [SerializeField] private float _speedWrite; //Tiempo que pasa entre que se escribe una letra y la otra. //private bool _enableDisableBox = false; private int _index = 0; //Contador interno para saber por que frase vamos. private void Start() { CleanText(); //Limpiamos el texto que se pueda encontrar en los textmeshpro if (_sentences[_index]._active == true) { //En el caso de que la primera frase lo indique activamos el dialogbox. EnableDisableBox(true); } //Empezamos la conversacion. StartCoroutine(Talk()); } private void Update() { if (Input.GetMouseButtonDown(0)) { /*En el caso de que se detecte una pulsacion de mouse se continua el dialogo. */ ContinueDialog(); } } public void CleanText() { //Eliminamos el texto de todos los TextMeshPro for (int i = 0; i < _textContainers.Length; i++) { _textContainers.text = ""; } } /* * Esta funcion se ejecuta en paralelo. * Escribe las frases letra por letra. * */ IEnumerator Talk() { //Elimina el texto previo. _textContainers[_sentences[_index]._character].text = ""; foreach (char letra in _sentences[_index]._2say.ToCharArray()) { //Suma cada letra al TextMeshPro _textContainers[_sentences[_index]._character].text += letra; //La funcion se espera el tiempo indicado. yield return new WaitForSeconds(_speedWrite); } } /* * Activa o desactiva el elemento que puede contener el texto * y que se lo indicamos en el editor * */ public void EnableDisableBox(bool enable) { _dialogBoxes[_sentences[_index]._character]._box.SetActive(enable); } /* * Continua con la siguente frase del dialogo */ public void ContinueDialog() { if (_sentences[_index]._deactive == true) { //Si la frase anterios tenia que ser desactivada llamamos a //la funcion que desactiva su globo EnableDisableBox(false); } //Aumentamos en 1 el _index con lo que pasamos a la siguiente frase. _index += 1; //Comprobamos que tenemos otra sentencia que escribir if (_index < _sentences.Length) { if (_sentences[_index]._active == true) { //Si es necesario activamos su dialog box EnableDisableBox(true); } StartCoroutine(Talk()); } else { //si es la ultima frase, limpiamos el texto. CleanText(); } } } Si has empezado a usar Fungus esto te va a parecer del paleolitico y super simple, pero como ejemplo de como crearlo no esta mal del todo.
  12. Hola, Os dejo un par de vídeos sobre como implementar un sistema de navegación Point & click con navmesh, en el primero se configura el sistema y veamos un solo agente. En el segundo se crean dos tipos de terreno diferentes y dos agentes que responden de forma diferente al terreno. Son muy sencillos y cortos, espero que le puedan servir a alguien 🙂 Saludos.
  13. dios, que currada de canal! Tienes toda mi admiración y mi suscripción.
  14. WTF! Genius! A ver si encuentro un poquitín de tiempo para jugar con tu inventazo!
  15. Pere

    [GAME] SOULBOUND

    A mi tambien me ha recordado un poco a Liombo. Me encanta! Felicidades.
×
×
  • Create New...