Introducción

1

Game Design del juego

2

La estructura y assets de un proyecto en Unity

3

Convirtiendo nuestros assets en Tiles

4

Tilemaps y creación del escenario

5

Bonus: FastForward de la creación del escenario, sorting layers y creación de colliders

6

Acá encontrarás los archivos de este curso

Personaje principal: Movimiento y Animaciones

7

El jugador y el movimiento

8

Creando nuestra primera animación

9

Creando el grafo de animaciones

10

Usando un árbol de animaciones

11

Mostrando la solución del desafío e implementando transición entre blended trees

12

Programando una cámara que siga al jugador

13

Corrección del bug gráfico

14

límites del escenario, rigid bodies

15

Ejercicio: diseño de interiores

Escenarios Avanzados

16

Transiciones entre escenas

17

Mantener Player y Camera entre escenas

18

Spawning Points: programando que el jugador y la cámara aparezcan en el lugar correcto al cambiar de escena

19

Agregando Identificadores a nuestros Spawning Points para controlar mejor el flujo de nuestro juego

Enemigos Avanzados

20

Creando nuestro enemigo

21

Programando las físicas y el patrullaje del enemigo

22

Generando movimiento completamente aleatorio

23

Programando el ataque del enemigo

24

Crear Manager de Health del Player

25

Crear armas

26

Programando el ataque del Player con arma

27

Mover la espada al caminar

28

Creando el ataque con espada

29

Ejecutando el ataque con un botón

30

Movimiento en diagonal

31

Optimizando nuestro player controller

32

Ataque mejorado

33

Uso de partículas

34

Añadir el daño del enemigo en batalla

35

Programando los contadores de vida del enemigo

36

Colocando más info de UI en pantalla

37

Script de la vida

Personaje principal avanzado

38

Añadir el daño del personaje (ejercicio)

39

Sistema de puntos de experiencia para nuestro personaje principal

40

Level Up!

41

Level Up! Defensa y Reto Final del Módulo: Stats de los enemigos

42

Creando un NPC

43

Limitar el movimiento de nuestro NPC

44

Creando una pantalla de diálogos para nuestro RPG

45

El diálogo del NPC

46

Múltiples líneas de diálogo

47

Parar el NPC durante el diálogo

48

Parar el personaje durante el diálogo

Quests

49

La estructura de una quest

50

Quest 1: Ir a un lugar

51

Quest 2: Encontrar un objeto

52

Quest 3: Matar enemigos

53

Revisión de bugs

54

Mantener la cámara dentro del escenario

55

El problema al cambiar de escena

Audio

56

Agregando SFX a nuestro videojuego

57

Agregando música a nuestro videojuego

58

Ajustar volúmen del audio de cada uno de los efectos de sonido

59

Creando un VolumeManager

60

Agregando economía a nuestro juego y cierre

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Mantener Player y Camera entre escenas

17/60
Recursos

¿Cómo evitar sobrecargar el sistema al cambiar de escena?

En el desarrollo de videojuegos, uno de los problemas comunes es la gestión eficiente de los objetos en distintas escenas. Si un jugador o una cámara se duplica cada vez que cambiamos de escena, esto puede llegar a ser problemático y complicado de manejar. Unity nos ofrece una solución a este problema a través de la técnica Don't Destroy On Load, la cual nos permite hacer que ciertos objetos permanezcan entre escenas sin ser destruidos.

¿Cómo implementar la técnica Don't Destroy On Load en Unity?

Para aplicar esta técnica, debemos seguir una serie de pasos claros y sencillos. Primero, identificamos los objetos que deben persistir entre escenas, como el jugador y su cámara. Luego, incorporamos una variable estática en el script del controlador del jugador para verificar si el jugador ya ha sido creado.

¿Qué pasos sigo para configurar el PlayerController?

  1. Definir una variable estática: en el script PlayerController, creamos una variable booleana estática, PlayerCreated, para verificar el estado de creación del jugador.

    public static bool PlayerCreated = false;

  2. Verificar en el método Start: en el método Start, decidimos si el jugador debe ser creado o no. Si PlayerCreated es false, indicamos que el jugador se ha creado y usamos Don't Destroy On Load.

    void Start() { if (!PlayerCreated) { PlayerCreated = true; DontDestroyOnLoad(this.transform.gameObject); } else { Destroy(gameObject); } }

