Componentes pequeños
Parte de la sección Arquitectura de juegos en Unity del Journey de Unity de Coddy. Lección 1 de 64.
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 colocando 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 asignarse a 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 crear un árbol en su lugar: Character, después ShootingCharacter : Character, después Player : ShootingCharacter. Una torreta dispara, pero nunca camina, y una caja solo se rompe, así que cada nuevo tipo de objeto implica reestructurar el á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 allí sus propios valores: 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 debería cambiar solo 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 todavía puede cambiar la altura. Un Mover que estableciera toda la posición en new Vector3(x, 0.5f, z) volvería a asignar y en cada fotograma y cancelaría el salto.
Desafío
FácilDivide Boat.cs para que cada script haga una sola tarea.
- Mueve el balanceo a
Bobber:startYse establece enStart(), el balanceo va enUpdate()y usa su propioheightyspeed. - Mueve el parpadeo a
Blinker, con su propio temporizador. - Elimina ambas tareas y sus campos de
Boat, para que solo dirija la embarcación.
Pulsa «Jugar»: el pato se balancea, la boya parpadea y la embarcación se dirige. Después, pulsa «Comprobar».
Pruébalo tú mismo
using UnityEngine;
using UnityEngine.InputSystem;
// Un script, tres tareas: dirigir, balancearse 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()
{
// dirección
Vector2 input = moveAction.ReadValue<Vector2>();
transform.position += new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime;
// balanceo
Vector3 p = transform.position;
p.y = startY + Mathf.Sin(Time.time * bobSpeed) * bobHeight;
transform.position = p;
// parpadeo
blinkTimer += Time.deltaTime;
if (blinkTimer >= blinkInterval)
{
blinkTimer -= blinkInterval;
lamp.enabled = !lamp.enabled;
}
}
}
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