Fila | C# | Unity – Estrutura de dados
Imagine um mundo de fantasia onde inimigos aterrorizantes surgem continuamente para desafiar os heróis. A cada momento, novos monstros aparecem na cena, aguardando sua vez de atacar. Essa organização precisa é gerenciada por uma estrutura de dados conhecida como fila (queue).
Uma fila é uma estrutura de dados linear que segue o princípio FIFO (First In, First Out). Isso significa que o primeiro elemento a entrar na fila é o primeiro a sair, assim como em uma fila de pessoas esperando para serem atendidas em um banco. A primeira pessoa a entrar na fila é a primeira a ser atendida, garantindo uma ordem justa e organizada.
No mundo dos jogos, a fila é essencial para manter a ordem dos eventos, como o surgimento de inimigos. Graças à fila, os monstros surgem de maneira estruturada e previsível, permitindo que o fluxo do jogo seja equilibrado e que os jogadores possam se preparar adequadamente para cada batalha.
Características Principais:
- FIFO (First In, First Out): O primeiro inimigo a entrar na fila é o primeiro a atacar.
- Operações Básicas:
- Enqueue: Adiciona um inimigo ao final da fila.
- Dequeue: Remove e retorna o inimigo no início da fila.
- Peek: (opcional) Dá uma olhada no inimigo no início da fila sem removê-lo
Exemplo de Implementação em C#
Classe SimpleQueue<T>
A SimpleQueue<T>
é uma implementação genérica de uma fila (queue) que utiliza uma lista (List<T>
) como estrutura subjacente para armazenar os elementos. A classe oferece operações básicas de uma fila: enfileirar (enqueue), desenfileirar (dequeue), verificar o tamanho (count) e espiar (peek) o próximo elemento.
Atributos:
private List&amp;amp;amp;amp;lt;T&amp;amp;amp;amp;gt; elemetns = new List&amp;amp;amp;amp;lt;T&amp;amp;amp;amp;gt;();
elements
: Esta é a lista que armazena os elementos da fila. Usamos uma lista (List<T>
) porque ela nos permite adicionar e remover elementos facilmente.
Métodos:
Enqueue(T item)
public void Enqueue(T item) { elemetns.Add(item); }
- Descrição: Este método adiciona um novo elemento ao final da fila.
- Parâmetros:
T item
– O elemento a ser adicionado à fila. - Implementação: Usa o método
Add
da lista para adicionar o item ao final da listaelements
.
Dequeue()
&amp;amp;amp;amp;lt;/pre&amp;amp;amp;amp;gt; public T Dequeue() { if (elemetns.Count == 0) { return default(T); } T item = elemetns[0]; elemetns.RemoveAt(0); return item; }
- Descrição: Este método remove e retorna o primeiro elemento da fila.
- Retorno:
T
– O primeiro elemento da fila. Se a fila estiver vazia, retorna o valor padrão do tipoT
. - Implementação:
- Primeiro, verifica se a fila está vazia (
elements.Count == 0
). Se estiver, retornadefault(T)
, que é o valor padrão do tipoT
(por exemplo,0
paraint
,null
para tipos de referência). - Se a fila não estiver vazia, captura o primeiro elemento (
elements[0]
), remove-o da lista (elements.RemoveAt(0)
) e retorna o elemento capturado.
- Primeiro, verifica se a fila está vazia (
Count()
public int Count() { return elemetns.Count; }
- Descrição: Este método retorna o número de elementos na fila.
- Retorno:
int
– O número de elementos atualmente na fila. - Implementação: Retorna o valor da propriedade
Count
da listaelements
.
Peek()
&amp;amp;amp;amp;lt;/pre&amp;amp;amp;amp;gt; public T Peek() { if (elements.Count == 0) return default(T); return elements[0]; } &amp;amp;amp;amp;lt;pre&amp;amp;amp;amp;gt;
- Descrição: Este método retorna o primeiro elemento da fila sem removê-lo.
- Retorno:
T
– O primeiro elemento da fila. Se a fila estiver vazia, retorna o valor padrão do tipoT
. - Implementação:
- Verifica se a fila está vazia (
elements.Count == 0
). Se estiver, retornadefault(T)
. - Se a fila não estiver vazia, retorna o primeiro elemento (
elements[0]
) sem removê-lo.
- Verifica se a fila está vazia (
Resumo
A SimpleQueue<T>
é uma implementação genérica de uma fila que oferece as seguintes operações:
- Enqueue(T item): Adiciona um elemento ao final da fila.
- Dequeue(): Remove e retorna o primeiro elemento da fila.
- Count(): Retorna o número de elementos na fila.
- Peek(): Retorna o primeiro elemento da fila sem removê-lo.
Esta implementação usa uma lista (List<T>
) para armazenar os elementos, o que facilita a adição e remoção de itens, mas pode não ser a implementação mais eficiente para filas muito grandes devido ao custo de remoção do primeiro elemento (que requer o deslocamento dos elementos subsequentes). Para usos básicos e moderados, no entanto, esta implementação é simples e eficaz.
Aplicação
Para utilizar a classe de Fila (Queue) , vamos instanciar os inimigos conforme adicionados na FILA.
Exemplo de Uso: Spawn de Inimigos
Vamos criar uma fila para instanciar os inimigos que aparecem no jogo:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SpawnManager : MonoBehaviour { public GameObject[] enemyPrefabs; // Array para armazenar os diferentes tipos de inimigos private SimpleQueue&amp;amp;amp;amp;amp;amp;amp;amp;lt;GameObject&amp;amp;amp;amp;amp;amp;amp;amp;gt; spawnQueue; // Start is called before the first frame update void Start() { spawnQueue = new SimpleQueue&amp;amp;amp;amp;amp;amp;amp;amp;lt;GameObject&amp;amp;amp;amp;amp;amp;amp;amp;gt;(); EnqueueSpawns(); StartCoroutine(SpawnEnemies()); } void EnqueueSpawns() { // Adiciona os inimigos à fila para serem spawnados foreach (GameObject enemy in enemyPrefabs) { spawnQueue.Enqueue(enemy); } } IEnumerator SpawnEnemies() { while (true) { if (spawnQueue.Count() &amp;amp;amp;amp;amp;amp;amp;amp;gt; 0) { GameObject enemyToSpawn = spawnQueue.Dequeue(); GameObject spawnedEnemy = SpawnEnemy(enemyToSpawn); yield return new WaitForSeconds(2); // Espera 2 segundos antes de spawnar o próximo inimigo spawnQueue.Enqueue(enemyToSpawn); // Reenfileira o inimigo para ser spawnado novamente yield return new WaitForSeconds(3); // Tempo que o inimigo ficará ativo na cena RemoveEnemy(spawnedEnemy); // Remove o inimigo da cena } else { yield return null; } } } GameObject SpawnEnemy(GameObject enemy) { Vector3 spawnPosition = new Vector3(Random.Range(-8f, 8f), Random.Range(-4f, 4f), 0); GameObject spawnedEnemy = Instantiate(enemy, spawnPosition, Quaternion.identity); return spawnedEnemy; } void RemoveEnemy(GameObject enemy) { Destroy(enemy); } }
Exemplo
Conclusão
Uma fila é uma estrutura de dados essencial para gerenciar sequências de eventos em jogos. Ela garante que os inimigos apareçam de maneira ordenada, criando um fluxo de jogo previsível e equilibrado, onde os jogadores podem se preparar para cada batalha de forma justa e estruturada. Estude Fila!
Luciano Luciano
Artigo muito bonito e organizado parabéns.