GetComponents
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 8 de 50.
GetComponent<T>() devuelve la primera coincidencia. GetComponents<T>() devuelve todas las coincidencias del objeto como una matriz, y GetComponentsInChildren<T>() devuelve todas las coincidencias del objeto y de todo lo que hay debajo. Si T es una interfaz, una sola llamada recopila todas las partes que pueden hacer algo, sea cual sea su clase. Aquí, las máquinas de una fábrica son hijas del objeto Factory, y cada parte que funciona con energía implementa IPowered:
public interface IPowered
{
void SetPower(bool on);
}public class Generator : MonoBehaviour
{
public GameObject factory;
public void Switch(bool on)
{
IPowered[] parts = factory.GetComponentsInChildren<IPowered>();
foreach (IPowered part in parts)
{
part.SetPower(on);
}
Debug.Log(parts.Length + " parts powered");
}
}Una Lamp enciende su Light, un Fan empieza a girar y un Conveyor empieza a moverse, cada uno en su propio SetPower. Una máquina con una Lamp y un Fan en un mismo objeto cuenta dos veces, ya que cada componente es una coincidencia independiente. Generator nunca los nombra, así que una Siren que implemente IPowered y se añada bajo Factory más adelante se encenderá con la siguiente llamada a Switch.
GetComponentsInChildren incluye el objeto sobre el que lo llamas y omite los hijos inactivos, a menos que pases true: GetComponentsInChildren<IPowered>(true). GetComponents solo busca en un objeto, lo que resulta adecuado para partes que están una al lado de la otra, como una luz y un zumbador en una misma puerta.
Desafío
FácilEl robot de entrenamiento debería mostrar cada golpe. Health.cs en el Robot cuenta hp, y tres partes pueden reaccionar: Flash en la Head la pone roja, Recoil en el Robot lo sacude hacia atrás y Sparks en la Antenna lanza chispas. La barra espaciadora golpea al robot con 1 y un clic lo golpea con 2 (Trainer.cs, listo). Ahora mismo, Health solo avisa a la cabeza.
- En IHitReaction.cs, declara una interfaz
IHitReactioncon un método,void React(int damage). - Haz que Flash, Recoil y Sparks la implementen: el método de cada uno pasa a ser
React(int damage). Flash hace lo mismo que antes. Recoil sacude el robot hacia atrás 0.5 unidades (+z) por cada punto de daño, y Sparks lanza una chispa por cada punto de daño. - En
TakeDamagede Health, después de que hp disminuya, llama aReact(amount)en cada IHitReaction del Robot y sus elementos secundarios, encontrados con una sola llamada a GetComponentsInChildren, y registra cuántos reaccionaron, comoReactions: 3.
Pulsa Play, golpea al robot con la barra espaciadora y con un clic, y luego pulsa Check.
Pruébalo tú mismo
using UnityEngine;
public class Health : MonoBehaviour
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
GetComponentInChildren<Flash>().Show();
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Arquitectura de juegos en Unity
1Componentes, no jerarquías
Componentes pequeñosUn script base para enemigosComponentes abstractosComponentes que trabajan juntosRepaso: torreta modular4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botín7Máquinas de estados
Estados como clasesUna máquina de estadosTransicionesCerebros de enemigosRepaso: estados de puertas10Proyecto: Superviviente de la arena
El héroeTipos de enemigos2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: tecla de interacción5ScriptableObjects
Recursos de datosEstadísticas de armasConfiguración compartidaOleadas como datosRepaso: base de datos de objetos