Como Criar um Sistema Básico de Drops Aleatórios na Godot
📚 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:
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:
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.
📝 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.
🎲 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.
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
- Sorteia um número entre 1 e 100.
- Percorre todos os itens da lista.
- Soma as porcentagens.
- 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:
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.
- 18 é menor que 70.
- Resultado: Moeda.
- 83 é maior que 70.
- 83 é menor que 90.
- Resultado: Poção.
- 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.
💀 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.
🚀 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)
⭐ 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.
- 🪙 Moeda
- 🟢 Gelatina
- ❤️ Poção Pequena
- 🪙 Moeda
- 🦴 Osso
- 🗡 Espada Enferrujada
- 💎 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
Os números podem seguir sempre a mesma sequência.
Isso pode causar resultados inesperados.
O preload() irá gerar erro caso o arquivo não exista.
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:
✅ 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.
📦 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.

Comentários
Postar um comentário
Tem alguma dúvida sobre este código ou sugestão de melhoria? Comente abaixo! Respondo a todas as perguntas técnicas.