Si saben que su código está bien, pero al generar los niveles se desfasan, no olviden que su LevelManager debe de estar en la posición 0,0,0 (x,y,z)
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
Vamos a trabajar con Object Pooling, una técnica para reciclar los elementos de nuestro videojuego y evitar sobrecargar la memoria RAM a medida que añadimos estos objetos a la pantalla del videojuego.
Un muy buen ejemplo son los videojuegos de disparos (Call of Duty, por ejemplo), renderizar las balas a medida que los jugadores disparan seria muy costoso, en vez de eso, se reutiliza una cierta cantidad de balas para que después de ser disparadas, sigan su trayectoria y vuelven a la recamara para ser reutilizadas más adelante.
En esta clase, vamos a utilizar esta técnica en nuestro script LevelManager
para crear, destruir y mover los objetos de nuestro videojuego sin sobrecargar la memoria.
Aportes 27
Preguntas 4
Si saben que su código está bien, pero al generar los niveles se desfasan, no olviden que su LevelManager debe de estar en la posición 0,0,0 (x,y,z)
Por si quieren hacer la tarea: Random.Range - Unity 🤓 👌 📖.
Como funciona la correccion, mientras el metodo AddLevelBlock es llamado.
.
El primer bloque de juego es instanciado de acuerdo a los valores obtenidos en la corrección.
.
El segundo bloque de juego es instanciado de acuerdo a los valores obtenidos en la corrección.
Instantiate: Optimiza creando clones de los Prefab. Mas informacion sobre su funcionamiento y reciclaje de de balas en el siguiente link :
https://unity3d.com/es/learn/tutorials/topics/scripting/instantiate
Tambien se puede dejar el código así para que quede un poco más claro
void InsertLevelBlock()
{
int rand_i = Random.Range(0, allTheLevelBlock.Count);
LevelBlock newBlock;
Vector3 currentEndPosition;
if (currentLevelBlocks.Count == 0)
{
newBlock = Instantiate(allTheLevelBlock[0]);
currentEndPosition = levelStartPoint.position;
}
else
{
newBlock = Instantiate(allTheLevelBlock[rand_i]);
currentEndPosition = currentLevelBlocks[currentLevelBlocks.Count - 1].endPoint.position;
}
newBlock.transform.SetParent(this.transform, false);
newBlock.transform.position = currentEndPosition - newBlock.startPoint.position;
currentLevelBlocks.Add(newBlock);
}
Se me complicó un poco el entender la linea 51. Teniendo en cuenta que en mi caso el levelStart es -10 en x y el startPoint del bloque 0 es -14 entonces tenemos en la operación de la corrección para el eje x: 10 - (-14) da un +4. Los bloques se ubican haciendo coincidir la coordenada dada con su centro. Entonces la corrección mueve 14 puntos positivos el bloque, que es la misma distancia que hay desde el centro del bloque hasta el punto inicial del bloque del nivel. Espero esto los ayude a entender mejor. Las coordenadas en el bloque son relativas a el centro del mismo.
Yo hice que el lvl0 solo aparezca solo al principio
en el random(1, allTheLevelBlocks.Count)
No me ha quedado claro algo… ¿por que al asignarle el resultado de la resta de las posiciones del punto final del bloque actual y el inicial del nuevo bloque, a la posición al nuevo bloque, da como resultado el correcto enlazamiento entre ambos bloques?
En pocas palabras, en código lo entiendo, pero en las matemáticas no me cuadra, no se si estoy pasando por alto algo en lo que refiere a las coordenadas globales y locales.
Buenas, alguien sabe como hacer que mi cámara detecte mi player??
Alguien podría explicarme por que se utiliza LevelBlock como tipo de dato para Block… y por que las LISTAS tienen como tipo de dato LevelBlocks
Un mejor metodo para que el spawn no se estropee si el Level Manager no está en el origen es este.
De este modo se garantiza que la generacion de bloques emparentados al LevelManager sea correcta
Yo para poder ver lo que hay más allá he usado un paquete de Unity llamado Cinemachine, es muy útil para cámaras 2D y 3D
Wow quede asombrado con la lógica para hacer el pooling. Sugiero que aquí se puede encontrar más información sobre esta u otras técnicas https://www.youtube.com/watch?v=ZRDHEqy2uPI
Hola, cómo están!
Por favor Juan Gabriel, podrías explicar el porqué hace falta la corrección de la posición del bloque que acabamos de generar:
Vector3 correction = new Vector3(
spawnPosition.x - block.startPoint.position.x,
spawnPosition.y - block.startPoint.position.y,
0);
block.transform.position = correction;
Entiendo que lo que se hace es calcular el vector que lleva desde la posición “spawnPosition” (la EndPosition del bloque anterior) hasta la block.startPoint.position (que es el StartPoint del bloque que acabamos de generar) ¿por qué se hace?
Al comentar el código de la corrección resulta que todos los LevelBlock se generan en el mismo sitio
Al fin pude instanciar los LevelBlocks. Lo ideal es abrir el archivo en Mozilla
https://drive.google.com/file/d/1eMB6NVvw9VLFUExFhKOH3_aVhFOjVTWH/view?usp=sharing
¡Buenísimo! 😃
Me había ocurrido un error al finalizar el script y era que no le habia puesto mi LevelStart a mi LevelManager y tambien que le hice cambios y mi LevelBlock se habia borrado de mi LevelManager y lo que hice fue agregarlo de nuevo, esten atentos y recuerden observar bien para que no les suceda estos pequeños errores
Entre a este curso para aprender C# para videojuegos, pero no estoy aprendiendo nada, sigo el curso al pie de la letra pero cada que se programa no comprendo el porque de las cosas? que me sugieren hacer?
alguien que me ayude a entender bien esta logica de la linea 51 eb el level manager???
Si les da un error de null en el 'Instantiate", les recuerdo (para que no les pase como a mi) que para todos los bloques de niveles se usa el mismo script. 😛
Al darle play y ejecutarse el código los primeros 3 bloques de nivel que se generan se generan del lado izquierdo de la pantalla, es decir en el negativo de la y, los bloques del 4 en adelante se colocan correctamente, podrían ayudarme a solucionarlo, por favor.
Aquí dejo mi código.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LevelManager : MonoBehaviour
{
public static LevelManager sharedInstance;
public List<LevelBlock> allTheLevelBlocks = new List<LevelBlock>();
public List<LevelBlock> currentLevelBlocks = new List<LevelBlock>();
public Transform levelStartPosition;
private void Awake()
{
if(sharedInstance == null)
{
sharedInstance = this;
}
}
void Start()
{
GenerateInitialBlocks();
}
void Update()
{
}
public void AddLevelBlock()
{
int randomIdx = Random.Range(0, allTheLevelBlocks.Count);
LevelBlock block;
Vector3 spawnPosition = Vector3.zero;
if(currentLevelBlocks.Count == 0)
{
block = Instantiate(allTheLevelBlocks[0]);
spawnPosition = levelStartPosition.position;
}
else
{
block = Instantiate(allTheLevelBlocks[randomIdx]);
spawnPosition = currentLevelBlocks[currentLevelBlocks.Count - 1].endPoint.position;
}
block.transform.SetParent(this.transform, false);
Vector3 correction = new Vector3(spawnPosition.x - block.startPoint.position.x,
spawnPosition.y - block.startPoint.position.y, 0);
block.transform.position = correction;
currentLevelBlocks.Add(block);
}
public void RemoveLevelBlock()
{
}
public void RemoveAllLevelBlocks()
{
}
public void GenerateInitialBlocks()
{
for(int i = 0; i < 2; i++)
{
AddLevelBlock();
}
}
}
En el minuto 6.59 habla de que si el primer bloque es igual a 0 pero no entiendo bien la logica de este IF
¿me ayudas?
me sale error en la linea que dice “block.transform.SetParent(this.transform, false);”
El error es este: " error CS1061: ‘LevelBlock’ does not contain a definition for ‘Transform’ and no accessible extension method ‘Transform’ accepting a first argument of type ‘LevelBlock’ could be found (are you missing a using directive or an assembly reference?)"
Creo que se refiere a que block es una clase que no hereda propiedades de unity, por lo que no lleva transform. Pero si ese es el caso como es que al profesor le funciona.
Ayudaaaa
Genial
por que el GameManager no hace el trabajo del LevelManager ?
¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.