Como Criar um Sistema Básico de Drops Aleatórios na Godot



Aprenda passo a passo como desenvolver um sistema de loot para seus inimigos utilizando GDScript. Este tutorial é ideal para quem está começando na Godot e deseja criar mecânicas presentes em praticamente qualquer RPG ou jogo de ação.

📚 O que você aprenderá

  • Como funciona um sistema de drops.
  • Como utilizar porcentagens.
  • Como gerar números aleatórios.
  • Como instanciar itens automaticamente.
  • Como deixar seu código preparado para expansão.

No artigo anterior explicamos a teoria por trás dos drops aleatórios e mostramos por que a maioria dos jogos utiliza porcentagens em vez de simplesmente escolher um item de forma totalmente aleatória. Agora vamos colocar tudo isso em prática criando um sistema simples, organizado e fácil de expandir. Ao final deste tutorial você poderá utilizar exatamente o mesmo sistema em RPGs, jogos de sobrevivência, roguelikes e praticamente qualquer outro gênero.

🎮 Como funciona um sistema de Drop?

Sempre que um inimigo é derrotado precisamos responder uma pergunta:

Qual item deverá aparecer?

Para responder essa pergunta utilizaremos um número aleatório entre 1 e 100. Dependendo do número sorteado, um item diferente será criado.

Item Chance
🪙 Moeda 70%
❤️ Poção 20%
💎 Gema 10%

Imagine que o jogo sorteou o número:

63

Como 63 está dentro da faixa da Moeda, ela será criada. Se o número fosse 85, a recompensa seria uma Poção. Já um número entre 91 e 100 geraria uma Gema.

📂 Preparando o Projeto

Antes de escrever qualquer código, vamos organizar nossos arquivos.

 

res://

Drops/

Coin.tscn

Potion.tscn

Gem.tscn

Cada item será uma cena independente. Isso facilita adicionar novos itens no futuro sem alterar o sistema principal.

💡 Dica Cada cena pode conter apenas um Sprite2D e um CollisionShape2D neste primeiro momento. Depois criaremos o sistema de coleta automática.

📝 Criando a Lista de Drops

Abra o script do inimigo e adicione a seguinte variável:

 
@export var drops = [

{

"scene": preload("res://Drops/Coin.tscn"),

"chance":70

},

{

"scene": preload("res://Drops/Potion.tscn"),

"chance":20

},

{

"scene": preload("res://Drops/Gem.tscn"),

"chance":10

}

]

Essa estrutura funciona como uma pequena tabela de loot. Cada item possui duas informações importantes:

  • A cena que será criada.
  • A porcentagem de chance.
Na próxima parte vamos aprender como gerar os números aleatórios e criar automaticamente o item correto.

🎲 Gerando um Número Aleatório

Agora precisamos escolher qual item será criado. Para isso utilizaremos um número aleatório entre 1 e 100.

 
func _ready():

    randomize()
.

A função randomize() inicializa o gerador de números aleatórios da Godot. Sem ela, o jogo poderá repetir exatamente a mesma sequência de números sempre que iniciar.

Importante

Nas versões mais recentes da Godot também é possível utilizar a classe RandomNumberGenerator, que oferece maior controle e organização. Neste tutorial utilizaremos a forma mais simples para facilitar o aprendizado.

⚙ Criando a Função de Drop

Agora vamos criar a função responsável por decidir qual item deverá aparecer.


func drop_item():

    var numero = randi_range(1,100)

    var acumulado = 0

    for item in drops:

        acumulado += item.chance

        if numero <= acumulado:

            var novo_item = item.scene.instantiate()

            novo_item.global_position = global_position

            get_tree().current_scene.add_child(novo_item)

            return
O que esse código faz?
  1. Sorteia um número entre 1 e 100.
  2. Percorre todos os itens da lista.
  3. Soma as porcentagens.
  4. Quando encontrar a faixa correspondente, cria o item.

🔍 Entendendo Linha por Linha

1. Sorteando um número

 
var numero = randi_range(1,100)

Imagine que o número sorteado foi:

82

Esse será o valor utilizado para decidir qual recompensa será criada.


2. Criando uma variável acumuladora

 
var acumulado = 0

Essa variável irá armazenar a soma das porcentagens conforme percorremos a lista.


3. Percorrendo todos os itens

 
for item in drops:

O loop irá analisar um item por vez. Primeiro a Moeda. Depois a Poção. Por último a Gema.


4. Somando as chances

 
acumulado += item.chance

O valor acumulado ficará assim:

Item Acumulado
Moeda 70
Poção 90
Gema 100

5. Descobrindo qual item venceu

 
if numero <= acumulado:

Vamos imaginar alguns exemplos.

Número sorteado: 18
  • 18 é menor que 70.
  • Resultado: Moeda.
Número sorteado: 83
  • 83 é maior que 70.
  • 83 é menor que 90.
  • Resultado: Poção.
Número sorteado: 96
  • 96 é maior que 90.
  • 96 é menor que 100.
  • Resultado: Gema.

Essa técnica é chamada de seleção por peso (Weighted Random) e é utilizada por praticamente todos os jogos que possuem sistemas de loot.

📦 Criando o Item na Cena

 
var novo_item = item.scene.instantiate()

