martes, 14 de junio de 2016

Como crear trayectoria Senoidal para un objecto por Código | How to create a Sinusoidal trajectory to an object by Script

Español | English

Muchas escuchamos o hicimos la pregunta a nuestro/a profesor/a de matemáticas: "¿Voy a usar esto en el futuro?" y tal vez el o ella no sabía que responder, seguro les contestaba que dependía de la carrera que el alumno o la alumna fuera a seguir.

Para el desarrollo de Videojuegos se utiliza toda herramienta posible de las matemáticas, ya que nos pueden servir para resolver los casos que se nos planteen. Por eso es importante tener un amplio conocimiento de las ciencias exactas para tener más herramientas disponibles.

La situación de la cual partimos se genera a partir de un objeto que se mueve en línea recta a velocidad constante. Este objeto es uno de los encargados de instanciar (Spawnear) otros objetos, que el jugador va a recolectar.

Ya había hablado antes de que el Spawner instancia objetos en intervalos aleatorios de tiempo, pero siempre en linea recta. Por lo que nos podemos quedar quietos en una misma posición y siempre agarrar objetos.

Una solución a este problema es cambiar la posición vertical ("altura") del Spawner constantemente, para que genere objetos a distintas "alturas" y así, cubrir más superficie del mapa. Al moverse verticalmente de arriba hacia abajo y con velocidad constante, podemos ver que la trayectoria del Spawner va a crear una forma senoidal.

Para eso primero creamos las variables que van a actuar:

float distancia = 0.13f;
public float h = 0;
public float hmax = 0;
public float hmin = 0;
public bool up = true;

Donde h representa la altura del objeto, se actualiza constantemente, hmax y hmin representan la altura máxima y mínima que puede tomar ese objeto, y por último, "up" determina si tiene que subir o no.

Las variables hmax y hmin tienen que estar asignadas en la función Start() del Script, ya que no deberían cambiar.

void Start(){
hmax = 30f;
hmin = 1f;

}

Ahora vamos a focalizarnos en la función Update(). Primero, vamos a asignarle a la variable h el valor de la posición vertical del Spawner, luego vamos a indicarle si debe subir o bajar.

h = this.GetComponent<Transform>().position.y;

Nota: Se asume que el Script esta añadido al objeto, de no ser así, se debería crear una variable pública de tipo Transform a la cual le pondremos los valores del objeto.

if (up == true)
        {
          this.gameObject.GetComponent<Transform>().position += new Vector3(0, distancia, 0);
        if (h >= hmax)
        {
            up = false;
        }
        }
        if (up == false)
        {
           this.gameObject.GetComponent<Transform>().position -= new Vector3(0, distancia, 0);
        }
        if(h <= hmin)
        {
            up = true;
        }

Aquí esta la lógica del movimiento. Se basa en analizar si el objeto tiene que subir o bajar, en caso de que tenga que subir, se actualiza constantemente su posición vertical hasta que alcanzó el límite, luego, se le indica que debe bajar y de nuevo se modifica la posición vertical. Esto se lleva a cabo infinitas veces.

Se puede, como complemento, ajustar la velocidad a la que se desplaza o agrandar el intervalo.Y así queda creada la mecánica para hacer que un objeto recorra una trayectoria senoidal.


-L

--------------------------------------------------------

English

Many times we have heard someone ask (or did it ourselves) to the teacher: "Am I going to use this in the future?" and maybe the teacher didn't know what to answer, they surely said that it depended on what the student was going to do when he or she grow up.

For Game development, we use every available tool from math, as they can be useful to solve cases that may appear. That is why we need to have a wide range of knowdledge from the exact sciences to have as many tools as possible.

Our starting situation is generated by and object that moves in straight line with constant speed. This object is one of many who instantiates (Spawns) the objects that the player will collect.

I've spoken before about the Spawner, saying that it instantiates in random periods of time, but always in straight line. So we can stand still in a fixed position and alwats grab objects.

A solution to this problem is to change the vertical position ("height") of the Spawner constantly, so that it generates the objects in different "heights", which will cover more surface of the map. As the object moves up and down and it is also moving at a constant speed horizontally, we can see that this creates a sinewave trajectory.

To do this we first need to create the variables that will act:

float distancia = 0.13f;
public float h = 0;
public float hmax = 0;
public float hmin = 0;
public bool up = true;

Where h represents the height of the object, which is constantly being updated, hmax and hmin represent the maximum and minimum height that the object can have, finally, "up" determines whether  the object has to go up or not.

The variables hmax and hmin have to be assign in the Start() function of the Script, as they are not meant to be modified.


void Start(){
hmax = 30f;
hmin = 1f;
}

Now we are going to focus on the Update() function. First of all, we need to assign the vertical position of the object to the variable h, then we are going to indicate if it needs to go up or down.

h = this.GetComponent<Transform>().position.y;

Note: I assume that the Script is attached to the gameObject, if this is not the case, a public variable of the type Transform needs to be created and later on, it has to be assign to an object.

if (up == true)
        {
          this.gameObject.GetComponent<Transform>().position += new Vector3(0, distancia, 0);
        if (h >= hmax)
        {
            up = false;
        }
        }
        if (up == false)
        {
           this.gameObject.GetComponent<Transform>().position -= new Vector3(0, distancia, 0);
        }
        if(h <= hmin)
        {
            up = true;
        }

Here it is the logic of the movement. It is based on analyzing whether the object has to go up or down, in case it has to go up, its vertical position is being constantly updated until the limit is reached, then, it indicates the object that it has to go down and it modifies the vertical position again. This is performed infinite times.

As a complement, one can also adjust the speed on which it moves or make the periods longer. And so it is created the mechanic that make an object travel a sinusoidal trajectory.

-L

No hay comentarios.:

Publicar un comentario