Menu
CoddyTech

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.

challenge icon

Desafío

Fácil

Divide Boat.cs para que cada script haga una sola tarea.

  1. Mueve el balanceo a Bobber: startY se establece en Start(), el balanceo va en Update() y usa su propio height y speed.
  2. Mueve el parpadeo a Blinker, con su propio temporizador.
  3. 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

Practica por tu cuenta: Playground de Unity