Aqui criamos uma nova instância da cena correspondente ao item escolhido. É exatamente o mesmo processo utilizado para criar um inimigo ou um projétil durante o jogo.

 
novo_item.global_position = global_position

Agora posicionamos o item exatamente onde o inimigo morreu.

 
get_tree().current_scene.add_child(novo_item)

Por fim, adicionamos o item à cena atual para que ele fique visível e possa ser coletado pelo jogador.

✅ Pronto! Seu sistema de drops já está totalmente funcional. Sempre que essa função for chamada, um item será escolhido automaticamente de acordo com as porcentagens definidas.

💀 Chamando o Drop Quando o Inimigo Morre

Agora basta chamar a função no momento em que o inimigo for derrotado.

 
func morrer():

    drop_item()

    queue_free()

Primeiro criamos o item. Depois removemos o inimigo da cena. Essa ordem garante que o drop apareça exatamente na posição correta.

🎉 Agora seu inimigo já é capaz de deixar recompensas automaticamente após ser derrotado. Na próxima parte vamos deixar esse sistema muito mais profissional adicionando melhorias utilizadas em jogos comerciais.

🚀 Melhorando o Sistema de Drops

Agora que você possui um sistema funcionando, chegou a hora de deixá-lo preparado para projetos maiores. Os jogos comerciais normalmente utilizam algumas melhorias para tornar o loot mais interessante e equilibrado.

❌ Chance de não dropar nada

Nem todo inimigo precisa deixar um item ao ser derrotado. Você pode adicionar essa possibilidade incluindo um registro sem cena.

 
@export var drops = [

{
"scene":null,
"chance":40
},

{
"scene":preload("res://Drops/Coin.tscn"),
"chance":45
},

{
"scene":preload("res://Drops/Potion.tscn"),
"chance":10
},

{
"scene":preload("res://Drops/Gem.tscn"),
"chance":5
}

]

Depois basta verificar se existe uma cena antes de instanciá-la.

 
if item.scene != null:

    var novo_item = item.scene.instantiate()

    novo_item.global_position = global_position

    get_tree().current_scene.add_child(novo_item)
Agora alguns inimigos simplesmente não deixarão recompensa, tornando o jogo mais equilibrado.

⭐ Criando Raridades

Outra melhoria muito comum é classificar os itens por raridade.

Raridade Chance
Comum 70%
Incomum 20%
Raro 8%
Lendário 2%

Essa organização facilita muito o balanceamento do jogo conforme novos itens são adicionados.

👾 Um Loot Diferente para Cada Inimigo

Cada inimigo pode possuir sua própria tabela de drops. Isso torna a exploração mais divertida e incentiva o jogador a enfrentar diferentes tipos de monstros.

Slime
  • 🪙 Moeda
  • 🟢 Gelatina
  • ❤️ Poção Pequena
Esqueleto
  • 🪙 Moeda
  • 🦴 Osso
  • 🗡 Espada Enferrujada
Dragão
  • 💎 Gema
  • 🔥 Escama
  • 👑 Item Lendário

Como cada inimigo possui sua própria variável drops, basta alterar os itens da lista sem modificar a função responsável pelo sorteio.

⚠ Erros Comuns

Esquecer de chamar randomize()

Os números podem seguir sempre a mesma sequência.

As porcentagens não somam 100

Isso pode causar resultados inesperados.

Esquecer de adicionar a cena ao projeto

O preload() irá gerar erro caso o arquivo não exista.

Instanciar o item sem definir a posição

O objeto poderá aparecer na posição (0,0) da cena.

💡 Dicas de Organização

  • Crie uma pasta exclusiva chamada Drops.
  • Separe os itens por categorias.
  • Mantenha nomes consistentes para todas as cenas.
  • Utilize comentários para documentar tabelas grandes.
  • Evite duplicar código entre diferentes inimigos.

🎯 Resultado Final

Ao terminar este tutorial você terá um sistema capaz de:

✅ Escolher um item automaticamente.

✅ Respeitar porcentagens.

✅ Criar o item na posição do inimigo.

✅ Permitir diferentes tabelas de loot.

✅ Crescer facilmente conforme seu projeto evolui.

📖 Próximo Passo

Agora que o sistema de drops está funcionando, o próximo passo é ensinar o jogador a coletar esses itens. No próximo tutorial criaremos um sistema completo de coleta utilizando Area2D, preparando o caminho para a construção de um inventário.

👉 Próximo tutorial recomendado:

📦 Como Criar um Sistema de Coleta de Itens na Godot 4

❓ Perguntas Frequentes (FAQ)

Posso usar esse sistema em jogos 3D?

Sim. A lógica permanece exatamente a mesma. Apenas os nós utilizados para representar os itens mudam.

É possível adicionar centenas de itens?

Sim. Conforme o projeto cresce, você pode substituir a lista manual por arquivos de recursos (Resources) ou bancos de dados personalizados, mantendo a mesma lógica de seleção por peso.

Esse sistema é pesado?

Não. Como a escolha acontece apenas quando um inimigo é derrotado, o impacto no desempenho é praticamente imperceptível.

🎉 Parabéns! Agora você já sabe criar um sistema básico de drops aleatórios na Godot 4. Esse é um excelente ponto de partida para RPGs, jogos de ação, roguelikes e diversos outros gêneros. Continue acompanhando o Pivotando Código para aprender novas técnicas e evoluir seus projetos passo a passo.

Comentários