Aprende C# con Unity - Tu primer script

Si nunca antes has creado un script, no te preocupes, no es exactamente ciencia de cohetes. Aprender a programar es como aprender un nuevo idioma, pero estás “hablando” con la maquina. Al igual que un lenguaje humano se puede dividir en oraciones que consisten en un sustantivo y un verbo, los lenguajes de programación se pueden dividir en variables (el sustantivo) y métodos (el verbo) que a menudo se combinan en enunciados (la oración). Aprender a programar simplemente requiere un poco de esfuerzo para aprender el vocabulario y luego juntarlo de una manera lógica.

El script que crearemos contendrá el código al que nos referimos como una “clase”. Una clase a menudo se relaciona conceptualmente con un plano desde el que puede crear objetos. En Unity, usarás tu clase para crear “componentes” que se conectan a “GameObjects” de forma muy similar a como puedes agregar un colisionador de física o un componente de audio. Al escribir sus propios scripts, puede tener una funcionalidad completamente nueva y personalizada de su propio diseño.

GitHub Gitlab

En el panel Project de Unity, seleccione el botón “Create”, desde el cual tiene la opción “Script C#”. Alternativamente, también puede usar la barra de menú, “Assets-> Create-> Script C#”, pero de todos modos tendrá que volver al panel del proyecto para nombrar y abrir el nuevo archivo. De forma predeterminada, habrá creado un archivo llamado “NewBehaviourScript” y el nombre del archivo se seleccionará para que usted lo edite. Por ahora solo escribe “Demo” para el nombre de nuestro script.


Consejo

El nombre de archivo que escriba para su script es importante por una variedad de razones:

  • El nombre del archivo se usará automáticamente como el nombre de la clase en el código de plantilla que crea automáticamente.
  • Hay algunas reglas sobre qué nombres son legales para usar en una clase:
  • Debe comenzar con una letra y debe consistir solo en caracteres alfanuméricos. Si intentó ingresar “1Bunny”, obtendrá un error (aparecerá un signo de admiración rojo en la consola y en la parte inferior de la ventana de Unity) con el siguiente mensaje, " Assets/1Bunny.cs (4,14): error CS8025: error de análisis “. Tenga en cuenta que no podrá jugar su juego mientras haya errores.
  • No puede soportar espacios. Si trataste de ingresar un nombre con un espacio, como “Mi clase”, Unity intenta arreglarlo por ti (pero solo a medias) y crea el código de plantilla con un nombre de clase de “Mi Clase” aunque abandone el espacio en el nombre del archivo. Luego, cada vez que intente agregar el script a un objeto, Unity se quejará de usted: " No se puede agregar el script. No se puede agregar el componente ‘ScriptName’ porque no existe. Verifique si el nombre del archivo y el nombre de la clase coinciden. “Recuerda esto por si alguna vez cambias el nombre de la clase en un momento posterior; debes cambiar el nombre del archivo para que coincida.
  • Los nombres de tus clases deben ser únicos: no puedes tener dos clases llamadas “Boogers” sin importar lo gracioso que pienses que sería. De nuevo, Unity intentará solucionar este problema automáticamente y enumerará su nombre de archivo y clase (agregue un número al final) para que sea único.
  • Si nombra una clase con el mismo nombre que algo que Unity ya ha tomado, como “Light”, recibirá una advertencia, “Script ‘Light’ tiene el mismo nombre que el componente incorporado de Unity. AddComponent y GetComponent no funcionarán con esta secuencia de comandos. “El nombre duplicado se permite aquí porque la Luz de Unity se definió en un " espacio de nombres " separado, que es un tema avanzado para más adelante. Tenga en cuenta que aunque puede jugar su juego con advertencias presentes, un buen programador lo tratará como si hubiera sido un error y hará todo lo posible para resolverlo.
  • Los programadores pueden ser muy selectivos y tienen pautas para casi todo, incluso los nombres que usa e incluso el caso de las letras con las que escribe. Un buen nombre de clase será un sustantivo o frase nominal y utilizará “PascalCasing”, donde la primera letra de cada palabra es mayúscula y todas las demás letras son minúsculas. Tenga en cuenta que estas pautas no son obligatorias, pero son una buena práctica. Lea más sobre convenciones y pautas de nombres  en este post que escribir sobre buenas prácticas.

Ahora que hemos creado un script, podemos hacer doble clic para abrirlo. MonoDevelop o en su defecto Visual Studio debe abrirse como su editor predeterminado (si aún no ha instalado ningún otro editor de código), y es el que le recomiendo que use para seguir. Con Visual Studio abierto, debería haber cargado automáticamente su script, y debería ver algo como lo siguiente:


using UnityEngine;
using System.Collections;
 
public class Demo : MonoBehaviour {
 
    // Use this for initialization
    void Start () {
 
    }
 
    // Update is called once per frame
    void Update () {
 
    }
}

Consejo
Si has visto otros tutoriales de C# para principiantes, se sorprenderá al descubrir que no estará escribiendo una estructura de programa típica. No necesitará escribir un método “main”, porque está escribiendo scripts que se conectan a un sistema existente, no escribiendo todo el sistema usted mismo.

Las primeras dos líneas de nuestro script se refieren a algo llamado espacios de nombres. Volviendo a nuestra analogía de que un lenguaje de programación es como un lenguaje humano, puedo decir que las diferentes palabras significan cosas diferentes según el idioma, y ​​algunas veces incluso las palabras dentro del mismo idioma pueden tener diferentes significados dependiendo del contexto. Por ejemplo, una palabra hablada que suena como “if” podría ser interpretada como “sí” por un individuo que habla inglés, o como algo percibido por la vista. Cuando decimos que estamos usando un espacio de nombres, estamos diciéndole a la maquina el contexto con el que interpretar las palabras que escribiremos. Las palabras que comprenderá automáticamente se denominan “bibliotecas” de código y están destinadas a ser muy reutilizables.


Consejo
El espacio de nombre “UnityEngine” es lo que permite que su script herede de MonoBehaviour, y le permite hacer referencia a cosas como GameObjects, Lights y Cameras, etc. en el código. El espacio de nombres System.Collections le permite usar corrutinas (un sistema que hace que sea fácil hacer que las cosas sucedan con el tiempo). Otros espacios de nombres que puede ver son “UnityEngine.UI”, que le permite hacer referencia a elementos de los nuevos componentes de la interfaz de usuario de Unity, como botones e imágenes, “UnityEngine.Events” y “UnityEngine.EventSystems” para eventos más avanzados de programación. “System” (sin “.Collections”) para sistemas y mucho más, System.IO para leer y escribir archivos en el disco, y “System.Collections.Generic” para aprovechar los genéricos, que es otro tema avanzado que podemos cubrir más tarde.

