El personaje y el controlador

1

Introducción: De la idea al desarrollo

2

Estructura de carpetas en Unity

3

Assets, Game Objects y Sprite Atlas

4

Animaciones desde un sprite map

5

Animation Controller y Transiciones

6

Plataformas y gravedad

7

Física en Unity

8

El script de control

9

Programando funciones en C# y Unity: Jump

10

Detectar el suelo con Raycast

11

Herramientas de debugging visual

12

Cambiar las animaciones según los estados

13

Reto: Terminando nuestras animaciones

14

Solución del reto

15

Hacer que el personaje camine

El manager del videojuego

16

Cómo funciona el Game Manager

17

El Singleton

18

El modo de juego

19

Input manager y juegos multiplataforma

20

Corrección del Bug del salto

21

La zona de muerte

22

Reiniciar la partida

23

Corrigiendo los bugs al reiniciar nuestro juego

Diseño procedural de niveles 2D

24

El diseño de niveles a mano

25

Configurando nuestros assets para el diseño procedural

26

Generación procedural de niveles

27

Creando la zona que eliminará bloques del nivel excedentes

28

Añadir un nuevo bloque de forma aleatoria

29

La cámara que sigue al jugador

30

Destrucción de bloques antiguos

31

Terminando de programar la destrucción de bloques antiguos

32

Solucionando el salto de la cámara al reiniciar el juego

HUD, menús y gameplay

33

El canvas en Unity

34

Uso de botones para crear un menú

35

La lógica de los menús

36

Ejercicio: Preparando el menú del juego

37

Programando el menú del juego

38

Los coleccionables del juego

39

Actualizar UI de coleccionables

40

Iniciando con pociones y maná

41

Pociones de vida y maná

42

Programando las barras de vida y maná

43

Calculando los puntajes con la distancia y el tiempo de juego

44

La lógica del maná

Enemigos y dificultad

45

Plataformas móviles

46

Iniciar movimiento de la plataforma con trigger

47

Enemigos móviles

48

Enemigos móviles: preparando nuestro enemigo para girar

49

Enemigos móviles: programando que fire al chocar

50

Arreglando el collider de nuestra roca

51

Programando la condición de muerte del personaje

52

Añadiendo música de fondo a nuestro videojuego

53

Añadiendo efectos de sonido y cierre del curso

Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Curso de C# para Videojuegos

Curso de C# para Videojuegos

Juan Gabriel Gomila

Juan Gabriel Gomila

El Singleton

17/53
Recursos

El Singleton es un script que solo podemos usar una vez durante todo el videojuego, el truco para crear estas clases especiales es declarar un método especial usando la palabra static. En esta clase vamos a convertir nuestro script GameManager a una clase con su método estático para asegurarnos que no habrá más de un controlador de las etapas de nuestro juego.

El desafío de esta clase es responder las siguientes preguntas en el panel de discusiones:

  • Ya que nuestro videojuego es de un solo jugador, ¿tiene sentido convertir el script PlayerController en Singleton?
  • Si nuestro videojuego fuera multijugador, ¿tendría sentido convertir el script PlayerController en Singleton?

Aportes 29

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Me gustaron estos artículos para complementar lo que aprendimos en clase sobre el patrón de diseño Singleton en C# ✌️:

Ya que nuestro videojuego es de un solo jugador, ¿tiene sentido convertir el script PlayerController en Singleton?
Yo creo que si tiene sentido, es decir el programa podrá correr de igual manera. Pero sería impractico.
Si nuestro videojuego fuera multijugador, ¿tendría sentido convertir el script PlayerController en Singleton?
No tendria sentido, debido a que solo exisitiria una sola instancia de la clase y cada jugador necesitaria tener su propia instancia con sus propiedades unicas, como la respuesta a los diferentes inputs. Si se lo implementara, los players (1,2,…,n) tendrian exactamente el mismo comportamiento.

Eso es lo que entendí, por favor corrijanme si me equivoco.

Ya que nuestro videojuego es de un solo jugador, ¿tiene sentido convertir el script PlayerController en Singleton?

Yo diria que no ya que no habria otros scripts con los cuales chocar, de otra forma, no hya mas clases o metodos que interfieran
Si nuestro videojuego fuera multijugador, ¿tendría sentido convertir el script PlayerController en Singleton?
Ahi si, ya que el segudo jugador tiene sus propios controles y bien podria pausar su partida o bien saltar, por ejemplo en super contra son dos controles, el singleton es necesario para que cuando el jugador 1 salte, el jugador 2 se quede quieto

