#7 Método AddForce de la clase RigidBody. [Serie Fundamental de Unity]

Por GameDevTraum

Introducción

En este artículo vamos a estudiar cómo utilizar el método AddForce de la clase RigidBody de Unity, el cual nos permite aplicar fuerzas a los GameObjects que tienen asignado un componente RigidBody. El objetivo es lograr que la pelota que se encuentra en el GameDevLab rebote indefinidamente mientras dure la partida.

Página principal del proyecto

Artículos de la Serie Fundamental de Unity

Antes de empezar te invito a ver el video que hice para resumir este artículo.

Procedimiento

Vamos a utilizar la estación “AddForce“, la cual consiste en un contenedor en forma de diamante que tiene en su interior una pelota. El objetivo es lograr que la pelota rebote indefinidamente en el interior de la estación. Para ello debemos aplicar una fuerza cuando la pelota toca el fondo.

Escena de un proyecto en Unity3D, estación AddForce para estudiar cómo aplicar fuerzas a GameObjects con componente RigidBody.
Fig. 1: Estación AddForce del GameDevLab.

En la jerarquía tenemos el GameObject “#7 AddForce” que contiene todos los elementos de la estación (figura 2). Este GameObject además tiene asignado el Script “AddForceToObject”.

Jerarquía de un proyecto en Unity3D, resaltada se observa el GameObject "AddForce" que se utiliza para estudiar cómo aplicar fuerzas a GameObjects con componente RigidBody.
Fig. 2: Jerarquía del GameDevLab. Vamos a trabajar con el GameObject “#7 AddForce”.

Inspector de un proyecto en Unity3D, se observa la componente "AddForceToObject" que se encargará de aplicar una fuerza sobre el GameObject.
Fig. 3: Componente “AddForceToObject” asignada al GameObject “#7 AddForce”.

En la figura 3 observamos la componente”AddForceToObject” en el inspector. Podemos asignar un objeto al cual aplicarle la fuerza, en este caso es “Sphere” la pelota que se encuentra en el interior de la estación. Podemos asignar un valor de fuerza mínima y máxima para aplicar a la pelota y la dirección de la fuerza.

Con el propósito de informarse un poco sobre qué es una fuerza y cómo se define hice este video:

A la izquierda, la esfera de la estación "AddForce". A la derecha se visualizan sus componentes en el inspector. Entre ellas hay una componente RigidBody que le dará comportamiento físico.
Fig. 4: A la izquierda, la esfera de la estación “AddForce”. A la derecha se visualizan sus componentes en el inspector. Entre ellas hay una componente RigidBody que le dará comportamiento físico.

El GameObject de la pelota es simplemente una esfera primitiva hecha en Unity, tiene asignado un componente RigidBody que le otorga el comportamiento físico. La pelota estará afectada por la gravedad, podrá colisionar con objetos que tienen asignados Colliders y podremos aplicarle fuerzas.

A la izquierda el GameObject encargado de detectar si la pelota toca el suelo. A la derecha sus componentes en el inspector.
Fig. 5: A la izquierda el GameObject encargado de detectar si la pelota toca el suelo. A la derecha sus componentes en el inspector.

En la base de la estructura tenemos un GameObject con forma de cilindro que tiene asignado un Box Collider en modo Trigger (figura 4). Además tiene un Script llamado “AddForceCollisionDetection” que se encargará de detectar la pelota.

Resolución

Cuando abrimos el Script “AddForceToObject” por primera vez nos encontramos con lo que se ve en la figura 6. Están definidos todos los parámetros que se ven en el inspector y contiene un sólo método llamado “addForce”. Este método está definido como público porque es el que se va a llamar cuando se detecte que la pelota ha tocado el suelo de la estructura.

Se observa un Script en lenguaje C# con el nombre "AddForceToObject". El Script corresponde a un proyecto en Unity3d, en el que se estudia cómo aplicar fuerzas a los GameObjects.
Fig. 6: Script “AddForceToObject” incompleto.

A continuación se muestra la resolución de este ejercicio y se explica cuál es el propósito de cada instrucción.

Se observa un método en lenguaje C# con el nombre "addForce". El método corresponde a un proyecto en Unity3d, en el que se estudia cómo aplicar fuerzas a los GameObjects.
Fig. 7: Resolución del ejercicio.

Para la resolución vamos a requerir tres instrucciones. La primera se encargará definir la magnitud de la fuerza a aplicar, que será un valor aleatorio entre la fuerza mínima y la máxima.

La segunda instrucción definirá la fuerza total a aplicar, si viste el video sobre física, para definir una fuerza necesitamos una magnitud y una dirección. Para la dirección utilizamos el vector de tres dimensiones (clase Vector3) que se ve en el inspector, se llama “forceDirectionVector”. Pero no lo vamos a utilizar tal y como está escrito en el inspector. Para prevenir que ese Vector3 afecte la magnitud de la fuerza debemos normalizarlo. Es decir hacer que su norma valga 1. Esto lo hacemos con el método “Normalize” de la clase Vector3. La fuerza total a aplicar será un Vector3 llamado “force” que es el resultado de multiplicar la dirección por la magnitud.

Por último la tercera instrucción consiste en aplicar la fuerza sobre el objeto. Las fuerzas son aplicables a GameObjects que tienen un componente RigidBody asignado, en nuestro caso vamos a aplicar la fuerza sobre la componente RigidBody de la pelota. Utilizamos el método “GetComponent” para obtener la componente RigidBody y finalmente ejecutamos el método AddForce, pasando como parámetro la fuerza a aplicar.

Escena de un proyecto en Unity3D, estación AddForce para estudiar cómo aplicar fuerzas a GameObjects con componente RigidBody.
Fig. 8: Estación funcionando. La pelota rebota con fuerza variable.

Conclusión

Al probar el juego, la pelota rebota indefinidamente con una fuerza aleatoria.

Para definir una fuerza necesitamos un valor real para la magnitud y un vector para la dirección en la que se debe aplicar.

Las fuerzas actúan sobre la componete RigidBody de los GameObjects.