Una forma de representar ecuaciones que describan cambios en el tiempo en Unity

Introducción

En este artículo voy a mostrar una forma en la que se puede representar la evolución de magnitudes que dependen del tiempo en Unity.

Supongamos que tenemos una ecuación cualquiera, por ejemplo Y = X2 la cual consiste una parábola con vértice en (0,0) y sus ramas en el semiplano superior. Considerando la variable X como el tiempo, en este artículo vamos a analizar cómo hacer en Unity para que la variable Y describa la parábola a medida que el tiempo avanza.

Descargar paquete de Unity con el ejemplo que se analiza en este artículo

Punto de partida

Consideremos la gráfica de la función y = t2 para un tiempo cualquiera t i mayor a 0, en la figura 2 vemos el punto de la gráfica cuya coordenada es (t i ,y i)

Fig. 1: Gráfica de la función y = t2.

Fig. 2: Coordenada del punto (t i ,y i).

Ahora consideremos que dejamos pasar un cierto lapso de tiempo Δt, ahora nos encontramos en el tiempo t i+1 que no es otra cosa que el tiempo anterior mas el valor Δt, es decir que t i+1 = t i + Δt . En la figura 3 se considera el valor de la función en el tiempo t i+1, este se reemplaza por el valor t i + Δt y se hace el desarrollo matemático hasta llegar a las expresión de y i+1 (la función en t i+1) pero desde la perspectiva de un tiempo anterior.

Fig. 3: Expresión de la valor de Y en el tiempo ( t i + Δt).

Al final de la figura 3 llegamos a una expresión para el siguiente valor de la función en términos del valor actual y del incremento de tiempo, en otras palabras en la figura 4 vemos que si al valor actual le agregamos un cierto incremento dentro del cual se encuentra el propio valor actual y el incremento de tiempo, esta suma nos devuelve el siguiente valor.

Fig. 4: Expresión del siguiente valor de Y en función del valor anterior y un incremento Δt.

La expresión anterior nos permite realizar un proceso iterativo, es decir repitiendo el cálculo de la ecuación y actualizando los valores vamos a lograr recorrer cada punto de la parábola para t > 0, para incluir los valores en los que t<0 habría que analizar qué ocurre con ese valor absoluto, por simplicidad decidí omitirlo y quedarme solo con la rama de la derecha de la parábola.

Implementación en Unity

Ahora vamos a ver cómo se pueden aplicar en Unity esta ecuación y hacer que el sistema evolucione en el tiempo.

El concepto matemático Δt en Unity

En matemática se utiliza la letra griega delta (Δ) delante de una variable para indicar un incremento en dicha variable, por ejemplo Δt puede representar t2 – t1, siendo t1 y t2 dos momentos distintos en el tiempo. En Unity suele ser de interes conocer esta magnitud, ya sea el Δt que existe entre dos frames de la aplicación o el Δt entre dos actualizaciones físicas del motor, estas magnitudes son necesarias para producir cambios coherentes en el tiempo, no solo nos permite controlar de manera exacta la magnitud de los cambios, es decir por ejemplo alterar una variable en tantas unidades por segundo, sino que garantizan que estos cambios sean iguales para todos los ordenadores, sin importar la capacidad del hardware.

Para comprender un poco mejor esta parte voy a dejar dos vídeos pertenecientes a mi canal sobre desarrollo de aplicaciones en Unity, uno se trata sobre cómo incrementar gradualmente variables en el tiempo, que puede ayudar a comprender el significado del delta time en Unity, el otro se trata de un experimento para analizar las diferencias entre las funciones Update y FixedUpdate.

Contenido del Script

En la figura 6 se muestran las variables utilizadas y la función Start que se ejecuta en el momento inicial en el que Unity entra en el modo ejecución. Se definen dos variables tipo float, es decir para almacenar números con decimales, una para la variable “t” y otra para la variable “y”, además se definen dos listas de floats para ir almacenando los valores registrados en la evolución del sistema. Estas listas se crean en la función Start.

Fig. 5: Variables definidas en el Script dentro del paquete de descarga

Las instrucciones que se encargarán de la evolución del sistema en el tiempo están definidas dentro de la función Update, una función que Unity ejecuta de manera automática una vez por cada frame que se produce. En la figura 6 vemos una expresión matemática relevada de la figura 4 en la que se muestra el incremento que hay que hacerle a la variable y para pasar al siguiente valor dado por el incremento del delta de tiempo. A la derecha, en la figura 7 vemos las instrucciones escritas en Unity que realizan esta misma tarea.

Fig. 6: Incremento sobre la variable Y en función del valor anterior y un incremento Δt, relevada de la ecuación de la figura 4.
Fig. 7: Contenido de la función Update que determina la evolución del sistema en el tiempo.

La variable t se va incrementando con el valor de deltaTime, que en el video enlazado mas arriba se muestra que es un valor variable y depende de la potencia del ordenador, en la variable Y se va haciendo un incremento de acuerdo a la expresión de la figura 6.

Las instrucciones en las líneas 27 y 28 añaden los nuevos valores de t y de y a las listas simplemente para registrarlos y poder visualizarlos en el inspector en Unity. La instrucción de la figura 30 es la modificiación de la posición del GameObject al cual ese Script está asignado de acuerdo a los valores calculados.

Prueba de ejecución

Al entrar en el modo Play comienzan a registrarse los valores en las listas de T y de Y y además la esfera que tiene asignado el Script se mueve en una trayectoria parabólica, como recorriendo la rama de la derecha de la parábola de la figura 1.

Fig. 8: Valores registrado al entrar en el modo Play.

Conclusión

El propósito de este artículo era mostrar una forma de implementar una ecuación matemática o el análisis de la misma a Unity y lograr que una variable evolucione en el tiempo de acuerdo a esta ecuación. Entender esto puede ayudarnos a crear sistemas mas complejos que estén basados en matemática y con resultados tan precisos como lo permitan los tipos de datos utilizados.

Scroll al inicio
Secured By miniOrange