¿Cómo aplico el script Don't Destroy On Load a la cámara?

Para asegurarnos de que la cámara, al igual que el jugador, no se destruya al cambiar de escena, creamos un script específico y lo aplicamos al objeto de cámara principal.

  1. Creación del script: creamos un script llamado DontDestroyOnLoad.

    using UnityEngine;

    public class DontDestroyOnLoad : MonoBehaviour { void Start() { if (!PlayerController.PlayerCreated) { DontDestroyOnLoad(this.transform.gameObject); } else { Destroy(gameObject); } } }

  2. Asignación a la cámara: este script debe asignarse al prefab de la cámara principal para asegurar que persista a través de todas las escenas.

¿Cómo gestiono el teletransporte entre escenas?

Aunque hemos resuelto el problema de duplicación, ahora enfrentamos un nuevo desafío: la sincronización. Al cambiar de escena, es importante que los objetos se ubiquen en la posición adecuada, especialmente si existe un mecanismo de teletransporte.

  • Uso de puntos de spawn: debes definir puntos de spawn en las escenas de destino que correspondan a los puntos de teletransporte de la escena actual.

La técnica de Don't Destroy On Load es crucial para evitar el sobrecargado de personajes y cámaras, optimizando el rendimiento del juego al prevenir cargas innecesarias. Ahora puedes centrarte en la sincronización correcta de los objetos entre escenas, usando puntos clave de referencia para el teletransporte de tus personajes. ¡Continúa experimentando y desarrollando tus habilidades con Unity!

Aportes 6

Preguntas 0

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

como el código tal cual se me presentaba el error, cuando inicia el juego mi cámara se destruía simplemente cambie lo que esta en el método start por el método awake.

Creo que la solución presentada es un poco compleja, y me ha dado algunos errores en versiones posteriores de Unity 2019.3.0f por lo que les dejo mi solución, esta realmente solo tiene que ser agregada sin mas al Game Object que no queramos que sea destruido en la carga de escenas.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class DontDestroyOnLoad : MonoBehaviour
{
    void Awake()
    {
        // Primero creamos un Array que busque y guarde todos los objetos que contengan la misma tag
        GameObject[] objectsWithSameTag = GameObject.FindGameObjectsWithTag(this.gameObject.tag);

        // Si el largo de nuestro array es mayor que uno destruimos el objeto que intenta instanciarse,
        if (objectsWithSameTag.Length > 1)
        {
            Destroy(this.gameObject);
        }

        // Si la condicion de arriba no se cumple llamamos a DontDestroyOnLoad
        DontDestroyOnLoad(this.gameObject);
    }
}

En un inicio no entendia por que lo hacia de esta manera, pero ahora que ya entendi que es lo que sucede, es un truco buenisimo. Puesto que unicamnete tendremos que poner spwan points y no camaras y personajes en cada escena, lo cual ademas de hacerlo mas facil de programar pienso que tambien dara un mejor rendimieto 😄

He seguido las intrucciones, pero no me queda claro como funcionan nuestros nuevos scripts. Es decir, entiendo que en el DontDestroyOnLoad Script, estamos verificando si el PlayerController ya se creo, pero en el PlayerController, estamos cambiando de estado la variable playerCreated a true en caso de que por alguna extraña razón esta, esté falsa No entiendo cuál es el verdadero sentido de tenerla ¿Alguien me puede ayudar a entender?

Yo le sigo dando vueltas al problema de que a veces cuando vuelve al MainScene el Player y la cámara aparecen en otro lado, o el player aparece en el spawn y la cámara en otro lado y tarda medio segundo en ir hasta el player.
En el script del CameraFollow le copie la linea que estaba en Update y se la pegue en el Start.
targetPosition = new Vector3(followTarget.transform.position.x, followTarget.transform.position.y,this.transform.position.z);
Con esto mejoro bastante, pero a veces me pasa lo arriba mencionado. Creo que si uno entra y sale rápido de las escenas es el problema. Quizá dando una pequeña animación en el cambio de escena, que inmovilice un segundo al Player mejoraría bastante el problema. Creo recordar que los primeros Pokemon de Game Boy tenían algo así.

Genial