Función reset en Unity 2D PlayerController

Clase 22 de 53Curso de C# para Videojuegos

Resumen

La forma más fiable de reiniciar una partida en Unity 2D es guardar la posición inicial del personaje y restablecer su estado físico al relanzar el juego. Aquí verás cómo implementar un reset sólido con Start, StartGame, PlayerController y GameManager, además de entender por qué en 2D seguimos usando Vector3 y cómo afecta la cámara ortográfica.

¿Cómo implementar el reset del juego en Unity sin errores?

Para reiniciar sin efectos indeseados, primero se registra la posición inicial del jugador en Start y luego, en StartGame, se restaura su posición y se detiene su velocidad. Así evitas que, si estaba cayendo muy rápido, atraviese el suelo al reaparecer.

  • Guardar la posición inicial con Vector3.
  • Reposicionar al personaje con StartGame.
  • Frenar la física con Vector2.zero en el Rigidbody.
  • Sincronizar GameManager con PlayerController.

¿Cómo guardar la posición inicial con Vector3?

  • Un juego 2D usa X, Y y también Z: Unity guarda posiciones en 3D.
  • Se captura una sola vez en Start.
public class PlayerController : MonoBehaviour
{
    private Vector3 startPosition;

    void Start()
    {
        startPosition = this.transform.position;
    }
}

¿Cómo reubicar y frenar al personaje con StartGame?

  • Restaurar posición: transform.position = startPosition.
  • Frenar al jugador: rigidbody.velocity = Vector2.zero.
  • Evita que la alta velocidad acumulada lo haga atravesar el suelo.
public class PlayerController : MonoBehaviour
{
    private Vector3 startPosition;

    public void StartGame()
    {
        this.transform.position = startPosition;
        this.rigidbody.velocity = Vector2.zero;
    }
}

¿Qué bugs observar al reiniciar?

  • El personaje reaparece muerto si estaba en estado de muerte.
  • Se puede reiniciar en cualquier momento con el botón de inicio.
  • Quedan varios ajustes pendientes para que el ciclo de vida sea consistente.

¿Por qué usar posiciones 3D en un juego 2D?

Aunque la escena se perciba plana, Unity trabaja con X, Y, Z incluso en 2D. La diferencia la marca la cámara: con cámara ortográfica no hay percepción de profundidad y el tamaño aparente no cambia al alejarse o acercarse en Z. En perspectiva, sí hay profundidad y el personaje se ve más pequeño al alejarse.

¿Qué diferencia hay entre cámara ortográfica y perspectiva?

  • Ortográfica: sin profundidad percibida, tamaño constante. Ideal para 2D.
  • Perspectiva: profundidad visible; al alejar el objeto, se hace pequeño.
  • Cambiar entre modos muestra que el mundo sigue siendo 3D.

¿Cómo afecta la coordenada Z en escenas 2D?

  • Con Z = 0 para objetos, todo queda en el mismo plano.
  • Mover en Z no cambia el tamaño con cámara ortográfica.
  • La escena es 3D, pero la jugabilidad opera en plano.

¿Cómo sincronizar GameManager y PlayerController para iniciar partida?

El GameManager debe orquestar el inicio: invoca a StartGame del PlayerController tras preparar el estado del juego. Para ello, crea una referencia al controlador del jugador y asegúrate de que el método sea público.

¿Cómo referenciar al personaje con GameObject.Find o tag?

  • Puedes usar nombre o tag. En el ejemplo se usa el nombre "player".
  • Recupera el PlayerController con GetComponent.
public class GameManager : MonoBehaviour
{
    private PlayerController controller;

    void Awake() // o Start
    {
        controller = GameObject.Find("player").GetComponent<PlayerController>();
    }
}

¿Cómo exponer StartGame para que el manager lo invoque?

  • Si StartGame es private, verás el error: no accesible por nivel de protección.
  • Hazlo public para que otros scripts lo llamen.
public class PlayerController : MonoBehaviour
{
    public void StartGame() { /* reposicionar y frenar */ }
}

¿Cuándo llamar a StartGame desde el manager?

  • Al entrar al estado de partida, tras configurar variables con SetGameState.
  • Instrucción clave: controller.StartGame();.
  • Alinea la escena para jugar y ubica al personaje en su posición inicial.

¿Te quedó alguna duda sobre la integración entre GameManager y PlayerController o sobre la cámara ortográfica? Comparte tu caso en los comentarios y lo revisamos juntos.

      Función reset en Unity 2D PlayerController