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 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.

challenge icon

Desafío

Fácil

Boat.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, height unidades hacia arriba y hacia abajo, a su propia speed (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) cada interval segundos.
  • 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;
        }
    }
}
quiz iconPonte a prueba

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