Menu
CoddyTech

Componentes pequenos

Parte da seção Arquitetura de Jogos no Unity do Journey de Unity da Coddy. Lição 1 de 64.

Um GameObject é uma lista de componentes, e cada script que você escreve é mais um deles. Os jogos Unity são criados dando uma tarefa a cada script e colocando vários scripts em um objeto. O movimento, os disparos e os pontos de vida de um jogador poderiam ficar todos em um único PlayerController, mas, como três componentes, Mover, Shooter e Health, cada um também pode ser colocado em outros objetos:

public class Health : MonoBehaviour
{
    public int hp = 3;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
    }
}
  • Jogador: Mover, Shooter, Health
  • Artilharia: Shooter, Health
  • Caixa: Health

Com classes C# comuns, você poderia criar uma árvore em vez disso: Character, depois ShootingCharacter : Character e, então, Player : ShootingCharacter. Uma artilharia atira, mas nunca anda, e uma caixa apenas se quebra, então cada novo tipo de objeto significa remodelar a árvore. Com componentes, um novo tipo de objeto é uma nova combinação de scripts que já existem, reunidos no Inspector, e cada script pode ter seus próprios valores ali: um Mover lento em um objeto, um rápido em outro.

Os componentes de um mesmo objeto compartilham seu Transform, então cada um deve alterar apenas a parte que lhe cabe. Um Mover que adiciona valores a x e z com transform.position += deixa y intacto, permitindo que um Jumper no mesmo objeto ainda altere a altura. Um Mover que definisse a posição inteira como new Vector3(x, 0.5f, z) redefiniria y a cada quadro e cancelaria o salto.

challenge icon

Desafio

Fácil

Divida Boat.cs para que cada script tenha uma única função.

  1. Mova o movimento de subir e descer para Bobber: startY definido em Start(), o movimento de subir e descer em Update(), usando seus próprios height e speed.
  2. Mova o piscar para Blinker, com seu próprio temporizador.
  3. Exclua as duas funções e seus campos de Boat, para que ele apenas controle a direção.

Pressione “Jogar”: o pato sobe e desce, a boia pisca e o barco é controlado. Em seguida, “Verificar”.

Experimente você mesmo

using UnityEngine;
using UnityEngine.InputSystem;

// Um script, três tarefas: controlar a direção, balançar e piscar.
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()
    {
        // controle da direção
        Vector2 input = moveAction.ReadValue<Vector2>();
        transform.position += new Vector3(input.x, 0f, input.y) * speed * Time.deltaTime;

        // balanço
        Vector3 p = transform.position;
        p.y = startY + Mathf.Sin(Time.time * bobSpeed) * bobHeight;
        transform.position = p;

        // piscar
        blinkTimer += Time.deltaTime;
        if (blinkTimer >= blinkInterval)
        {
            blinkTimer -= blinkInterval;
            lamp.enabled = !lamp.enabled;
        }
    }
}

Todas as lições de Arquitetura de Jogos no Unity

Pratique por conta própria: Playground de Unity