post

Algo muy común en la mayoría de videojuegos es la existencia de objetos que, al ser abiertos, contienen a su vez uno o varios objetos que pueden ser recogidos por el jugador. Un claro ejemplo de ello serían los clásicos cofres en cuyo interior podemos encontrar numerosos items como pueden ser monedas, gemas, vidas extra, etc..

En este artículo vamos a aprender a construir, de una manera muy sencilla, este tipo de items contenedores. Serán objetos que podremos colocar a lo largo de toda la escena de nuestro juego y a los que podremos introducirles cualquier tipo de objeto que se nos ocurra, de manera que cuando los abramos (o rompamos), se destruyan y aparezca el objeto interior. El script utilizado será válido tanto para juegos 2D como 3D.

Creación del script ‘ComportamientoItemContenedor.cs’

Empezaremos implementando el script que irá asociado a nuestro objeto contenedor y que se encargará de comprobar cuándo el objeto es abierto y, en ese caso, hacer aparecer el objeto interior que le indiquemos.

Definimos la variable pública ‘PrefabItemInterior‘ encargada de recibir el GameObject que representará al objeto interior. También definiremos algunas variables privadas que necesitaremos más adelante:

En la función Start(), aparte de inicializar algunas variables privadas, vamos a instanciar en la escena el objeto interior para seguidamente desactivarlo:

El motivo de realizar esta instanciación al inicio del script, y no en tiempo de ejecución, es por optimización. Una de las cosas que en general debemos evitar, sobre todo si estamos creando un videojuego para plataformas móviles, es la instanciación de objetos en tiempo de ejecución debido a su alto coste de rendimiento. En este caso, al estar instanciando el objeto en la función Start(), cuando el juego comience su ejecución ya estará instanciado en memoria y, por tanto, habrá un mejor rendimiento.

Bien, ahora vamos a crear una función pública llamada Open(), a través de la cual cualquier entidad externa podrá indicarle al objeto contenedor que sea abierto:

Sólo nos falta implementar la función Update(), que se encargará de comprobar si el objeto ha sido abierto y, en ese caso, destruirse a sí mismo y a su vez posicionar y activar el objeto interior para que quede visible en la escena. Lo vamos explicando en el mismo código:

 Creación del objeto contenedor

Una vez tenemos listo nuestro script, vamos a crear el GameObject correspondiente a nuestro objeto contenedor. Para el correcto funcionamiento del script, el GameObject deberá contener como mínimo los componentes: Rigidbody y algún tipo de Collider (BoxCollider, SphereCollider, CapsuleCollider…). Para este ejemplo vamos a usar la imagen de un jarrón para representar al objeto y su collider será de tipo BoxCollider:

ObjContenedor

GameObject del objeto contenedor

Creación del objeto interior

Ahora vamos a crear el GameObject correspondiente al objeto que habrá en el interior del contenedor. Para este ejemplo vamos a crear un simple objeto vacío con la imagen de una moneda:

image

GameObject del objeto interior

Una vez creado el objeto interior, debemos convertirlo en prefab. Para eso simplemente debemos arrastrarlo desde la sección ‘Hierarchy‘ de Unity a alguna de nuestras carpetas de la sección ‘Project‘:

Prefab del objeto interior

Prefab del objeto interior

Asignación del script ‘ComportamientoItemContenedor.cs’ al objeto contenedor

Por último, añadiremos nuestro script al GameObject del objeto contenedor y, a la variable ‘PrefabItemInterior‘ situada en el inspector, le asignaremos el prefab de nuestro objeto interior:

Script 'ComportamientoItemContenedor.cs' asignado y configurado

Script ‘ComportamientoItemContenedor.cs’ asignado y configurado

Y con esto ya hemos acabado nuestro contenedor de items. A partir de aquí, el desarrollador tendrá libertad para construir tantos contenedores como desee con los items internos que desee (en caso de no asignar ningún prefab en la variable ‘PrefabItemInterior‘, al abrir el contenedor simplemente no aparecerá ningún objeto), recordando que la manera de abrir dicho contenedor desde scripts externos será siempre a través de la función pública Open() de nuestro script ‘ComportamientoItemContenedor.cs’.

También será responsabilidad del desarrollador añadir lo que estime necesario para una correcta visualización del efecto de apertura del objeto contenedor. En este ejemplo podríamos hacer una animación del jarrón rompiéndose que se ejecutase en la llamada a Open(), o hacer una animación para la moneda interior que simplemente gire sobre sí misma… ¡Las posibilidades son infinitas!

Acerca de Santi Andrade

Canturreo canciones, hago cosas raras de informáticos y amo las croquetas. Web & Unity Game Developer y miembro de la banda de rock 'Histeria Innokua'. histeriagamedev.wordpress.com | Sígueme en Twitter

4 respuestas sobre “Unity3D: Items contenedores de objetos

  1. Hay un error en tu codigo, cerraste la clase ComportamientOItemContenedor antes. ya que la llave de cierre debe ir despues de las funciones Start () y Update()

    • Hola dier, gracias por comentar! Lo que dices de la clase ComportamientoItemContenedor lo hice a posta para ir explicando paso a paso el tutorial. Pensé que se presupondría que el resto de métodos debían ir dentro de la clase principal ComportamientOItemContenedor. Saludos!

  2. Saludos Santi, me dirijo a ti para ver si me podrías ayudar en un problemilla que tengo. Te cuento brevemente lo q quiero hacer: quiero q mi personaje cuando se acerque a un cofre, al presionar la tecla “E” se abra y saque de el una llave para así poder abrir una puerta al siguiente nivel, he hecho un script y se lo he añadido a un BoxCollider en forma de trigger pero al pasar el personaje directamente lo abre,y al alejarse se cierra. Te dejo el script aquí:

    var Cofre : GameObject;
    function OnTriggerEnter (col : Collider) {
    If (col : gameObject.tag == (“Jugador”) {
    Cofre.animación.Play();
    Destroy(gameObject);
    }
    }

    Creo que para q interactúe como yo quiero hay que cambiar lo de dentro del if y ponerlo con lo de “GetKeyDown” y la tecla correspondiente a la “E” pero no estoy seguro.
    Y respecto al tema de poner objetos dentro del cofre no se me ocurre nada. Si puedes echarme un cable o si sabes de algún enlace donde expliquen bien ese tema te lo agradecería muchísimo porque no se si lo de este post me servirá para esto ya que yo lo quiero para un juego en 3d, no 2d y si no no pasa nada, espero tu respuesta. Un saludo.

    • Hola Álvaro, no sé cómo tendrás montado exactamente el GameObject de tu cofre, pero suponiendo que tienes ya hecha la animación de “abrir cofre”, yo lo que haría sería, tal y como dices, ponerle un collider de tipo trigger al cofre y en su script hacer algo así (en C#):

      void OnTriggerEnter (Collider col)
      {
      if (col.gameObject.tag == “Jugador” && Input.GetKeyDown(tecla))
      {
      // Lanzar la animación aquí
      }
      }

      Lo que le haría al fichero de la animación sería desactivarle la casilla de bucle para que solo se lance una vez y se quede abierto una vez lo hayamos abierto.

      De esta forma, cuando tu jugador pase por el cofre, mientras no pulses la tecla correspondiente, el cofre no se abrirá. Y si pulsas dicha tecla, el cofre se abre y ya se queda abierto.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *