Buscar en Unity

Codificación en C# en Unity para principiantes

Quieres empezar a aprender a codificar en Unity para poner en marcha tu primer juego, pero no sabes por dónde comenzar. Nosotros asumimos el esfuerzo. Lo que sigue es un desglose de los elementos de scripting en Unity y algo de material didáctico que puedes usar para realizar proyectos más avanzados como "Space Shooter". Esto debería cubrir tus necesidades en las siguientes áreas: los rudimentos de la codificación, como variables, funciones y clases, y cómo utilizarlas.

Haz clic aquí si eres un programador experimentado pero nunca has usado Unity.

¿Qué es el scripting en Unity?

El scripting les indica a nuestros GameObjects cómo comportarse; son los scripts y los componentes añadidos a los GameObjects, y cómo interactúan entre sí, lo que crea tu jugabilidad. Ahora bien, el scripting en Unity difiere de la pura programación. Si has hecho algo de programación pura, por ejemplo, creaste una aplicación en ejecución, debes comprender que en Unity no necesitas crear el código que ejecuta la aplicación, ya que Unity lo hace por ti. En lugar de ello, te concentras en la jugabilidad en tus scripts.

Unity ejecuta un bucle enorme. Lee todos los datos que hay en la escena de un juego. Por ejemplo, lee las luces, las mallas, cuáles son los comportamientos, y procesa toda esta información para ti.

Si piensas en la televisión, donde, por ejemplo en Norteamérica, tienes 29,5 frames/segundo, Unity tiene que hacer lo mismo. Se trata de ejecutar frames específicos únicos, uno tras otro. Orientas a Unity con las instrucciones que escribes en tus scrips, y Unity las ejecuta frame tras frame tan rápido como puede.

Lograr una velocidad de frames alta no solo significa que tu juego se verá más fluid, sino que tus scripts se ejecutarán también con más frecuencia, haciendo que los controles sean más receptivos.

¿Qué lenguajes puedes usar en Unity?

Un script debe estar vinculado con un GameObject en la escena para poder ser invocado por Unity. Los scripts se escriben en un lenguaje especial que Unity puede entender. Y, es a través de este lenguaje que podamos hablarle al motor y darle nuestras instrucciones.

El lenguaje que se usa en Unity se denomina C# (se pronuncia con una C aguda). Todos los lenguajes que Unity emplea son lenguajes de scripting orientados a objetos. Al igual que cualquier lenguaje, los lenguajes de scripting tienen sintáxis, o partes de diálogo, y las partes principales se denominan variables, funciones y clases.

Si estás usando una versión de Unity hasta 2017.3, notarás que tiene un editor de texto llamado MonoDevelop: este puede ayudarnos a completar tu código, nos permitirá saber si estás escribiendo una fragmento de código incorrecto, y nos ayuda a tomar atajos. A partir de 2018.1, también puedes usar Visual Studio for Unity Community, u otros editores de texto como Visual Studio, Notepad o Sublime Text.

Este es un script con un ejemplo de código (que se basa en el tutorial Coding in Unity for the Absolute Beginner (Codificación en Unity para principiantes)):

sample code unity

Como puedes ver, hay variables, funciones y clases.

¿Qué función cumplen?

Las variables contienen valores y referencias a objetos (puedes ver los objetos como variables "más grandes"). Son como una caja que contiene algo que nosotros vamos a usar. Las variables comienzan con una minúscula.

Las funciones son colecciones de código que comparan y manipulan estas variables. Las funciones comienzan con una mayúscula. Organizamos el código en funciones de manera que estas puedan reutilizarse fácilmente muchas veces en diferentes partes del programa.

Las clases son una forma de estructurar el código para empaquetar colecciones de variables y funciones a fin de crear una plantilla que define las propiedades de un objeto.

El scripting consiste principalmente en comparar estos objetos y sus estados y valores actuales. Se basa en la determinación lógica de un resultado o resolución.

Variables

En Unity, los scripts comienzan por disponer las herramientas que necesitas arriba, y esto normalmente se hace declarando variables. Puedes ver las variables declaradas aquí con la palabra clave visibilidad "pública" o "privada" en el frente, seguida por un tipo y un nombre.

variables in unity

Cuando declaras tus variables, hay varios tipos de visibilidad, pero los dos más importantes son pública y privada.

Si creas un script con el texto anterior en tu editor de códigos y después regresas a Unity y asignas el script a un GameObject, verás que puedes acceder y ver la variable ligera declarada como pública en el Inspector, pero no puedes ver la privada. Y esto ocurre porque solo puede accederse a lo que se define como "privado" dentro de este script particular, dentro de esta clase particular.

Si la haces pública, entonces otros scripts y otras clases podrán acceder, y podrá cambiarse en el Inspector desde el editor de Unity. Por tanto, esto significa que otras personas pueden tener acceso y cambiar su valor.

Hay muchas razones para elegir entre privado o público. Las variables privadas te permiten tener códigos más limpios, ya que sabes que el valor de esas variables puede ser cambiado solo desde dentro de esa clase. Esto hace que la depuración y el mantenimiento del código sean más sencillos.

Si eliges "público", y experimentas un problema, tendrás que buscar en toda la base de códigos para poder rastrear la fuente debido a cualquier otro objeto tiene acceso a esa variable. Sin embargo, si quieres que los objetos se comuniquen entre ellos, necesitarás que algunas variables (o funciones) sean públicas.

Otro aspecto importante de las variables es el tipo. Un tipo define qué tipo de valor mantiene la variable en la memoria, por ej., puede ser un número, texto, o tipos más complejos, como los que se observan en la imagen a continuación: Transform, Light y Demo Script son, en efecto, referencias a Componentes. Unity necesita saber qué tipo de objeto es y cómo manejarlo.

variables in unity inspector

Otra cosa importante en relación con las variables es el nombre. Lo principal es que tienes que recordar al asignar un nombre a las variables es que no pueden comenzar por un número, y que no pueden contener espacios. Por lo tanto, hay un estilo para escribir los nombres. En C#, la convención de nomenclatura es cameICase: comienzas con una minúscula y añades palabras, sin espacios, comenzando por una mayúscula, por ej.: "miLuz".

Cuando Unity compila el script, hace que las variables públicas sean visibles en el editor. Observa la imagen a continuación del inspector.

demo script unity inspector

Funciones

Los scripts manipulan las variables a través de funciones. Hay una serie de funciones que se ejecutan automáticamente en Unity. Observa a continuación:

functions in unity

Awake se invoca solo una vez cuando se menciona ese componente. Si un GameObject está inactivo, entonces no podrá invocarse hasta que se le active. Sin embargo, Awake se invoca incluso si el GameObject está activo pero el componente no está habilitado (con la pequeña casilla de verificación junto a su nombre). Puedes usar Awake para inicializar todas las variables a las que necesitas asignar un valor.

Start - al igual que Awake, Start se invocará si un GameObject está activo, pero solo si el componente está habilitado. Para más información sobre las diferencias con Awake, mira este video.

Update se invoca una vez por frame. Aquí es donde colocas el código para definir la lógica que se ejecuta continuamente, como animaciones, AI y otras partes del juego que tienen que actualizarse continuamente.

FixedUpdate es cuando quieres que la física funcione.

Como puedes ver, hay una Fixed Update (Actualización fija) y una Update (Actualización) en nuestra sección de tutoriales de Scripting, puedes averiguar efectuar cambios en cada frame con las funciones Update y FixedUpdate, y sus diferencias.

LateUpdate es una función que es similar a Update, pero LateUpdate se invoca al final del frame. Unity analizará todos los objetos de juego, encontrará todas las Updates, e invocará las LateUpdates. Esto es bueno para cosas como la cámara. Digamos que quieres mover un personaje en tu juego. Y entonces, él tropieza con otro personaje y termina en otra posición. Si movemos la cámara al mismo tiempo que el personaje, habrá ua sacudida, y la cámara no va a estar donde tendría que estar. Así que, básicamente, es un segundo loop que resulta muy práctico.

Funciones de escritura

Cuando escribas una función, recuerda que las funciones comienzan con el tipo de función al principio, seguido por el nombre de la función, y después los parámetros entre paréntesis (si fuese el caso). Los nombres de función comienzan por una mayúscula y el cuerpo de la función va entre llaves. Este es un ejemplo de cómo escribir una función:

writing functions unity

¿Cómo llamamos a esta función?

function-in-unity

Las funciones hacen cálculos y después presentan un valor. Puedes pedir a una función que haga algo, que procese la información, y que después te dé una respuesta. Si usas el tipo "void", entonces no obtendrás ninguna respuesta.

Clases

Las clases son colecciones de estas variables y sus funciones. Por ejemplo, este script es una clase:

class example in Unity

Ten presente que el nombre de la clase debe coincidir con el nombre de archivo del script C# para que funcione. Y después de anexarla a un GameObject, tiene que derivarse de otra clase llamada MonoBehaviour que se coloca automáticamente allí para ti cuando creas un script por primera vez. Las clases también son públicas o privadas.

En Unity, si creas una clase personalizada, como en el ejemplo a continuación, tienes que pedir serializarla. Esto significa que se convertirá a datos simples que Unity puede examinar en el inspector. Cuando hace esto, verá que tienes la clase que aparecerá en el inspector.

classes in unity example

Variables, funciones y clases son solo los aspectos básicos de comenzar a codificar con Unity. Revisa la sección Learn (Aprender), aquí puedes encontrar muchísimos tutoriales útiles de scripting que te ayudarán a aprender a programar desde cero, luego de lo cual podrás avanzar para crear códigos detallados para tus proyectos.