Menu
CoddyTech

Listas no Inspector

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

Uma lista de entradas [System.Serializable] é uma tabela que você preenche no Inspector. Esse guarda percorre uma rota com várias paradas e espera em cada uma pelo tempo indicado na entrada:

[System.Serializable]
public class Stop
{
    public Transform point;
    public float wait = 1f;
}

public class Patrol : MonoBehaviour
{
    public float speed = 3f;
    public List<Stop> stops;
    private int current;
    private float waited;

    void Update()
    {
        Stop stop = stops[current];
        transform.position = Vector3.MoveTowards(transform.position, stop.point.position, speed * Time.deltaTime);
        if (transform.position != stop.point.position) return;
        waited += Time.deltaTime;
        if (waited >= stop.wait)
        {
            waited = 0f;
            current = (current + 1) % stops.Count;
        }
    }
}

O Inspector mostra Stops com sua quantidade e uma seção expansível para cada entrada: Element 0, Element 1 e assim por diante, cada uma com Point e Wait. O botão + adiciona uma entrada, o botão de menos remove a entrada selecionada, e a alça à esquerda de uma linha permite arrastá-la para outro lugar na rota. O código lê a lista como de costume: stops.Count entradas, stops[current].point, e (current + 1) % stops.Count volta para a primeira parada depois da última. Um designer de fases pode atribuir três paradas a um guarda e dez a outro sem tocar no script.

Um array, public Stop[] stops;, é exibido da mesma forma. O botão + do Unity copia a última entrada, então uma nova parada começa com o mesmo ponto e tempo de espera da entrada acima. O Unity não exibe nem salva uma lista de listas, como List<List<Stop>>, nem um Dictionary. Em vez disso, encapsule a lista interna em uma classe [Serializable], como uma Route com sua própria List<Stop>, e mantenha uma lista dessas classes.

challenge icon

Desafio

Fácil

Mostre a conversa de Mira e Tom uma linha de cada vez.

  1. Declare uma classe [System.Serializable] Line com as strings públicas speaker e text, e adicione public List<Line> lines;.
  2. No início, mostre lines[0]: o interlocutor em speakerText, o texto em lineText.
  3. A tecla Espaço mostra a próxima linha, até lines.Count. Depois da última, oculte box e registre Dialogue over; então, pressionar Espaço não faz nada.

Pressione “Jogar” e leia usando a tecla Espaço. Depois, pressione “Verificar”.

Experimente você mesmo

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
using TMPro;

public class Dialogue : MonoBehaviour
{
    public GameObject box;
    public TMP_Text speakerText;
    public TMP_Text lineText;

    void Start()
    {
        // mostra a primeira fala
    }

    void Update()
    {
        // Space: a próxima fala ou o fim da conversa
    }
}

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

Pratique por conta própria: Playground de Unity