Me gustaron estos artículos para complementar lo que aprendimos en clase sobre el patrón de diseño Singleton en C# ✌️:
El personaje y el controlador
Introducción: De la idea al desarrollo
Estructura de carpetas en Unity
Assets, Game Objects y Sprite Atlas
Animaciones desde un sprite map
Animation Controller y Transiciones
Plataformas y gravedad
Física en Unity
El script de control
Programando funciones en C# y Unity: Jump
Detectar el suelo con Raycast
Herramientas de debugging visual
Cambiar las animaciones según los estados
Reto: Terminando nuestras animaciones
Solución del reto
Hacer que el personaje camine
El manager del videojuego
Cómo funciona el Game Manager
El Singleton
El modo de juego
Input manager y juegos multiplataforma
Corrección del Bug del salto
La zona de muerte
Reiniciar la partida
Corrigiendo los bugs al reiniciar nuestro juego
Diseño procedural de niveles 2D
El diseño de niveles a mano
Configurando nuestros assets para el diseño procedural
Generación procedural de niveles
Creando la zona que eliminará bloques del nivel excedentes
Añadir un nuevo bloque de forma aleatoria
La cámara que sigue al jugador
Destrucción de bloques antiguos
Terminando de programar la destrucción de bloques antiguos
Solucionando el salto de la cámara al reiniciar el juego
HUD, menús y gameplay
El canvas en Unity
Uso de botones para crear un menú
La lógica de los menús
Ejercicio: Preparando el menú del juego
Programando el menú del juego
Los coleccionables del juego
Actualizar UI de coleccionables
Iniciando con pociones y maná
Pociones de vida y maná
Programando las barras de vida y maná
Calculando los puntajes con la distancia y el tiempo de juego
La lógica del maná
Enemigos y dificultad
Plataformas móviles
Iniciar movimiento de la plataforma con trigger
Enemigos móviles
Enemigos móviles: preparando nuestro enemigo para girar
Enemigos móviles: programando que fire al chocar
Arreglando el collider de nuestra roca
Programando la condición de muerte del personaje
Añadiendo música de fondo a nuestro videojuego
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
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:
Aportes 29
Preguntas 3
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. (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?
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
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.