Como un principiante, ocasionalmente, puede seguir con un ejemplo que muestra el código sin mostrar que requería una biblioteca (lo hago en varias de mis entradas). Luego, cuando escribe el ejemplo, se encuentra con un error feo. Podemos simular uno ahora, eliminando la primera línea, " using UnityEngine;" de nuestro script. Guarde el archivo e intente construir la solución. El editor de código debe mostrar una línea roja en nuestra definición de clase “public class Demo : MonoBehaviour {” con el siguiente mensaje de error " No se pudo encontrar el tipo o el nombre del espacio de nombres ‘MonoBehaviour’. ¿Te estás perdiendo una directiva de uso o una referencia de ensamblaje?“En realidad, es bastante fácil resolver este problema. Puede hacer clic con el botón derecho en la palabra MonoBehaviour (porque esa es la palabra que se menciona en el mensaje de error) y debería ver una opción para “Resolver”, y la opción superior será la misma línea que eliminé antes. Visual Studio vuelve a insertar la línea que necesitamos y ahora debería poder construir el script nuevamente sin problemas.

/img/codebackdoor/learncsharpunity/01.png
.

Después de las dos líneas del espacio de nombres, hay una línea vacía. Las líneas vacías y otros “espacios en blanco”, como las pestañas y los espacios adicionales, etc. no significan nada para el código en sí y solo sirven para la legibilidad humana.

La siguiente línea es la declaración de nuestra clase. Tiene varias palabras clave:

  • public : esto significa que otros scripts tendrán conocimiento de este script y podrán trabajar con él. A veces puede ver las palabras “protected” o “private” en su lugar, pero esos son temas más avanzados y pueden omitirse por el momento.
  • Class : así es como sé que mi guión es una “clase”. Hay varios tipos de cosas que se pueden definir, algunas de las cuales incluyen: struct, enum e interface, pero nuevamente, esos son temas más avanzados y pueden omitirse por el momento.
  • Demo : este es el nombre de la clase y también debe ser del mismo nombre que el archivo que creamos. Al igual que puede agregar componentes a GameObjects como colisionadores o luces, ahora podrá agregar un componente llamado “Demo” que eventualmente hará algo … (pero aún no hemos implementado nada)
  • MonoBehaviour : tenga en cuenta que esta palabra está separada por dos puntos. Significa que nuestro script hereda de otra clase (con ese nombre). La herencia es otro tema avanzado, pero por ahora es suficiente saber que tiene acceso a un montón de funcionalidades debido a eso.

La línea de declaración de clase termina con un corchete abierto “{”. Habrá un corchete de cierre “}” en la última línea del script. Todo lo que está entre esos dos corchetes son los contenidos de nuestra clase, y en su mayor parte consistirá en las declaraciones e implementaciones de variables y métodos.

En las líneas 6 y 11, verá una barra diagonal doble, “//”. Esto indica algo llamado “comentario”. Al igual que el espacio en blanco, un comentario es algo que existe para ayudar a la lectura, no el código en sí. Cualquier cosa que siga una doble barra, hasta llegar a la siguiente línea nueva, es parte del comentario. La gente usa comentarios para explicar qué se supone que debe hacer el código y para dar pistas sobre cómo se debe usar. Si necesita un comentario muy largo, puede usar “/” para comenzar y “/” para finalizar un comentario. Cualquier cosa intermedia se considerará parte del comentario, incluso si abarca múltiples líneas nuevas.


Consejo
Puede alternar las líneas de un script para que sea un comentario, hacer clic con el botón derecho y seleccionar “Alternar los comentarios de línea”. A veces hago esto cuando tengo un “error” complicado (un error en mi código o lógica) y quiero aislar partes de mi código para que entiendan qué está pasando. Puedo resaltar grandes secciones de código y desactivarlo, por lo que es un comentario. Cuando esté listo, puedo volver a encenderlo con el mismo comando.

El código de la plantilla que se generó para nosotros contiene dos métodos, uno llamado “Start” (línea 7) y el otro se llama “Update” (línea 12). En general, puede nombrar un método como quiera, aunque hay algunas reglas y convenciones, al igual que hay para nombrar la clase. Sin embargo, estos dos métodos son especiales y Unity los “llamará” automáticamente. Esta funcionalidad se obtiene porque “heredamos” de “MonoBehaviour” en nuestra definición de clase. Consulte este  enlace para obtener más información sobre lo que puede hacer un MonoBehaviour.

Todos los métodos tienen algo llamado firma que incluye tres cosas:

  • Un tipo de devolución
  • El nombre del método
  • Un conjunto de parámetros

Los dos métodos definidos en nuestro script tienen un tipo de retorno de “void” que significa que no devuelve un valor, y tienen un conjunto de parámetros vacíos, porque no hay nada entre los paréntesis de apertura y cierre que siguen al nombre del método. Voy a profundizar en la explicación de las variaciones de estas firmas en una lección futura. Cada método tiene sus propios corchetes abiertos y cerrados “{}” al igual que la clase. Cualquier “declaración” de código entre esos dos corchetes se realizará siempre que el método sea “llamado”. Actualmente nuestros métodos no tienen ninguna declaración dentro de ellos. Esto significa que a pesar de que nuestros métodos serán llamados, nada sucedera.

Una declaración es a menudo la combinación de un método y una variable, y siempre termina en un punto y coma, al igual que nuestras oraciones escritas a menudo terminan con una marca como un punto. Para nuestro primer ejemplo, simplemente hagamos que la computadora nos responda. Entre los paréntesis del método de Start, agregue la siguiente línea:


Debug.Log("Tiempo: " + Time.timeSinceLevelLoad);

Consejo
Debe tener mucho cuidado al escribir los ejemplos (o copiarlos y pegarlos) exactamente como se presentan o es probable que genere errores en su código. La ortografía errónea de una variable o método, el uso incorrecto de una letra para una llamada u olvidar el punto y coma al final de la línea son errores comunes entre los principiantes.

Guarde el script, luego regrese a Unity. Cree una nueva escena y adjunte el script “Demo” a la cámara arrastrándola y soltándola desde el panel del proyecto hasta el objeto de la cámara en el panel de jerarquía. Alternativamente, puede seleccionar la cámara principal y usar el botón de inspector “Add Component” y luego escribir el nombre “Demo” y presionar Enter.

Reproduzca la escena y se imprimirá un mensaje en la ventana de la consola. Tenga en cuenta que si la ventana de la consola no está abierta, puede abrirla desde la barra de menú “Windows-> Console”. También verá el último mensaje de la consola en la parte inferior de la ventana de Unity. El mensaje que se muestra es “Tiempo: 0”.

¿Entonces qué pasó? Unity llamó al método “Inicio” de nuestro script cuando nuestro script se terminó de cargar. A su vez llamamos a un método llamado “Log” en una clase llamada “Debug” y pasamos un solo parámetro que era un mensaje que nos indicaba qué hora era. En este ejemplo, el mensaje se crea dinámicamente como la adición de la palabra “Tiempo:” y el tiempo que realmente es cuando se ejecuta la instrucción, y esa información se encuentra dentro de la clase “Time” por una variable llamada “timeSinceLevelLoad”.

Nuestro script conocía las clases Debug y Time debido al espacio de nombres que estamos usando. Los contenidos de las clases (los métodos y las variables) son accesibles mediante algo llamado notación de puntos (el período que los separa).

Para ayudar a ilustrar la idea de que el mensaje se generó dinámicamente, y para mostrar el poder de una “variable”, mueva la instrucción desde el interior del método de Start al interior del método de Update. Reproduzca la escena de nuevo y la ventana de la consola se llenará rápidamente con mensajes, y cada uno mostrará una hora diferente pero actual. Esto se debe a que Unity llama automáticamente el método de “Update” una vez por cada fotograma que se reproduce (esto puede ser de 30 a 60 veces por segundo o más), y la clase de Time actualiza continuamente el valor almacenado en la variable que están haciendo referencia.


/img/codebackdoor/learncsharpunity/02.gif
.
Resumen
En esta lección cubrimos cómo crear un nuevo script de C# dentro de Unity. Introdujimos un nuevo vocabulario de programación y discutimos cada línea de la plantilla de código predeterminada. Escribimos una primera línea de código y vimos cómo nuestro script se podía adjuntar a un objeto de juego como componente.
Siguiente - Variables
/img/ref.png
.