[UNITY] Buenas prácticas en scripting

B

Mira que me da pena abrir hilos para estas cosas tan simples pero...

Pongamos el ejemplo de que tengo dos objetos, un Player y un Bullet:

  • Bullet tiene un script donde controla su movimiento y demás.
  • Player tiene un script donde controla su movimiento y al pulsar una tecla, instanciar un Bullet.

Por lo tanto es sencillo, el script de Player "controla" el inicio del script de Bullet.

¿Ahora la duda, y si quiero instanciar por ejemplo enemigos que dependen del escenario o de un contador? Creo el script con un timer y cuando llegue a 0 instancia un Enemy, pero... ¿a quien le doy ese script?

cabron

De entrada, deberías evitar instanciar objetos durante la partida. Instanciar objetos tiene un coste y puedes acabar creando pausas que se van a notar.

Es mejor instanciar todo lo que sepas que vas a usar de antemano durante la carga del nivel, y meter los objetos que no uses en un pool (por ejemplo enemigos muertos) y cuando necesites otro enemigo recuperarlo del pool en lugar de instanciar otro, así además reduces la posibilidad de que el recolector de basura te pause el juego.

Para eso además de tener un pool, tus objetos tienen que tener la capacidad de poder reiniciarse y volver a aparecer como si fuesen nuevos.

Respecto a lo que preguntas, deberías crear una clase que represente todo el nivel, y que tenga la lógica que aplica a todo el nivel.

Esta es la solución que se usa en Unreal donde cada nivel tiene su "level buleprint" y a mi me parece bastante correcta.

Nada de esto es especifico de Unity, que hace un tiempo que no lo uso, no sé si hay alguna recomendación mejor teniendo en cuenta las particularidades de Unity

2 respuestas
B
#2cabron:

De entrada, deberías evitar instanciar objetos durante la partida. Instanciar objetos tiene un coste y puedes acabar creando pausas que se van a notar.

Esto lo tengo en cuenta y las balas las elimino cuando pasa un tiempo determinado. Los enemigos por posición. Entiendo que destruyendo los objetos no quedan consumiendo recursos.

2 respuestas
cabron

#3

Te he hablado de esto también en mi respuesta, si destruyes objetos durante la partida, puedes acabar provocando pausas por el recolector de basura, tienes que usar un pool

1 respuesta
B

#3 Nada de destruir, un pool de objetos lo que permite es cargar un número determinado de objetos que siempre van a estar en la escena. De esta manera no saturas el juego con creación y destrucción.

Al estar ya precargados, lo único que tienes que hacer es enable y disable, además de darle la posición, rotación y/o lo que quieras añadirle.

Un ejemplo es el Mario Bros. En vez de crear 10 koopas, tienes 3 precargados, mientras están en escena usas esos, que no están en escena, los deshabilitas.

B

#4 Vale, no lo había entendido así. Me lo apunto para corregir en cuanto pueda.

#2cabron:

Respecto a lo que preguntas, deberías crear una clase que represente todo el nivel, y que tenga la lógica que aplica a todo el nivel.

Con "Crear una clase" a que nos referimos en Unity?

1 respuesta
cabron

#6

Los scripts son clases de C# normales y corrientes, con la única particularidad de que heredan de una clase particular (MonoBehaviour), y eso hace que se integren en el editor y que Unity las gestione automáticamente, pero son clases al fin y al cabo.

Crea un gameobject vacío y añádele un script donde pones el código para gestionar las cosas relacionadas con el nivel.

1 respuesta
B
#7cabron:

Crea un gameobject vacío y añádele un script

A eso me refería, gracias.

LordMogor

#1 Crea un script llamado "EnemyManager" y ponlo en la Cámara (esto no es determinante), entonces:

  • Crea una Lista que almacene todos los enemigos de la pool precargados (mírate como funcionan las Listas y Diccionarios de Unity).
  • Pon en la pool un nº algo mayor de los posibles enemigos que puedan coincidir en pantalla (activos)...para que no te quedes sin enemigos que invocar.
  • Cuando tu timer de la orden, sacas a un enemigo de la lista y lo activas.
  • Cuando el enemigo termine su trabajo (por ejemplo cuando muere) regresa a la lista y lo desactivas (a la pool).
  • Cada enemigo tiene su propio script con su comportamiento.
  • La pool es una posición XY(Z) fuera de pantalla simplemente, y allí los objetos-enemigos están apagados.
  • Usa Estados De Máquina para los enemigos! (mírate como funciona este asunto).

Bueno, así es como yo hago estas cosas y los Fps siempre están arriba!
P.D: Pido disculpas si ya sabes de estos asuntos :(

2 1 respuesta
B

#9 Perfecta la explicación, muchas gracias.

Usuarios habituales