1 00:00:06,830 --> 00:00:11,589 Ahora que nos vamos a adentrar en la programación dentro de Unity, creo que es el momento ideal 2 00:00:11,589 --> 00:00:15,570 para hacer una introducción a lo que es la programación orientada a objetos, ya que 3 00:00:15,570 --> 00:00:21,230 es el sistema de programación que vamos a utilizar. Debo advertir que son conceptos 4 00:00:21,230 --> 00:00:28,449 bastante abstractos, que quizá en un principio cuesta entenderlos, pero con el uso iremos 5 00:00:28,449 --> 00:00:32,909 cogiendo soltura y a lo mejor, quién sabe, a lo mejor al final del curso decimos, ah, 6 00:00:32,909 --> 00:00:38,350 ahora lo entiendo. Pero bueno, insisto, mejor empezar desde el principio. Mirad este vídeo 7 00:00:38,350 --> 00:00:43,409 con atención e intentad no perder detalle y, como siempre, si hay dudas, pues contactad conmigo. 8 00:00:43,649 --> 00:00:48,170 Empezaré diciendo que la programación orientada a objetos es un paradigma de programación. No es 9 00:00:48,170 --> 00:00:53,030 que cambie la utilización de lo que hemos visto hasta ahora, de las estructuras de control, 10 00:00:53,210 --> 00:00:57,509 de las variables, de los bucles... Bueno, pero sí que se plantea de otra forma y se plantea por 11 00:00:57,509 --> 00:01:02,490 una sencilla razón. Como buen programador, pues uno siempre busca la eficiencia y la eficiencia 12 00:01:02,490 --> 00:01:06,849 significa que mi código o mis fragmentos de código los puedan utilizar el siguiente 13 00:01:06,849 --> 00:01:11,109 que venga de una forma fácil, que no tenga que estar buscando qué funciones ha creado, 14 00:01:11,250 --> 00:01:14,909 qué variables ha creado, cómo se llaman, en fin. Entonces, para dar una especie de 15 00:01:14,909 --> 00:01:20,269 cuerpo lógico a todo esto y que yo en cuanto me enseñen el diagrama de un programa o de 16 00:01:20,269 --> 00:01:24,950 un script y vea cómo son sus clases, cuáles son sus atributos y cuáles son sus métodos, 17 00:01:24,989 --> 00:01:30,689 yo automáticamente sé qué tengo que hacer con ellos y sobre todo cómo usarlos. En contraposición 18 00:01:30,689 --> 00:01:34,530 con lo que hasta ahora hemos visto que es programación estructurada pues en la 19 00:01:34,530 --> 00:01:37,590 programación estructurada no era más que líneas de código que se iban 20 00:01:37,590 --> 00:01:41,409 ejecutando aquí no es exactamente así aunque sigue por supuesto ejecutándose 21 00:01:41,409 --> 00:01:45,250 las líneas de código pero aquí se organiza de otra forma como mediante 22 00:01:45,250 --> 00:01:50,549 clases y objetos a continuación veremos pues cada cosa y aparte de eso pues 23 00:01:50,549 --> 00:01:56,769 infiere ciertas convenciones o ciertas formas de trabajar que son habituales en 24 00:01:56,769 --> 00:01:59,310 cualquier lenguaje de programación orientado objetos lo cual facilita 25 00:01:59,310 --> 00:02:03,609 mucho la tarea de cualquier programador a la hora de enfrentarse a un programa que no 26 00:02:03,609 --> 00:02:07,189 es suyo, porque sabe lo que se va a encontrar. Y en ese sentido seguiremos unas convenciones 27 00:02:07,189 --> 00:02:11,050 muy precisas y muy importante que cuando sepamos que estamos declarando un objeto, estamos 28 00:02:11,050 --> 00:02:15,509 declarando un objeto o cuando estamos llamando al método de un objeto, pues sabemos lo que 29 00:02:15,509 --> 00:02:20,849 estamos haciendo o lo que nos espera. De hecho hay muchos lenguajes que ya están orientados 30 00:02:20,849 --> 00:02:23,530 a objetos y C-Sharp por supuesto es uno de ellos. 31 00:02:24,270 --> 00:02:28,030 Para entender la programación orientada a objetos voy a partir de un ejemplo real, del 32 00:02:28,030 --> 00:02:33,689 mundo real. Pensemos, por ejemplo, que yo trabajo en un banco y que cada vez que alguien 33 00:02:33,689 --> 00:02:38,569 viene y abre una cuenta, pues yo tengo que realizar ciertas tareas. Por ejemplo, viene 34 00:02:38,569 --> 00:02:43,490 alguien, abre una cuenta y yo le tengo que primero abrir esa cuenta, es decir, ya está, 35 00:02:43,629 --> 00:02:47,689 he abierto una cuenta. Tengo que preguntarle algunas cosas al cliente. Para empezar, tengo 36 00:02:47,689 --> 00:02:52,590 que determinar su nombre para ponerlo en la cuenta, la fecha en la que he abierto la cuenta. 37 00:02:53,050 --> 00:02:57,969 Tengo que crear, por ejemplo, un número de cuenta. Tengo que poner un saldo en esa cuenta. 38 00:02:58,030 --> 00:03:05,009 Ahora, eso son las variables de la cuenta, vamos a decirlo así. Es decir, son variables que se van a repetir en todas las cuentas. 39 00:03:05,110 --> 00:03:14,490 De hecho, adelanto un concepto que es el de la abstracción, luego hablaremos de ello, que significa qué atributos o qué propiedades van a tener todas las cuentas. 40 00:03:14,569 --> 00:03:19,310 No me interesa esta cuenta en concreto, que a lo mejor tiene un plan de pensiones, o sea, que es muy poco típico, pero que esta lo tiene. 41 00:03:19,430 --> 00:03:22,810 No, esa no me interesa. Lo que me interesa son las propiedades que tienen todas las cuentas. 42 00:03:22,810 --> 00:03:34,530 Lo que he dicho, saldo, número de cuenta, fecha de apertura, en fin. Pues ya tengo eso, pero luego resulta que como trabajador del banco hay ciertas tareas que estoy repitiendo constantemente. 43 00:03:34,530 --> 00:03:45,250 Por ejemplo, cada vez que viene un cliente y retira un saldo o retira un dinero, pues yo tengo que actualizar el saldo. Tengo que entrar en la cuenta, seguir unos procedimientos para entrar en esa cuenta, 44 00:03:45,770 --> 00:03:49,590 restar el saldo que me han, o restar la cantidad de dinero que ha sacado el cliente, 45 00:03:49,969 --> 00:03:52,789 restárselo al saldo general, actualizar la variable de saldo, 46 00:03:52,889 --> 00:03:56,250 acordémonos que esa es una de las variables o atributos que tiene esa cuenta. 47 00:03:57,189 --> 00:04:01,009 Es decir, hemos realizado unas tareas que son repetitivas. 48 00:04:01,009 --> 00:04:06,430 ¿Y qué hacemos cuando tenemos unas tareas o una serie de actividades o de funciones 49 00:04:06,430 --> 00:04:10,530 que se repiten constantemente? Pues efectivamente, declarar una función. 50 00:04:10,969 --> 00:04:13,389 Que en programación orientada a objetos se llama métodos. 51 00:04:13,389 --> 00:04:15,710 A partir de ahora lo llamaremos siempre métodos. 52 00:04:16,310 --> 00:04:22,569 Así que tenemos una cuenta de banco con unas variables que se repiten en todas las cuentas 53 00:04:22,569 --> 00:04:26,329 y con unos métodos que también se repiten en todas las cuentas. 54 00:04:26,610 --> 00:04:30,889 Los métodos, como buenas funciones que son, pueden exigir variables, 55 00:04:31,050 --> 00:04:34,730 en el caso que hablábamos del saldo, cuánto dinero voy a sacar, o retornar variables. 56 00:04:34,850 --> 00:04:40,029 Por ejemplo, si tengo que actualizar el saldo, me tiene que devolver cuál es el saldo final 57 00:04:40,029 --> 00:04:41,069 y entonces yo lo actualizo. 58 00:04:41,069 --> 00:05:03,209 En fin, o bueno, o a lo mejor si la variable del saldo la tiene ya disponible el método, pues ni siquiera me lo tiene que devolver, él se encarga de hacerlo todo y yo no pregunto, que eso es otra de las cuestiones que veremos cuando hablemos de los conceptos de programación orientada a objetos, es que lo ideal es que él, la clase o lo que estamos haciendo haga cosas si yo saber muy bien cómo las hace, ¿vale? 59 00:05:03,209 --> 00:05:11,550 Eso es lo que se llama una estructura de caja negra, que es, mira, yo sé lo que te tengo que dar, yo sé lo que me vas a devolver, pero cómo lo hagas internamente es cosa tuya. 60 00:05:12,230 --> 00:05:14,649 Eso facilita de nuevo también las tareas de un programador. 61 00:05:15,189 --> 00:05:22,850 Siguiendo ese ejemplo que hemos visto, esto que tenemos aquí, la cuenta bancaria, sería la clase. 62 00:05:23,990 --> 00:05:29,129 Es decir, declaramos una clase, por cierto, ya empezaremos a hablar con propiedad, 63 00:05:29,129 --> 00:05:35,509 Es decir, las clases, cuando las declaremos por convención, van con la primera letra mayúscula para diferenciarlo de las variables, por ejemplo. 64 00:05:37,449 --> 00:05:41,149 Y a partir de ahí empezamos a asignar ciertos atributos. 65 00:05:41,449 --> 00:05:44,350 Estos atributos los va a tener todas las cuentas que yo abra. 66 00:05:45,290 --> 00:05:48,269 Pero aparte de eso hemos dicho que teníamos unos métodos. 67 00:05:48,829 --> 00:05:49,769 ¿De acuerdo? Aquí están. 68 00:05:50,709 --> 00:05:53,589 Ahí yo creo que le faltan unos paréntesis para indicar que esto es un método, pero bueno. 69 00:05:53,990 --> 00:05:55,910 Y esas son las actividades que realiza la clase. 70 00:05:55,910 --> 00:06:08,029 Ya tenemos nuestra clase definida y es muy importante cuando nos ponemos a trabajar en programación orientada a objetos pensar las clases, pensarlas muy bien hasta que decimos, vale, estas son las clases, estos son sus atributos generales y estos son los métodos. 71 00:06:08,029 --> 00:06:11,910 ¿Ahora qué hago? Pues siguiendo el ejemplo de la cuenta bancaria 72 00:06:11,910 --> 00:06:13,670 tengo la clase que es cuenta bancaria 73 00:06:13,670 --> 00:06:16,050 y cada vez que abro una nueva 74 00:06:16,050 --> 00:06:18,029 lo que se llama es que creo un objeto 75 00:06:18,029 --> 00:06:19,629 a partir de esa clase 76 00:06:19,629 --> 00:06:22,750 son lo que se llaman instancias de clases 77 00:06:22,750 --> 00:06:24,290 es como repetirlas 78 00:06:24,290 --> 00:06:26,930 no es clonarlas porque no las repito 79 00:06:26,930 --> 00:06:28,769 ahí está la magia de la programación orientada a objetos 80 00:06:28,769 --> 00:06:31,569 no es que coja esto y lo repita una y dos y tres veces 81 00:06:31,569 --> 00:06:33,050 no, no, no, es que lo instancio 82 00:06:33,050 --> 00:06:35,529 es decir, creo una instancia 83 00:06:35,529 --> 00:06:37,310 con su propio nombre 84 00:06:37,310 --> 00:06:42,170 genera las mismas variables genera los mismos métodos que están en la clase es 85 00:06:42,170 --> 00:06:46,790 decir puedo acceder a ellos pero sus variables son propias es decir que una 86 00:06:46,790 --> 00:06:50,750 cuenta tendrá un número de cuenta y un objeto de cuenta tendrá un número de 87 00:06:50,750 --> 00:06:54,589 cuenta y otro objeto de cuenta tendrá otro número de cuenta y no se molestan 88 00:06:54,589 --> 00:06:57,290 entre ellas que es otro de los conceptos que veremos en programación orientada 89 00:06:57,290 --> 00:07:00,889 objetos que es el encapsulamiento que las propiedades de un objeto no 90 00:07:00,889 --> 00:07:04,410 interfieren para nada en las propiedades de otro objeto así que puedo tener mil 91 00:07:04,410 --> 00:07:09,870 objetos de la misma clase mil cuentas bancarias a partir de una sola clase de cuenta bancaria 92 00:07:09,870 --> 00:07:15,689 ahí podríamos tener creado un objeto a partir de la clase que hemos visto antes y tiene como 93 00:07:15,689 --> 00:07:21,209 podemos ver sus variables de clase pero que tienen sus propios valores que son diferencias de otro y 94 00:07:21,209 --> 00:07:26,769 por supuesto tengo acceso como vemos ahí faltaban unos paréntesis como vemos tengo acceso a las 95 00:07:26,769 --> 00:07:32,910 los métodos de la clase principal por cierto declarar que esta forma de representar las 96 00:07:32,910 --> 00:07:37,189 clases sigue el Unified Modeling Language, que es decir, la forma en la que se representan 97 00:07:37,189 --> 00:07:41,589 las clases, porque cuando un programador hace un diagrama de sus clases, pues tiene que 98 00:07:41,589 --> 00:07:47,970 seguir ciertas normas, entonces están especificadas en ese lenguaje. Muy bien, sin abogobiarnos 99 00:07:47,970 --> 00:07:51,569 mucho, pongo aquí un ejemplo, nada de falta que lo entendamos de todo, pero pongamos aquí 100 00:07:51,569 --> 00:07:56,670 un ejemplo de lo que sería una clase ya en código. Por ejemplo, vamos a pensar que yo 101 00:07:56,670 --> 00:08:01,810 voy a declarar una clase coche, es decir, necesito instanciar coches, y lo que hago 102 00:08:01,810 --> 00:08:08,730 es, como decíamos, abstraer, obtener los atributos generales de un coche. Por ejemplo, 103 00:08:08,850 --> 00:08:15,290 el color, todos los coches tienen color, el modelo, todos lo tienen. Incluso puedo crear 104 00:08:15,290 --> 00:08:20,490 variables booleanas. He de recordar que todas las variables tienen que tener un tipo de 105 00:08:20,490 --> 00:08:26,089 variable. En este caso puedo decir si un coche está encendido o apagado. Y puedo incluso 106 00:08:26,089 --> 00:08:29,750 crear un método que diga, pues voy a crear un método para que una vez que cree el objeto 107 00:08:29,750 --> 00:08:33,769 de un coche lo pueda poner en marcha. Y lo mismo podría crear un método para pararlo. 108 00:08:34,110 --> 00:08:37,789 Pues bien, esto sería mi clase, con sus atributos y sus métodos. 109 00:08:38,389 --> 00:08:41,850 ¿Cómo genero objetos? Pues bien, cada lenguaje de programación 110 00:08:41,850 --> 00:08:45,309 tendrá su propio sistema de crear o de instanciar las clases. 111 00:08:45,470 --> 00:08:48,610 Pero bueno, veremos que es muy habitual, y nosotros de hecho lo haremos así, 112 00:08:49,289 --> 00:08:53,029 llamando a esta sintaxis. 113 00:08:54,049 --> 00:08:56,730 Pero bueno, C Sharp tiene sus peculiaridades y las vamos a ver ahora mismo. 114 00:08:56,730 --> 00:09:10,269 Y una vez que he creado una variable, muy importante, esta variable no es una variable como las que hemos visto antes, no es una variable string, no es un boolean, no es un integer, no, no, no, es un objeto. 115 00:09:10,750 --> 00:09:12,549 ¿De qué clase? De esta clase. 116 00:09:13,309 --> 00:09:23,129 ¿Qué significa? Que ahora mismo esta variable, como podemos ver más abajo, tiene accesibles los atributos y tiene accesibles los métodos. 117 00:09:23,129 --> 00:09:33,250 Es decir, que si yo escribo el nombre de la variable y a continuación un punto, muy importante, así es como accedemos a los atributos o a los métodos que tenemos en la clase de donde viene este objeto, 118 00:09:33,470 --> 00:09:36,909 pues a continuación ponemos el atributo y le asignamos un valor. 119 00:09:37,169 --> 00:09:51,210 Es decir, que ahora mismo mi coche es un objeto de la clase coche, su atributo color que está declarado aquí en la clase coche, ahora es rojo, pero es rojo el de este objeto. 120 00:09:51,870 --> 00:09:54,769 Si genero otro objeto nuevo, podría asignarle otro color. 121 00:09:55,590 --> 00:09:58,110 Y, por supuesto, le puedo decir que se ponga en marcha. 122 00:09:58,110 --> 00:10:04,529 Como podemos ver, por ejemplo, el método de ponerse en marcha, ¿qué es lo que hace? 123 00:10:05,070 --> 00:10:09,409 Cambiar el atributo de encendido a true, que por defecto venía en false. 124 00:10:10,090 --> 00:10:19,289 ¿Qué significa? Que en este objeto, al llamar al método ponerse en marcha, lo que ha hecho es cambiar el atributo encendido a true. 125 00:10:19,809 --> 00:10:22,750 Es decir, que tengo un coche rojo y que ahora mismo está encendido. 126 00:10:22,789 --> 00:10:27,309 Bien, ya sé que esto puede sonar un poco achino y cuesta al principio, 127 00:10:27,570 --> 00:10:29,809 pero tenemos que empezar a verlo de esta forma. 128 00:10:29,929 --> 00:10:32,169 Es decir, tenemos unas clases disponibles para nosotros 129 00:10:32,169 --> 00:10:35,970 y que las podemos llamar e instanciar y meterlas en una variable nuestra. 130 00:10:36,149 --> 00:10:38,789 Y dentro de esa variable, pues de nuevo tenemos accesibles sus atributos 131 00:10:38,789 --> 00:10:40,269 y empezamos a jugar con ellos. 132 00:10:40,750 --> 00:10:42,509 Sus atributos, sus métodos, en fin. 133 00:10:42,509 --> 00:10:46,309 De todas formas, el entorno de desarrollo que usemos seguramente nos ayude. 134 00:10:46,309 --> 00:10:52,970 Nos diga qué atributos tiene o qué métodos podemos llamar a ese objeto que instancia la clase a la que está instanciando.