Kitabı oku: «Unity 3D», sayfa 5
1. Introducción
Una vez hemos visto el capítulo de programación básica es el momento de poner en práctica todo lo aprendido mediante actividades prácticas.
No pretendo que este libro se convierta en un simple conjunto de tutoriales, sino en una serie de ejercicios que te permita mejorar en el dominio de Unity.
Para esta tarea el vas a crear un nuevo proyecto llamado Capitulo 6. Una vez tengas abierto el nuevo proyecto, guarda el proyecto. Como ya sabes esta obra viene con material adicional para seguir los capítulos, ten localizado este material adicional para acceder a él.
Bien primero accedemos al menú principal y seleccionamos la opción Assets > Import Package > Custom Package. Se nos abrirá una ventana de navegación del sistema dependiendo de que sistema operativo tengamos Window, o Mac y debemos localizar dónde tenemos guardado el material adicional que acompaña el libro y seleccionar el paquete con el nombre Assets Capitulo6 dentro de la carpeta Proyecto_6.
Fig. 6.1
Después de seleccionar el paquete se nos aparecerá una ventana en Unity que nos muestra el contenido de este paquete y nos permite seleccionar que queremos importar del paquete. En nuestro caso vamos a dejarlo todo marcado y le daremos al botón Import.
Fig. 6.2
Si lo hemos importado todo correctamente deberías poder ver las siguientes carpetas en la ventana Project.
Fig. 6.3
Ya tenemos preparado el proyecto para seguir todas las pautas del capítulo que es uno de los más importantes si nunca has programado porque en este capitulo vamos a ver los siguientes apartados:
Las funciones que voy a mostrarte son referentes a la clase MonoBehaviour. Este primer apartado quiere ayudarte no solo a que entiendas cómo funcionan si no que aprendas también a consultar la documentación de Unity Scripting API. Puedes acceder desde el siguiente enlace:
https://docs.unity3d.com/es/current/ScriptReference/MonoBehaviour.html
Pero, ¿qué es la documentación de Unity? En la siguiente imagen te muestro con qué te vas a encontrar y cómo puedes utilizar esta documentación de una forma inteligente. He numerado las zonas que tienes que tener en cuenta para mejorar la comprensión.
Fig. 6.4
En el apartado A dispones de la versión de Unity a la que estás consultando la información, no quiere decir que de una versión 5,3 a la 5,4 varíe mucho pero es recomendable saber a qué version accedes en la información.
En el apartado B tenemos dos tipos de documentación, el Manual y el Scripting API. El Manual nos proporciona información de cómo utilizar Unity, sus ventanas paneles y todo lo referente al programa en sí y el apartado de API es toda una recopilación de Clases, funciones, variables, etc. que podemos utilizar en nuestros Scripts para programar en Unity.
En el apartado C verás que puedes seleccionar qué tipo de lenguaje quieres consultar en el apartado Scripting API. Solo hace referencia a las consultas de Scripting. En este libro utilizaremos solamente C#.
El apartado D nos da la posibilidad de buscar una palabra en concreto. Más adelante, cuando tengas dudas sobre algún método en concreto puedes ir directamente al buscador y poner el método que buscas. La documentación te proporcionará una lista con todos los métodos y clases relacionadas con esa palabra.
La zona marcada con una E es la información de la búsqueda en donde te proporcionan descripciones de los métodos y las variables que necesitas.
Por ultimo tienes la sección F que es una lista ordenada alfabéticamente con todas las clases que puedes encontrar en la documentación en el caso de la API, y en el caso del manual una lista organizada por temas referente al programa Unity.
En este enlace verás un apartado Mensajes que en realidad son eventos. Un evento según la programación en C# es cuando ocurre algo. Los eventos habilitan una clase u objeto para notificarlo a otras clases u objetos. La clase que envía el evento recibe el nombre de publicador y las clases que reciben el evento se denominan suscriptores.
Algunas características sobre los eventos:
•El publicador determina el momento en el que se genera un evento; los suscriptores determinan la acción que se lleva a cabo en respuesta al evento.
•Un evento puede tener varios suscriptores. Un suscriptor puede controlar varios eventos de varios publicadores.
•Nunca se generan eventos que no tienen suscriptores.
•Los eventos se suelen usar para indicar acciones del usuario, como los clics de los botones o las selecciones de menú en las interfaces gráficas de usuario.
Dicho lo anterior vamos a poner algunos ejemplos con un ejercicio. Aquí solo te voy a mostrar cómo se escriben dentro de un script y luego explico para qué sirven algunos:
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Evento : MonoBehaviour {void Awake(){Debug.Log(“Esto es el Awake”);}void Start(){Debug.Log(“Esto es el Start”);}void Update() |
{Debug.Log(“Esto es el Update”);}void OnDisable(){Debug.Log(“El objeto está desactivado”);}void OnEnable(){Debug.Log(“El objeto está activado”);}void OnEnable(){Debug.Log(“El objeto está activado”);}void OnMouseDown(){Debug.Log(“El ratón hace click”);}void OnMouseEnter(){Debug.Log(“El ratón esta encima”);}void OnMouseExit(){Debug.Log(“El ratón sale fuera”);}} |
•Awake: es llamado cuando se carga el script y se utiliza para inicializar cualquier variable o estado del juego antes de que comience el juego. Este evento solo se llama una sola vez y después de cargar todos los objetos.
•Start: es llamado cuando se habilita un script y justo antes de llamar a cualquiera de los métodos de Update. Al igual que en el Awake solo se llama una sola vez y se ejecuta cuando activamos el juego.
•Update: repite todo lo que contenga a cada frame o cuadro. Este evento de MonoBehaviour es muy utilizado para crear comportamientos en un juego.
•OnDisable & OnEnable: hemos visto anteriormente cómo podemos activar y desactivar objetos desde la ventana inspector de Unity con estas funciones podemos activar o desactivar el objeto mediante programación.
•OnMouse(Enter,Down,Exit): nos permite saber cuando el usuario realiza una serie de acciones con el ratón.
Estas son algunas de las funcionalidades que podemos encontrar en la programación de videojuegos, a continuación iremos profundizando hasta que comprendas como funciona todo.
2. Clase GameObject
Como hemos hecho con los eventos, ahora vamos a acceder a la documentación de GameObject, si te resulta más cómodo te dejo el enlace a continuación o puedes escribir la palabra GameObject en el buscador de la documentación de Unity :
https://docs.unity3d.com/es/current/ScriptReference/GameObject.html
En la documentación encontramos varios aspectos importantes que vamos a tratar en este apartado, pero antes quiero que entiendas la diferencia entre GameObject en mayúscula y gameObject en minúscula.
Si recordamos cuando creamos un script y lo agregamos o arrastramos encima de un gameObject por ejemplo un cubo, dentro del script para referirnos a el cubo lo escribiremos en minúscula: gameObject. Si queremos hacer referencia a un GameObject externo o crear uno propio utilizaremos GameObject en mayúscula ya que en este caso hacemos referencia a la clase.
Fig. 6.5
En la imagen anterior representamos que un cubo se le añade un script, dentro del script cuando queremos referirnos al propio objeto utilizamos gameObject. En el caso de que el cubo quiera tomar referencia del objeto redondo dentro del script lo escribiremos en mayúscula GameObject.
Ahora en el proyecto de Unity accede a la carpeta Prefabs y arrastra un cubo al escenario o a la ventana Jerarquía como te muestro en la siguiente imagen:
Fig. 6.6
A continuación crea una carpeta nueva dentro de Project con el nombre Scripts. Si no recuerdas cómo se hace puedes seleccionar la carpeta Assets y pulsar en el botón Create y seleccionar la opción Folder. Te aparecerá una nueva carpeta a la que puedes ponerle un nombre, en este caso Scripts.
Fig. 6.7
Dentro de la carpeta Scripts vamos a crear un nuevo script con nombre Ejemplo1. Para crear un nuevo script hacemos doble clic encima de la ventana Scripts y dentro de ella hacemos clic en el botón derecho del ratón y en el menu que nos parece seleccionamos la opción Create > C# Script. Se nos aparece un nuevo Script que podemos renombrar, en este caso con el nombre Ejemplo1.
Fig. 6.8
Ahora seleccionamos el Cubo haciendo clic en la escena encima del objeto con el botón izquierdo o desde la ventana Jerarquía encima del nombre del objeto, en este caso con nombre cube. Luego arrastramos el script que hemos creado dentro de la ventana inspector o encima del nombre del objeto cube, como te muestro en la siguiente imagen:
Fig. 6.9
Para finalizar la preparación de la escena vamos a agregar otro prefab a la escena como hemos hecho con el cubo. Añadimos una esfera pero esta no debe llevar ningún script. Te muestro cómo debería quedar la escena:
Fig. 6.10
Ahora solo nos queda guardar la escena pero antes vamos a crear una carpeta en la ventana Project con el nombre de Escenas, como hemos hecho con la carpeta script. Para guardar la escena simplemente accedemos al menú y seleccionamos la opción File >SaveScene te aparecerá un ventana de tu sistema operativo dentro de la carpeta Assets, selecciona la carpeta que has creado llamada Escenas y ponle el nombre de Escena 1. Tu escena ha quedado guardada y podemos empezar el ejercicio.
Fig. 6.11
A partir de ahora los enunciados van a ser de la siguiente manera para agilizar el temario.
#1 En una nueva escena crear 2 GameObjects un cubo y una esfera (puedes utilizar los Prefabs del material importado). Añadir un script al cubo con nombre Ejemplo1. Para acceder al Script hacemos doble clic encima del archivo Script Ejemplo1 y Unity abrirá el editor Monodevelop y escribiremos el siguiente Script:
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Ejemplo1 : MonoBehaviour{void Start(){Debug.Log(gameObject.name);}} | Si te fijas dentro del Debug.Log hemos utilizado el gameObject en minúscula para referirnos al propio gameObject que en este caso es el cubo.También debes tener en cuenta que las clases tienen métodos y atributos uno de sus atributos es “name” que hace referencia al nombre del objeto. |
Fig. 6.12
Como puedes ver en la imagen anterior en consola se nos aparece el nombre Cube cuando activamos o ejecutamos la escena.
#2 Ahora vamos a cambiar el nombre que tiene el cubo. Si miras la documentación https://docs.unity3d.com/es/current/ScriptReference/GameObject.html verás que tenemos una variable o atributo llamado name que nos permite acceder al nombre del objeto, y en el ejemplo anterior lo hemos utilizado para que nos muestre el nombre, pero también podemos utilizarlo para cambiar el nombre.
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Ejemplo1 : MonoBehaviour{void Start(){gameObject.name = “Micubo”Debug.Log(gameObject.name);}} | Cuando activemos el script, es decir cuando le demos al play verás como cambia el nombre del cubo y como por consola aparece Micubo. |
Fig. 6.13
En el ejemplo anterior verás que mientras ejecutemos el juego el nombre del cubo cambia por el nombre de Micubo y puedes verlo en la ventana Jerarquía y en la ventana Inspector.
Hemos visto cómo acceder al gameObject en el que hemos aplicado el script, pero la pregunta es ¿cómo accedemos a un objeto externo?
#3 Ahora vamos a acceder desde el script ejemplo1 del cubo a los componentes del objeto Esfera, arrastrando el objeto a una variable pública de tipo GameObject.
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Ejemplo1 : MonoBehaviour{ public GameObject miEsfera;void Start() | Primero creamos una variable publica de tipo GameObject que nos permite almacenar objetos. La hacemos publica para que aparezca en la ventana inspector. |
{gameObject.name = “Micubo”Debug.Log(gameObject.name); Debug.Log(miEsfera.name); }} | Lo segundo es que muestre por la pantalla de la consola el objeto miEsfera, pero esto no va a funcionar a no ser que al volver a Unity arrastremos el objeto Esfera encima de la ventana inspector, en donde está la variable miEsfera representada. |
Para el ejemplo 3 te muestro cómo queda una variable al hacerla pública en la ventana inspector.
Fig. 6.14
Como puedes ver en la imagen anterior, la variable al hacerse pública se muestra en la ventana Inspector con una caja de textos que pone None (Game Object) esto significa que no hay un objeto asignado para esta variable y debemos asignarlo. Ahora te muestro cómo podemos asignarle manualmente un objeto a esta variable.
Si hacemos clic encima del punto o símbolo en forma de punto que encontramos al final de la caja de textos accederemos a una ventana flotante en donde podemos seleccionar el objeto que queremos.
Fig. 6.15
Otra forma de realizar la acción anterior es seleccionar el objeto desde la ventana Jerarquía y arrastrarla encima de la caja de textos de la variable Unity lo asocia automáticamente.
Fig. 6.16
Ahora ejecutamos el juego y podremos comprobar en la consola cómo nos aparece el nombre del objeto Cube con el nombre cambiado y el nombre del objeto externo Sphere que hemos asociado manualmente desde Unity.
Fig. 6.17
#4 Nuestro siguiente paso es buscar el objeto esfera desde el propio script ejemplo1, pero debemos borrar la variable que hemos hecho anteriormente como te muestro en el siguiente script.
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Ejemplo1 : MonoBehaviour{ public GameObject buscarEsfera; |
void Start(){gameObject.name = “Micubo”Debug.Log(gameObject.name); this.buscarEsfera= GameObject.Find(“Sphere”);}} |
Creamos una variable de tipo GameObejct con un nombre el que quieras en este caso le he puesto buscar Esfera.el anterior script para eliminar la referencia que hemos puesto en la actividad anterior. También he borrado el Debug.Log que me mostraba el nombre de la esfera y solamente he dejado la del cubo.Al declarar la variable utilizo un método que puedes ver en la documentación llamado find. Este método buscará un objeto en la escena con el nombre que le pongamos entre paréntesis y comillas, en este caso el valor que le paso es el nombre del objeto Sphere. |
Una vez volvamos a Unity veremos que en la ventana inspector que tenemos una nueva variable con el nombre buscarEsfera, pero vuelve a estar vacía. Esta variable tomará la referencia de la esfera o, dicho de otro modo, buscará el objeto con nombre Sphere cuando ejecutemos el juego. En la siguiente imagen te muestro cómo se verá antes y después de ejecutar el juego.
Fig. 6.18
#5 Otra forma de buscar objetos sería igual que la anterior pero utilizando Tags (Etiquetas). Para realizar la actividad vamos a utilizar otro de los Prefabs que disponemos en el proyecto. Selecciona el Prefab Capsule y arrástrala a la escena. Teniendo seleccionada la cápsula accedemos a la ventana Inspector y en el apartado Tag desplegamos su menú y seleccionamos la opción Player.
Fig. 6.19
Ahora ya disponemos de un tercer objeto en escena llamado Capsule que ademas tiene una etiqueta con el nombre Player que nos permite desde el script del cubo acceder a él. Seguimos utilizando el mismo script Ejemplo1 como te muestro a continuación:
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Ejemplo1 : MonoBehaviour{public GameObject buscarEsfera;public GameObject buscarCapsula;void Start(){gameObject.name = “Micubo”Debug.Log(gameObject.name);this.buscarEsfera = GameObject.Find(“Sphere”); this.buscarCapsula = GameObject.FindGameObejctWithTag (“Player”);}} |
Creamos una variable pública de tipo GameObject con nombre buscarCapsula, dentro del evento Start declaramos el valor de buscarCapsula que es un GameObject con una etiqueta “Player”.Cuando ejecutes el juego en esta variable aparecerá contenido el objeto capsule. |
Cuando vuelvas a Unity verás que en la ventana Inspector tenemos las variables declaradas públicas vacías, en el momento que ejecutemos el juego veremos cómo toman la referencia de los objetos.
Fig. 6.20
#6 Para finalizar este apartado tienes que saber que también puedes crear GamesObjects utilizando el constructor. El constructor de una clase GameObject tiene el objetivo de que puedas crear nuevos objetos de esa misma clase (como todos los constructores). Para que entiendas mejor a lo que me refiero es que podemos crear nuevos objetos dentro de la escena. Primero te voy a invitar a consultar la documentacion accediendo a este enlace.
https://docs.unity3d.com/es/current/ScriptReference/GameObject-ctor.html
Cuando creamos otro objeto este se crea por defecto con un componente Transform que veremos mas adelante en detalle.
A continuación te muestro como podemos crear un objeto nuevo desde un script.
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Ejemplo1 : MonoBehaviour{public GameObject buscarEsfera;public GameObject buscarCapsula; public GameObject nuevo;void Start(){gameObject.name = “Micubo”Debug.Log(gameObject.name);this.buscarEsfera = GameObject.Find(“Sphere”);this.buscarCapsula = GameObject.FindGameObejctsWithTag (“Player”); this.nuevo= new GameObject (“Nuevo”);}} |
Cuando actives el juego verás que se te aparece un objeto llamado Nuevo. Para mostrarte cómo se ve en Unity he capturado dos imágenes una antes de ejecutar el juego y la segunda imagen ejecutando el juego.
Fig. 6.21
Fig. 6.22
El nuevo objeto que se crea solamente tiene un componente transformación y nombre porque todo objeto en Unity debe tener estos componente como mínimo. También hay que decir que este objeto no tiene nada más y por ese motivo no se puede ver en la ventana escena. A estos objetos les llamamos objetos vacíos y ya los hemos utilizado para ordenar escenarios utilizándolos como padre de los demás objetos. Si tienes dudas puedes revisar el capítulo 4.
3. Acceder a los componentes
Seguimos con los GameObjects pero esta vez vamos a ver cómo acceder a los componentes de estos mismos. En los primeros capítulos vimos cómo crear gameObjects y cómo añadir componentes como un collider o materiales; ahora vamos a ver cómo podemos hacer esto mediante scripts. Supongo que te preguntarás por qué tienes que aprender a hacerlo mediante programación cuando puedes hacerlo por el editor; pues la respuesta es muy simple, en ocasiones deberás acceder mediante scripts para poder automatizar componentes en concreto, y porque te da una libertad increíble para trabajar en tus futuros proyectos.
Sé que me repito, pero te aconsejo que tengas la documentación accesible ahora que ya sabes cómo consultarla.
https://docs.unity3d.com/540/Documentation/ScriptReference/GameObject.html
Para explicar el siguiente apartado realizaremos varios ejemplos. Crea una nueva escena accediendo al menú principal en File > New Scene como te muestro en la siguiente imagen:
Fig. 6.23
Ahora verás que la escena ha quedado limpia. Seguidamente accede al menú principal otra vez y accede a la opción Save Scene. Ponle nombre Escena 2 y guarda la escena en la carpeta de Escenas. Dentro de la Escena 2 arrastra un Prefab cubo como te muestro en la siguiente imagen:
Fig. 6.24
Ahora crearemos un objeto vacío de forma manual, es decir, sin programación. Para ello hacemos clic encima de la ventana Jerarquía en el botón Create y seleccionamos la primera opción Create Empty. Automáticamente se nos aparecerá en la lista un nuevo objeto con nombre por defecto GameObject.
Fig. 6.25
#1 En el gameObject vacío le añadimos un script llamado Components. Cuando crees el nuevo script y le hayas puesto nombre guárdalo en la carpeta Scripts para mantener ordenado el proyecto. Dentro del Script Components vamos a cambiar el nombre y vamos a mostrar la posición en (x,y,z) por consola. Esto significa a que vamos a acceder a sus componentes, el del nombre ya lo hemos visto a continuación te muestro el script.
using System.Collections;using System.Collections.Generic;using UnityEngine;public class Components : MonoBehaviour {void Start(){gameObject.name = “Esfera”}void Update(){ Debug.Log(gameObject.transform.position);}} |
Primero, como el script está dentro del objeto utilizamos directamente gameObject dentro de la función Start. Como vimos en el apartado anterior para cambiar el nombre utilizamos .name y le damos el valor del nombre entre comillas.Después, dentro de la función Update utilizamos el Debug.Log y dentro de los paréntesis hacemos referencia al objeto en sí como gameObject, seguido de un punto para acceder al componente transform. Esto nos devuelve 3 valores, uno para cada eje (x,y,z)Puedes cambiar el valor de x, y, z manualmente desde la ventana inspector para ver como cada vez te muestra por consola un valor distinto. Esto sucede porque dentro de la función update ser repite continuamente. |
A continuación te muestro el resultado que me muestra la ventana Inspector y la consola.
Fig. 6.26
Este ejemplo anterior simplemente es para mostrarte de que mediante programación podemos controlar con mucha precisión ciertos aspectos de los objetos. También verás que por consola solamente nos muestra un decimal en la posición. Antes de continuar quiero que entiendas que las transformaciones son de tres tipos:
•Posición: que nos permiten desplazar los objetos por toda la escena.
•Rotación: que nos permite rotar los objetos
•Escalado: que nos permite cambiar el tamaño de los objetos.
Todas las transformaciones se basan principalmente en tres ejes X, Y, Z que nos dan una posición, una rotación y un escalado más precisos. Estas tres coordenadas pueden ser de utilizadas de un modo Global o un modo Local. De momento vamos a ir viendo poco a poco los 3 tipos y cómo podemos acceder a ellos.
#2 Ahora creamos un nuevo script que llamaremos ComponenteExterior.cs; vamos a ver cómo accedemos al componente transform de un objeto externo, en este caso del cubo que tenemos en escena. Primero selecciona el GameObject vacío y le eliminar el script que tenía anteriormente de la siguiente manera:
Selecciona el GameObject vacío y, accediendo a la ventana Inspector en el componente Script, haz clic encima del símbolo que te marco en la imagen siguiente y en el menú que aparece seleccionamos la opción Remove Component; el componente script será eliminado.
Fig. 6.27
Ahora, si ya has creado el nuevo script con el nombre de ComponenteExterior.cs, se lo agregamos al Game Object vacío. El componente nuevo de tipo script debe quedar como en la siguiente imagen:
Fig. 6.28
A continuación te muestro el script que debe mostrarte la posición en cada eje por separado del Cubo. Recuerdo que estos ejercicios son para familiarizarnos con la forma de acceder a los componentes.
using System.Collections;using System.Collections.Generic;using UnityEngine;public class ComponenteExterior : MonoBehaviour |
{public GameObject miCube;public float cubeX;public float cubeY;public float cubeZ;void Start(){this.miCube = GameObject.Find(“Cube”);this.cubeX = miCube.transform.position.x;this.cubeY = miCube.transform.position.y;this.cubeZ = miCube.transform.position.z;Debug.Log(cubeX);Debug.Log(cubeY);Debug.Log(cubeZ);}} |
Primero debemos crear una variable de tipo GameObject para contener al cubo que he llamado miCubo y luego como necesitamos mostrar 3 valores con decimales he creado 3 variables de tipo float para los ejes del cubo x,y ,z.Dentro de Start primero vamos a buscar el objeto Cube que en este caso como solo hay un cubo podemos utilizar el método Find con el nombre “Cube”.Ahora ya tenemos el cubo dentro de una variable y podemos acceder a su primer eje de transformación. Por eso cojo las variables que he creado para almacenar el valor en x,y,z. Estas variables serán igual a la variable miCube, que en realidad es el cubo y que accedemos a su componente transform en la posición x,y ,z.Por último, solo tenemos que mostrar las variables dentro del Debug.Log. |
En la siguiente imagen te muestro cómo queda la ventana inspector y el resultado en consola:
Fig. 6.29
El componente de transformación de momento lo dejaremos aquí y lo retomaremos más adelante con ejemplos mucho más prácticos. Ahora vamos a ver cómo podemos acceder a otro tipo de componentes. Esta vez vamos a guardar la información en variables para mayor comodidad.
#3 Ahora, ¿cómo lo hacemos para acceder a los otros componentes? Por ejemplo, ¿cómo podemos acceder al collider del cubo y cambiarle el tamaño de su collider?
Fig. 6.30
Si te fijas en la imagen anterior verás que el cubo tiene un componente llamado Box Collider. Dentro de este componente tiene un parámetro llamado Size que es el encargado de darle un tamaño en los ejes x, y, z. Para poder guardar la información en una variable de este componente utilizamos un método llamado GetComponent que vas a ver en el script. Si lo deseas puedes acceder a este enlace para más información de este método:
https://docs.unity3d.com/es/current/ScriptReference/GameObject.GetComponent.html
Para la siguiente actividad elimina el script del GameObject vacío y crea uno nuevo con el nombre de ComponenteCollider.cs y agrégalo a este.
using System.Collections;using System.Collections.Generic;using UnityEngine;public class ComponenteCollider : MonoBehaviour { |
public GameObject miCube;public BoxCollider miCollider;void Start(){this.miCube = GameObject.Find(“Cube”);this.miCollider = this.miCube.GetComponent<BoxCollider>();this.miCollider.size = new Vector3 (5f,5f,5f);}} |
Primero debemos crear una variable pública de tipo GameObject para contener al cubo que he llamado miCubo y luego necesitamos un contenedor de tipo BoxCollider para almacenar la información del Collider del cubo.Dentro de Start primero vamos a buscar el objeto cube; que en este caso como solo hay un cubo podemos utilizar el método Find con el nombre “Cube”.Ahora ya tenemos el cubo dentro de una variable pero todavía no podemos acceder a su componente BoxCollider, primero debemos obtener acceso y es por ese motivo que hemos creado la variable miCollider. Para tener permiso utilizamos el método GetComponentseguido del tipo entre <> y acabamos con();Ahora la variable miCollider puede acceder a las características del componente BoxCollider y podemos definir un tamaño.El tamaño necesita tres parámetros o valores decimales y por eso hemos creado un Vector3. Si no comprender muy bien que es no pasa nada porque lo veremos en otro tema.Si todo ha salido bien deberías ver como el collider del cubo se hace 5 unidades más grande. |
En la imagen siguiente te muestro cómo ya hemos hecho en los ejemplos anteriores, cómo accedemos a un objeto externo y a su componente desde el script del GameObject vacío. La variable pública MiCube de tipo GameObject toma de referencia el Objeto Cube de la escena y la variable pública MiCollider de tipo BoxCollider toma de referencia del BoxCollider del objeto Cube.
Fig. 6.31
Con el juego en ejecución podrás ver, si seleccionas el cubo, cómo su componente Collider tiene un tamaño de 5 unidades para todos sus ejes como te muestro en la siguiente imagen:
Fig. 6.32
Hasta ahora hemos demostrado que con un script podemos tener acceso a los objetos y a sus componentes, tanto al propio objeto que tiene el script como a un objeto externo. En el próximo apartado vamos a ver en mayor detalle el componente de transformación.
4. Entender las transformaciones
Ya sabemos cómo podemos acceder a gameObjects y a sus componentes, es lo que necesitamos para empezar a trabajar con las transformaciones.
En el inspector de Unity tenemos tres opciones de transformación que son posición, rotación y escalado. Estas tres opciones se caracterizan por un vector3 en cada una de sus transformaciones. Un vector 3 se caracteriza por un valor en x,y,z. Estos valores son coordenadas que nos permiten posicionar, rotar o escalar un objeto.
Si queremos empezar mover nuestros objetos vamos a tener que entender que es un Vector3.
Fig. 6.33
En el inspector de Unity tenemos tres opciones de transformación que son posición, rotación y escalado. Estas tres opciones se caracterizan por un vector3 en cada una de sus transformaciones. Un vector 3 se caracteriza por un valor en x, y, z. Estos valores son coordenadas que nos permiten posicionar, rotar o escalar un objeto.
Puedes mirar la documentación referente a la clase Transform accediendo al siguiente enlace:
https://docs.unity3d.com/540/Documentation/ScriptReference/Transform.html
Para empezar a ver cómo funciona vamos a crear una nueva escena con el nombre Escena3. Guárdala en la carpeta Escenas como hemos hecho desde el comienzo del capítulo. Los objetos que vamos a utilizar son un cubo y una esfera, arrastra estos objetos de los Prefabs o si lo prefieres puedes crear los objetos tú mismo. En el caso de que crees los objetos desde el menú principal accediendo a GameObject > 3D Object > Cube u otro tipo de objeto, puedes utilizar los materiales que dispones en la carpeta Materiales en la ventana Project. Para diferenciar estos objetos vamos a ponerles nombres según el color que tienen; en el caso del ejemplo que voy a mostrar el cubo tendrá el nombre Verde y la esfera tendrá el nombre Amarillo, como te muestro en la siguiente imagen:
Ücretsiz ön izlemeyi tamamladınız.