lunes, enero 23, 2017

Algunos avances

Parece que enero es mes de programar, luego de unos días dedicados a la novela, el resto del tiempo ha sido invertido en probar cosas.
La IA va cogiendo forma (lo que no sé qué forma) y a veces logra combatir con éxito. Los diálogos han mejorado muchísimo y ya afectan muchas cosas del juego. El sistema de misiones casi que funciona y quizás necesite tomármelo en serio en estos días y hacer algo que valga la pena.
En fin, que rompiendo cositas aquí y allá he logrado un prototipo casi jugable, en apenas unos meses de trabajo, si sumo el tiempo real que le he dedicado al proyecto. Alguien con más experiencia creo que habría conseguido más, pero eso es lo que hay. Por el momento, sigue sin aparecer ayuda cercana, e incluso, uno de los mejores contribuyentes del proyecto no da señales de vida desde hace tiempo, así que el apartado visual está un poco descuidado y seguirá así por ahora. Es por eso que no he publicado videos ni imágenes, no es solo que los gráficos sean placeholders hechos incluso por mí mismo, sino que hasta la escena de prueba es un amontonamiento de cosas sin relación con lo planificado en el guión. Faltan objetos adecuados y animaciones que encajen con esos objetos. Por ejemplo: pensé que el uso de armas de dos manos como fusiles de asalto requerirían algún manejo especial, y resulta que no, es mayormente trabajo del artista hacer que coincidan las manos del personaje con los puntos de agarre del arma. O al menos, eso me explicaron, cualquier corrección al respecto es bienvenida.
Para esta semana pienso implementar una nueva funcionalidad: el mapa. Resulta que no andaba tan desencaminado al suponer que se podía lograr con una cámara y Render to Texture. Lo que no sabía era cómo asociar eso a un elemento del GUI, y eso se consigue usando una Raw Image, y eso es lo que pienso probar hoy en casa.
En fin, que el proceso de aprendizaje me ha resultado muy útil, aunque el proyecto en sí solo sean un montón de cosas que funcionan a medias. Un consejo, si deciden aprender a desarrollar juegos, les recomiendo que lo intenten primero con Unreal Engine. Como siempre digo, si vas a aprender a hacer algo, aprende a hacerlo con la mejor herramienta o metodología disponible. No es que Unity sea malo, es que Unreal... bueno, no podemos discutir que es el mejor motor de juegos del mundo.

jueves, enero 19, 2017

Obsidian se trae algo entre manos

El sitio web de Obsidian tiene algo nuevo, y ni idea de qué se trata. Al parecer, hay proyecto nuevo en el ambiente, de nombre código Proyecto Lousiana. Hay diversas especulaciones que afirman que se trata de Pillars of Eternity 2. Un análisis hecho por gente que obviamente no tiene mucho que hacer revela referencias a Deadfire, un archipiélago del mundo de PoE, además de que se han descubierto otros símbolos en el código de la página, también provenientes de PoE.
Sea lo que sea, probablemente será divertido, aunque es ya una opinión muy extendida que el género medieval está un poco saturado. Que ni una espada o un hechizo más, vaya.

miércoles, enero 18, 2017

Reformando la IA

La semana pasada pasé un buen rato mejorando la IA, en especial, el sistema de percepción. Había contado incialmente con RAIN para esa tarea, sin embargo, la falta de soporte me hizo descartar este plugin que parecía tan prometedor. Tocaba entonces hacer todo a mi manera, desde cero.
El concepto inicial empleaba un script para cada tipo de entidad en la escena. El sistema funcionaba, pero no era para nada óptimo reescribir código iguales o muy parecidos para cada posible IA. Toda una burrada de mi parte, así que decidí unificar todo en un solo script, trabajo que terminé ayer. Ahora la personalización de la IA dependerá de un conjunto de datos pasados al script, los cuales aún no acabo de definir.
Tengo algunas ideas al respecto, pero todo muy vago. Cada entidad debería tener nociones de algunos lugares relevantes (por ejemplo, dónde patrula, o a dónde retirarse durante la noche), cómo reaccionar ante el jugador, y sobre facciones, enemigos, etc.
De paso, descubrí una serie de problemas en el sistema de percepción, que también arreglé. Mi método, muy sencillo, se basa en usar un BoxCastAll para detectar todo lo que está delante de la entidad:

var hits = Physics.BoxCastAll(new Vector3(gameObject.transform.position.x, gameObject.transform.position.y + 5.0f, gameObject.transform.position.z + 5.0f), new Vector3(25, 10, PerceptionRange*5.0f), gameObject.transform.forward, Quaternion.identity, 120.0f);

A continuación hay que procesar esa lista de resultados a ver si el jugador u otro NPC están incluidos. Ojo, que además hay que revisar si una entidad ya no es visible. Muy burdo, pero funciona, y se aceptan sugerencias (aunque sé que no recibiré ninguna).
Por el momento he logrado que los NPC ignoren al jugador, se acerquen a hablar con él, o se lancen a atacarlo. Falta pulir, precisamente, que se acerquen adecuadamente, algo que será necesario también para el combate. Sobre eso espero tener resultados pronto.

lunes, enero 16, 2017

Días de programador

Luego de tener unos días de escritor, cambié por completo al modo programador. Estuve en casa atendiendo algunos trabajos de reparación, así que en los ratos libres le hice una ofensiva al prototipo que me sirve de banco de pruebas.
Fue un trabajo bastante desorganizado, porque saltaba de una cosa a otra según me viniese a la mente, pero que se puede resumir en lo siguiente:
  • Mejoras al sistema de diálogos: ahora las condiciones funcionan y se pueden asignar misiones (aunque aún necesito una herramienta de edición).
  • Sistema de sensores para la IA. Me deshice de RAIN e implementé un sistema básico que permite a los NPCs "ver" al jugador y actuar en consecuencia. Aún requiere pulido y mejoras.
  • Comercio. Ahora es posible comprar y vender cosas.
  • Equipar/enfundar armas.
  • IA muy primitiva, que puede atacar pero no usar habilidades.
El avance se ha visto limitado por no poseer animaciones adecuadas para algunas acciones, como por ejemplo el uso de armas a dos manos, en este caso, rifles. Eso, sin descontar mi propia inexperiencia en el diseño de algo tan complejo como un sistema de objetos+combate.
Pero me resulta reconfortante ver que en apenas siete meses he llegado bastante lejos, programando completamente solo. No sé qué podría hacer si tuviese ayuda de dos o tres programadores experimentados.

viernes, diciembre 30, 2016

Crónicas de mi primer vuelo en parapente

Un fin de año por todo lo alto, nunca mejor dicho, porque pasé unos treinta minutos a 400 metros de altura, colgado de una vela.
Desde hace unos años sabía que había aficionados al parapente en Santiago de Cuba, pero recién esta semana fue que logré establecer contacto con uno de ellos y conseguir una invitación para volar, ayer en la tarde.
Todos los pilotos que me encontré en el camino me insistieron en que es una experiencia única, nada extraño, porque todo aficionado a algo siempre tratará de convencerte de lo mismo. Sin embargo, un canadiense radicado acá fue el que más se acercó a dibujar la sensación al decirme: A ti te gustan los vuelos, seguro has soñado que vuelas. Pues esto es lo mismo. Y definitivamente, lo es.
Al principio pensé que sería un estorbo en el despegue. Aunque había visto despegar al piloto canadiense, no es lo mismo despegar en biplaza. O eso creía yo. Cuando la vela se infla, el viento te lleva y no hay más nada que hacer. No es necesario saltar, correr, nada. En un segundo estás a varios metros de altura, alejándote de la falda de la montaña, y casi enseguida las corrientes ascendentes hacen su trabajo (que para eso se les paga) y te elevan mucho más. Luego vas cabalgando las corrientes, a lo largo de la cresta de las montañas, mientras disfrutas del paisaje en compañía de otros pilotos. Ayer el tráfico era abundante, además de mi piloto y yo, y nuestro amigo canadiense, llegaron dos alemanes con unas velas que pa qué contarles. Desde airbags en la mochila hasta winglets, como un Airbus. Imposible no envidiarlos. Gente con experiencia, uno de ellos hizo un aterrizaje perfecto.
Volviendo al tema, el principiante puede sentirse bastante impresionado en su primer vuelo. Después de todo, estás sentado en algo que cuelga, mientras las ráfagas de viento te sacuden de vez en cuando, haciendo que se te salga la diarrea. Tres o cuatro rachas después, te das cuenta de que es muy normal, dejas de cagarte y el miedo se convierte en una sensación un poco menos pegajosa. Si eres flojo de estómago, probablemente tengas que vomitar, que por suerte, no es mi caso: suelo ser muy resistente al vértigo por alturas.
En caso de que vomites y el miedo siga en niveles estatosféricos luego de varios minutos de vuelo, quizás deberías considerar que volar no es lo tuyo y dedicarte a una diversión menos movida, a nivel del mar, si es posible. Si soportas 15 minutos de vuelo y encima quieres repetir, pues felicidades. Bienvenido al club de los hombres y mujeres que no le tienen miedo a nada. Bueno, salvo a las cucarachas. O a las arañas, que me dan una mala impresión...
Creí que seguramente sí sería un estorbo al aterrizar, que me caería o me enredaría en las cuerdas, pero tampoco. Un leve dolor en los pies, un poco entumecidos por media hora sentado en el aire, y eso fue todo. Por supuesto, el crédito se lo lleva el piloto, con 13 años de experiencia volando estos aparatos.
Así que si vienen a Santiago y quieren probar un vuelo en parapente, vengan a verme. Ojalá el tiempo y otros factores me permitan repetir más a menudo esta experiencia, y quizás hasta conseguir aprender a volar solo.

jueves, diciembre 29, 2016

No tendremos EMDriver por ahora, ni tampoco motores warp

Parece que la comunidad científica se ha empeñado en desacreditar el motor EM, solo por el nimio detalle de que contradice las leyes de la física. Hay que ver que estos científicos son retrócgrados y están en contra del progreso.
La cuestión es que los experimentos realizados por un equipo de la NASA, que ahora dicen que no es de la NASA, sino algo así como unos primos lejanos y pobres a los cuales no quieres ver en tu fiesta de cumpleaños, no son concluyentes. Los realizados por los chinos tampoco.
En el supuesto caso de que sí funcione, el impulso generado solo sería útil para misiones de larga duración, o sea que nada de pensar en ir con él a Marte. En fin, que volvemos al principio, y el 2016 no será el año del EMDrive.
Por si fuera poco, aún estamos muy lejos de poder construir un motor de Alcubierre, alias motor warp. Ni siquiera teniendo en cuenta los ajustes propuestos por Harold White, que redujeron las necesidades de energía negativa. El costo de producir la antimateria necesaria es aproximadamente igual a toda la producción económica mundial de 40 años. Eso, sin mencionar que las fuerzas gravitacionales implicadas probablemente destrozarían la nave.
Yendo al punto, que no lo conseguiremos antes de cien años. O más. Definitivamente, esto ha estropeado mi fin de año.

martes, diciembre 20, 2016

Cómo logré usar los Animation Events (al fin)

Aunque Internet rebosa de tutoriales de Unity, de vez en cuando hay detalles que cuestan lo indecible encontrar la forma de usarlos. Por ejemplo, los Animation Events. Ni siquiera en los foros conseguí que alguien me explicase cómo funcionaban.
El caso es que los Animation Events son eventos que se agregan a las animaciones, en principio muy útiles, pero no lograba aplicarlos correctamente. Un Animation Event necesita de una función receptora, que por supuesto, debe estar en un script asignado a un GameObject. Típico. O sea, que no encontraba una forma de que la función receptora fuese genérica y no específica de un objeto en la escena.
A ver si me explico. Mi idea era detectar cuando la animación de un ataque hubiese terminado, para indicarle al personaje (jugador o NPC) que ya puede continuar con la acción siguiente en la cola. Quizás por incapacidad mía, pero no logré pasarle a la función receptora, quién era el GameObject padre del esqueleto que había concluido su animación. Solo quedaba la variante opuesta: cada personaje tendría su script con la función receptora (lo adjunté al prefab que contiene el esqueleto) y la clase del script tiene un miembro público al que se le asigna el GameObject padre. Lleva algo de trabajo, porque hay que repetir el proceso para cada personaje en la escena, pero no veo otra forma de hacerlo. Y por lo menos, así funciona.
Ahora el sistema de combate se parece un poco más a lo que debe ser, al menos en la lucha cuerpo a cuerpo. La animación para armas de rango no es la correcta y requiere ajustes, pero eso sí creo que se escapa de mis capacidades.