es lo que entiendo

Si tiene sentido que nuestro player sea una instancia compartida o singleton además si existe un player2 que sea solo un acompañante y que haga los mismos movimientos que el player1 tiene sentido que sea un singleton. pero si el player2 realiza acciones independientes al player1 como apoyar disparando tomar ciertas acciones independientes, recoger por aparte monedas, medicina es necesario que exista un playerController aparte para el player2, no puede ser singleton.![](

Según entiendo, si nuestro juego tiene un solo jugador:
-Podemos crear un singleton para que solo haya una instancia de nuestro script player controller, pero a la vez no la veo tan necesario sería más una cuestion de seguridad para prevenir errores.

Si nuestro juego tiene varios jugadores necesitamos un singleton:
-Diría que no puesto que si tenemos solo una instacia de la clase los otros jugadores no podría utilizarla.

Eso es lo que pienso aunque estoy abierto a sugerencias y aclaraciones que quieran darme.

Cuando quiero probar lo del inGame y menu, mi personaje una vez que llega al suelo se congela en la animacion de salto. y en unity me sale este error: NullReferenceException: Object reference not set to an instance of an object
playerController.IsTouchingTheGround () (at Assets/Scripts/playerController.cs:45)
playerController.Update () (at Assets/Scripts/playerController.cs:26)

Les comparto este enlace donde dan ejemplos de la diferencia entre usar y no usar static

Ya que nuestro videojuego es de un solo jugador, ¿tiene sentido convertir el script PlayerController en Singleton?

  • Me considero una persona muy precavida a la hora de realizar proyectos y no me gusta dejar ningún cabo suelto. Me lleva más tiempo pero sé que habrá menos margen de error. Yo sí haría un singleton, para evitar bugs o equivocaciones a la hora de que el juego inicialice el script conveniente. He leído que utilizar el singleton tiene algunos inconvenientes pero a la hora de asegurar que se inicializa un único script para cada apartado del juego, creo que puede ser muy útil.

Si nuestro videojuego fuera multijugador, ¿tendría sentido convertir el script PlayerController en Singleton?
_- Aun no tengo conocimientos como para poder dar una respuesta firme, pero imagino que no es posible ni recomendable utilizar un singleton para nuestro playercontroller si es multi, ya que se duplicaría todas las acciones de los dos jugadores de manera simultanea y no queremos eso. _

¿Cómo por error se crean 55 Managers? XD

¿Que estoy haciendo mal?
Al iniciar el juego mi personaje hace la animacion de salto y despues muere y me aparece el siguiente error, PlayerController.IsTouchingTheGround () (at Assets/Scripts/PlayerController.cs:87).

Ya que nuestro videojuego es de un solo jugador, ¿tiene sentido convertir el script PlayerController en Singleton?

Puede que si, es decir se podria crear una instancia de Jugador y no afectaria en un futuro, ya que no habria conflictos con otras instancias

Si nuestro videojuego fuera multijugador, ¿tendría sentido convertir el script PlayerController en Singleton?

Creo que no tienen sentido, ya que en este caso se tendra muchas instancias de la misma clase por lo tanto puede haber conflicto. En este caso se tendria multiples instancias de la misma clase.

Single player
Sí sería útil hacer singleton el playerController, solo necesitamos uno para nuestro jugador. Aunque tampoco sería necesario si no haces otro script de player controller y ya.
Multiplayer
No tenemos que usar el singleton aquí porque sí necesitamos 2 o más playerController distintos, uno para cada jugador.

Ya que nuestro videojuego es de un solo jugador, ¿tiene sentido convertir el script PlayerController en Singleton?

Yo diría que sí por cuestiones de bugs y a futuro se pensaría agregar mecánicas al player, vida o puntaje y hay que guardar esa información de cuanto daño se ha hecho o vida tiene.

Si nuestro videojuego fuera multijugador, ¿tendría sentido convertir el script PlayerController en Singleton?
A mi parecer no porque los valores que tiene ese script serían complejos de analizar, si el juego guardará como las muertes, el recorrido o el puntaje de cada uno del jugador hacerlo Singleton para ambos tendría problemas.

Si se podria hacer que el PlayerController sea un singleton sin mucho problema, y puede que hasta ayude el desarrollo aun si solo un poco. Aun asi, no haria mucha falta.
Pero si fuera multijugador, yo diria que hacerlo un singleton solo complicaria las cosas, ya que se tendrian que hacer singleton ambos jugadores separados y no tendria mucho sentido. Igualmente funcionaria, solo que puede hacer que sea un poco mas dificil manejar el desarrollo.

Yo creo que si el juego de un sólo jugador, tiene sentido utilizar Singleton pero para el PlayerController.
Si es multijugador no tiene sentido porque habrán varios GameControlles a los que el juego tiene que hacer referencia.

ese de sharedInstance me suena a namespaces es lo mismo??

Un player lo crearíamos como un gameobject para tener acceso a sus componentes, sería un public static gameobject. Cómo le asignas player a ese singleton? Lo podemos buscar por tag. La cosa es que como es una sola variabe por todo el juego,ese player es único y no podrían usarla dos players al tiempo. Si a ese singleton le cambias la velocidad, está será única, no habrá instancias con velocidades propias. Supongo que para hacerlo funcionar con player1 y player2 se podría hacer alguna clasificación un ifs pero no es práctico.

Creo que en un juego multiplayer si seria necesario el Singleton, e indicarle al juego cual es nuestro jugador y a cual debemos llamar los métodos como saltar o caminar, porque si no usaramos singleton, y hubiese mas de un Player, los 2 Players reaccionarian con el mismo Input

y si tuviera singleton el player , como quedaria el codigo?

con el GameManager es que se puede conocer cuantas veces uno muere en un juego o cuantas monedas a agarrado el personaje y poder interactuar con esos datos en el menu como por ejemplo comprar cosas con las monedas recolectadas?

  • Ya que nuestro videojuego es de un solo jugador, ¿Tiene sentido convertir el script de PlayerController en Singleton?
    Yo diria que si, apesar de que es un juego para un solo jugador, este puede tener multiples niveles se podria incurrir en el error de clonar el script y causar que el jugador tenga dos controladores que llevarian su movimiento y posiblemente su conteo de vidas o su estado actual.

  • Si nuestro videojuego fuera multijugador, ¿tendría sentido convertir el script PlayerController en Singleton?
    Si y no, yo diria que tocaria por la misma razon de que en juego de un solo jugador crearlo, mas generar un script independiente para cada jugador que haria el rastreo de todo el control del personaje asignado a ese jugador. Ej: en super smash seria un singleton por personaje que se asignaria a cada jugador y se mantendira siempre igual independiente de si se esta jugando de a parejas y tendria asignado dos controladores que van cambiando o si ha jugado algun personaje diferente que tiene acciones diferente.

Yo digo que si es necesario el singleton en el PlayerController pues así nos aseguramos que solo exista un personaje y que se creen otros.

Si fuera multijugador no seria necesario pues aquí si podemos tener distintas instancias de la clase solo cambiáramos los controladores pero con el mismo script.

ya que nuestro juego es de un solo jugador ¿tiene sentido cambiar el script de playerController en sigleton?
yo diria que no, ya que solo usaremos a un jugador y este hara todas las acciones, no lo veo necesario.
ahora que pasa si ¿el juego es de multijugador?
depende mucho a que ira orientado, si tienes muchos personajes dinstintos con distintos stats, si, ya que unos deben moverse mas rapido y otros mas lento, dado que si damos singleton todos se moverian igual si es que hay un bug, osea debe tener un sigleton para cada unico personaje para que se mueva independiente, aunque puede variar en implementacion y tipo de juego. si es solo una skin no hace falta o recolor del mismo pj.

Pienso que en el caso de ser de un jugador con una única instancia de PlayerController tendríamos suficiente, en el caso de ser de dos jugadores necesitaríamos dos instancia diferentes.

Hay algo muy interesante con el profesor que logra simplicar los conceptos dados, no tanto por las analogías sino por la forma en la que explica los conceptos, por ejemplo el patron de diseño singleton que se da en otros cursos aquí se retoma y logra disipar varias dudas.

Tengo una duda, si en vez de declarar una variable static del tipo GameManager, decidiera declarar la clase GameManager como static, ¿Debería obtener el mismo efecto por parte del script?

Ya que nuestro videojuego es de un solo jugador, ¿tiene sentido convertir el script PlayerController en Singleton?
Si, siempre que solo se vaya a manejar una instancia del jugador.

Si nuestro videojuego fuera multijugador, ¿tendría sentido convertir el script PlayerController en Singleton?
Considerando el multijugador local: No. Para poder reutilizar el player controller para los otros jugadores, si no haría falta un PlayerController1 , 2 ,3 ,4…

esto me recuerda al POO

Genial