Unity: Programación de Videojuego Básica en C#.: Requisitos para Seguir El Curso
Unity: Programación de Videojuego Básica en C#.: Requisitos para Seguir El Curso
Unity: Programación de Videojuego Básica en C#.: Requisitos para Seguir El Curso
básica en C#.
Requisitos para seguir el curso: 1
Variables 12
Métodos / funciones 24
Curso basado en los tutoriales oficiales de Joshua Kinney. Traducido por Yone Moreno
Jiménez.
Si queremos programar en Unity necesitamos crear scripts que son unidades de código que
realizan una misión, para ello damos clic derecho sobre la carpeta por defecto abajo a la
izquierda Assets, Create, Folder, y la llamamos Scripts:
Debería quedar como:
Ahora que tenemos una carpeta en donde organizar todos nuestros scripts creemos algunos de
estos, botón derecho dentro de la carpeta de Scripts, create, C# script:
Le podemos dar un nombre, como es un ejemplo pongámosle ExampleScript:
Si pulsamos doblemente sobre el script se nos abrirá en un editor de texto. Lo primero que es
bueno saber es qué significa NombreScript : MonoBehaviour. Bien MonBehaviour es una clase
de la cual hereda nuestro script y esto nos permite comunicarle a Unity: quiero que mi script
sea usado dentro de los objetos del juego ¿vale?.
Aprendamos cómo crear un objeto de juego o GameObject en inglés. Para ello volvemos al
Unity, arriba a la izquierda en la Hierarchy clicamos en create, 3d object, capsule:
Si quisiéramos eliminarlo podríamos hacerlo haciendo clic derecho sobre el título del objeto y
en el menú clicar Remove Component:
También se puede añadir un script a un objeto clicando en Add Component, abajo a la derecha,
Scripts, elegimos el que queramos:
Además se puede hacer de forma directa en un sólo paso el crear el script y aplicárselo al
objeto mediante Add Component, New Script, le damos el nombre que queramos:
Nos daremos cuenta de dos cosas, primero de que el componente, el script, ya nos lo añade
debajo de todos los demás, a la derecha, en este caso lo hemos llamado Test:
Otra cuestión es que al hacer así el script no te lo añade en la carpeta actual, en Scripts, sino
que lo pone en la raíz del proyecto, en Assets, es decir, no está en la actual:
Sino en la raíz:
Una cosa a tener en cuenta. A mí me gusta depurar usando prints, es decir imprimiendo por
pantalla lo que está ocurriendo, pero si tuviéramos un objeto hiper complejo con muchos scripts
nos convendría tener una manera de habilitar/deshabilitar cada script para ir comprobando que
funciona bien uno a uno. Para ello tenemos la casilla de arriba a la izquierda en cada
componente, que nos permite habilitar/deshabilitar cada uno:
Como hemos visto podemos hacer clic en el nombre del componente y darle a remove
component para borrarlo, o clic derecho y remove component; pero ojo porque el script seguirá
en nuestro proyecto:
Para quitarlo del proyecto vamos al panel de abajo a la izquierda, clic derecho, delete, o
pulsando el botón suprimir del teclado:
Estructura de los scripts
A continuación vamos a entender qué significan las partes que componen un script porque así
estaremos preparados para crear los comportamientos que queramos que nuestros objetos
tengan. Primero, arriba tenemos esas frases que comienzan por using. Esta palabra nos
permite acceder a lo que se llama namespaces.
A nosotros nos importa esto para comprender lo siguiente: nuestro script ExampleScript está
heredando de MonoBehaviour (ello se observa mediante ExampleScript : MonoBehaviour, los :
significan que lo primero hereda, es hijo de, lo segundo).
Es decir, nosotros somos ExampleScript y estamos haciendo uso de cosas que pertenecen a
MonoBehaviour, que sería el equivalente a nuestro padre o madre. En la vida real haríamos
uso de la casa, y en el script hacemos uso de unas funciones ya presentes como son Start() y
Update().
Para probar lo anterior comentemos la línea que pone UnityEngine, los comentarios se realizan
con // y señalan que esa línea no va a ser ejecutada, es decir, el programa la va a ignorar.
Sería lo mismo que emanciparnos de nuestros padres:
Lo que ocurre es que si nos emancipamos de nuestros padres no podremos usar su casa, por
tanto aquí no podríamos heredar de MonoBehaviour y por ello se señala subrayado en rojo
como un error.
En concreto si dejamos el cursor sobre el error nos lo explicará comentando que no podemos
acceder a MonoBehaviour, lógico porque hemos comentando using UnityEngine y por tanto
hemos abandonado la casa de nuestros padres:
A continuación borraremos la // del principio del using que acabábamos de poner y entendamos
qué son las clases. Las clases son contenedores de métodos (comportamiento), cosas que se
hacen, y datos (variables), cosas que se tienen:
Por ejemplo si quisiéramos crearíamos una clase Player, jugador, y sus métodos serían
PlayerMovement, moverlo, PlayerAttack, atacar etc.
Además hay que saber que el nombre de la clase y el fichero deben coincidir, en nuestro caso,
arriba, el fichero se llama ExampleScript.cs y la class ExampleScript, esto es así para que Unity
pueda saber que archivo de nuestro ordenador contiene la definición del comportamiento del
objeto de juego:
Luego hay que tener en cuenta que ya de forma predefinida se nos dan dos métodos (también
llamados funciones). Start(), se ejecuta cuando se crea el objeto:
Además hay que tener en cuenta que los métodos son trozos de código que devuelven o no,
algo. Es decir, por ejemplo, nuestra madre nos puede llamar lo cual significa que nosotros
somos su método, para recoger nuestra habitación. Después de que nosotros recogamos
nuestra habitación ‘no le devolveremos nada a nuestra madre’. En el caso de los programas
esto se explica mediante la palabra void, vacío en español:
También se nos da la función Update() la cual se ejecuta cada vez que se imprime la pantalla,
es decir entre 30 y 60 veces por segundo:
Variables
Para empezar a declarar una variable hay que indicar un accesor. Es decir una palabra que
limite qué clases pueden usar está variable. Hay dos palabras public o private
. Public quiere decir que toda clase puede acceder a está variable. Private significa que sólo la
clase actual ExampleScript puede usar esa variable.
Luego seguiremos con el tipo de dato. Este puede ser un float el cual es un número
decimal como 0.2 u 9.7 o 3.14. Un int es un número entero como 7, o 9 o 1000. Un bool
es un dato que puede contener false o true. Seguro que muchos estaréis pensando
¿por qué hay que usar tipos de datos? Bueno imaginémonos que tenemos un bote que pone
‘pepinillos’. Uno esperaría encontrar pepinillos dentro. Qué ocurre si al destaparlo encuentras
pescado crudo. Pues que tendríamos un problema. Pues lo mismo es en código.
Sigamos construyendo la variable. Ahora hace falta darle un nombre. Hay que tener en cuenta
que su nombre puede ser cualquiera pero debemos cumplir una regla: su nombre no puede ser
alguna de las palabras que se usan en el lenguaje con un significado especial; por ejemplo, no
podemos ponerle UnityEngine, porque habría conflicto: y nos daría
un error. Por ejemplo si quisiéramos una variable para guardar la distancia del jugador al suelo
la podríamos llamar isGrounded . Hay que tener en cuenta
que los nombres de variables tienen que ser una única palabra, así que si queremos incluir
varias, hay que hacerlo como: primeraSegundaTerceraPalabra, es decir la primera inicial en
minúsculas y para separar palabras indicar la inicial de cada en mayúsculas.
Luego vamos a inicializar el valor de la variable. Para ello después del nombre, ponemos un = y
el valor. En este caso como el valor es decimal, separamos la parte exacta de la decimal con
punto y acabamos con f. Además la frase se termina con ; así:
Hasta ahora hemos declarado una variable e inicializado la misma todo en una línea. También
se puede hacer en dos pasos, primero declararla vacía y luego en el Start() darle contenido:
De vuelta en Unity veremos que se recarga el script y nos aparece en el objeto una variable
llamada speed puesta a 10. Eso es porque la hemos declarado public y es accesible:
Ahora bien hay un operador curioso y raro que se suele usar llamado módulo. El módulo es el
resto de dividir un número por otro, se denota mediante %
Por ejemplo si tenemos 7 % 3 que se lee ‘siete módulo tres’, el resultado será el resto de la
división de 7 entre 3. En contreto 7 dividido por 3 da 2, de resto 1.
El resumen:
Los anteriores realizan una operación con el valor que ya se encuentra a la izquierda, pero
también se pueden hacer operaciones más sencillas tipo a = b + c; es decir donde en una
variable se guarde el resultado de operar con otras dos:
Luego nos gustaría hacer algo como calcular la velocidad a la que va el personaje, esto es
speed = distance / time;
Además para que sea interesante vamos a imprimir por pantalla el valor que se nos calcula,
para ello usamos la función print() y dentro de los paréntesis ponemos un texto que queramos
entre comillas dobles
“You are travelling at: “ y como queremos incluir el contenido de una variable usamos el + que
significa cógeme y úneme en la frase a imprimir por pantalla con lo siguiente, que es el nombre
de la variable speed, y luego otro + y las comillas dobles para indicar la unidad de medida
“MPH” (miles per hour, millas por hora, porque el ejemplo está cogido de un autor inglés,
podríamos poner “Km/h kilómetros por hora”)
Le damos a ctrl s o file save para guardar el código y volvemos a unity, donde nos aparece lo
nuevo:
Nos puede sorprender que el valor de speed en Unity sea de 10, porque en el código lo hemos
cambiado para que sea 0.0 y hemos guardado. Pero el guardar el código no significa que se
sobreescribe lo de Unity, para ello hay que pulsar en la ruedita arriba a la derecha y darle a
Reset:
Ahora que está todo a 0, démosle a Play arriba en el botón de la flecha:
Como queremos calcular cosas cambiemos la Distance a 100 y el Time a 1 y veamos que
pasa:
Si pusiéramos Time a 2:
Nos saldría:
You are travelling at 50 MPH.
Operadores de comparación y lógica
Para dar lógica a nuestro programa necesitamos comparar valores de variables mediante
condiciones. Por ejemplo el operador == devuelve true si lo que hay a ambos lados es igual, y
false si no:
También tenemos el complementario != que significa no es igual que. Da true si lo que hay a
ambos lados es diferente y false si no:
Luego tenemos mayor que, da true si lo de la izquierda tiene mayor valor que lo de la derecha,
menor que, mayor o igual que, menor igual que:
Luego tenemos los operadores lógicos que se usan para crear comparaciones / condiciones
complejas:
Por ejemplo, normalmente las condiciones y comparaciones se usan dentro de una estructura
llamada if. Se escribe:
if( seCumpleCondición ) {
hacerAlgo;
}
Expresa: si la velocidad es superior a 70 o inferior a 40, pon por pantalla You are breaking the
law!, tú estás infringiendo la ley!.
Que expresa si nuestra velocidad speed es mayor que 70 o menor que 40 infringimos la ley, si
no, como en este caso, vamos a 50 simplemente imprimimos lo que está fuera del if: You are
travelling at 50 MPH.
Métodos / funciones
Ahora vamos a aprender qué son y cómo se usan los métodos. Los métodos son un conjunto
de instrucciones. Los métodos son instrucciones que realizan tareas.
Si quisiéramos que la velocidad del jugador se calcule cada vez que pulsemos un botón
podríamos empezar creando un método para ello:
void SpeedCheck(){
Recordemos que void significa el tipo de dato que nos devuelve el método, en este caso como
devuelve nada le ponemos void. SpeedCheck es el título del método, normalmente los nombres
de métodos se distinguen de los de variables poniendo la primera inicial también en
mayúsculas. Los () paréntesis significan que es un método. Las {} llaves encierran el conjunto
de instrucciones que componen nuestro método.
Así que ahora podemos coger el código que habíamos escrito antes seleccionarlo cortarlo y
ponerlo dentro del método:
Guardamos y volvemos a Unity:
Es decir dentro del Update() el método que Unity ejecuta cada vez que se imprime la pantalla
entre 30 y 60 veces por segundo, escribimos:
if( Input.GetKeyDown(KeyCode.Space)){
SpeedCheck();
}
Si volvemos a Unity y le damos a Play veremos que no se imprime ningún mensaje, bien:
Ya con esto hemos aprendido a usar los métodos y las condiciones con ifs ;=).