GetComponents
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 9 de 64.
GetComponent<T>() devuelve la primera coincidencia. GetComponents<T>() devuelve todas las coincidencias del objeto en forma de matriz, y GetComponentsInChildren<T>() devuelve todas las coincidencias del objeto y de todo lo que hay debajo de él. 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 lo hace en su propio SetPower. Una máquina con una Lamp y un Fan en el 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 más adelante bajo Factory se encenderá con la siguiente llamada a Switch.
GetComponentsInChildren incluye el objeto sobre el que lo llamas y omite los objetos secundarios que estén inactivos, a menos que le pases true: GetComponentsInChildren<IPowered>(true). GetComponents solo examina ese objeto, lo que resulta útil para las partes que están una al lado de la otra, como una luz y un timbre en una misma puerta.
Desafío
FácilHaz que cada parte del robot reaccione al recibir un golpe.
- En
IHitReaction.cs, declarapublic interface IHitReactionconvoid React(int damage);. - Haz que
Flash,RecoilySparksimplementen esta interfaz: cambia el nombre de cada método apublic void React(int damage). - Recoil se mueve hacia atrás
0.5f * damage; Sparks lanzadamagechispas. - En
TakeDamage, llama aReact(amount)en cada elemento deGetComponentsInChildren<IHitReaction>()y después registraReactions: 3(su cantidad).
Pulsa «Jugar», pulsa la barra espaciadora y después haz clic. Luego, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
public class Health : MonoBehaviour
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
GetComponentInChildren<Flash>().Show();
}
}
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 modularRepaso: cañón doble4Datos serializados
Clases serializablesListas en el InspectorEnumeraciones en el InspectorRepaso: tabla de botínRepaso: sortear el botín2Interfaces en Unity
IDamageableInterfaces y TryGetComponentGetComponentsRepaso: Tecla de interacciónRepaso: El más cercano al alcance5ScriptableObjects
Activos de datosEstadísticas de armasConfiguración compartidaGuardar el vientoOleadas como datosRepaso: base de datos de objetosRepaso: comprar en la tienda3Eventos
Eventos de C# en UnitySuscribirse en OnEnableCampos UnityEventLos eventos controlan la interfazRepaso: ventana emergente de logrosRepaso: temporizador de la ventana emergentePractica por tu cuenta: Playground de Unity