Componentes pequeños
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 1 de 50.
Un GameObject es una lista de componentes, y cada script que escribes es uno más. Los juegos de Unity se crean asignando una tarea a cada script y poniendo varios scripts en un objeto. El movimiento, los disparos y los puntos de vida de un jugador podrían estar todos en un único PlayerController, pero como tres componentes, Mover, Shooter y Health, cada uno también puede ir en otros objetos:
public class Health : MonoBehaviour
{
public int hp = 3;
public void TakeDamage(int amount)
{
hp -= amount;
if (hp <= 0)
{
Destroy(gameObject);
}
}
}- Jugador: Mover, Shooter, Health
- Torreta: Shooter, Health
- Caja: Health
Con clases simples de C# podrías construir un árbol en su lugar: Character, después ShootingCharacter : Character y luego Player : ShootingCharacter. Una torreta dispara, pero nunca camina, y una caja solo se rompe, así que cada nuevo tipo de objeto implica cambiar la estructura del árbol. Con componentes, un nuevo tipo de objeto es una nueva combinación de scripts que ya existen, reunidos en el Inspector, y cada script puede tener sus propios valores allí: un Mover lento en un objeto y uno rápido en otro.
Los componentes de un mismo objeto comparten su Transform, así que cada uno solo debería cambiar la parte que le corresponde. Un Mover que suma a x y z con transform.position += deja y intacta, así que un Jumper en el mismo objeto aún puede cambiar la altura. Un Mover que estableciera la posición completa en new Vector3(x, 0.5f, z) volvería a poner y en cada fotograma y cancelaría el salto.
Desafío
FácilBoat.cs hace tres trabajos a la vez: las flechas (la acción Move) dirigen el barco, el barco cabecea sobre las olas y su lámpara parpadea. El pato también necesita cabecear, y la boya necesita cabecear y parpadear, así que la escena ya les proporciona los componentes Bobber y Blinker, y el barco tiene los tres. Divide Boat.cs entre ellos:
- Bobber: cada objeto cabecea alrededor de la altura a la que empieza,
heightunidades hacia arriba y hacia abajo, a su propiaspeed(el Inspector establece ambos valores). Bobber solo cambia la y de la posición, así que el barco aún puede dirigirse. - Blinker: enciende y apaga
lamp(un Renderer) cadaintervalsegundos. - Boat conserva solo la dirección: elimina el cabeceo y el parpadeo, junto con sus campos.
Pulsa Play y dirige el barco, luego pulsa Check.
Pruébalo tú mismo
using UnityEngine;
using UnityEngine.InputSystem;
// Un script, tres tareas: dirigir, oscilar y parpadear.
public class Boat : MonoBehaviour
{
public float speed = 3f;
public float bobHeight = 0.1f;
public float bobSpeed = 2f;
public Renderer lamp;
public float blinkInterval = 0.5f;
private InputAction moveAction;
private float startY;
private float blinkTimer;
void Start()
{
moveAction = InputSystem.actions.FindAction("Move");
startY = transform.position.y;
}
void Update()
{
// dirigir
Vector2 input = moveAction.ReadValue<Vector2>();
transform.position += new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime;
// oscilar
Vector3 p = transform.position;
p.y = startY + Mathf.Sin(Time.time * bobSpeed) * bobHeight;
transform.position = p;
// parpadear
blinkTimer += Time.deltaTime;
if (blinkTimer >= blinkInterval)
{
blinkTimer -= blinkInterval;
lamp.enabled = !lamp.enabled;
}
}
}
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